├── Books.md ├── Links.md ├── README.md ├── exams └── LPI.Passguaranteed.701-100.v2018-12-16.by.Hector.39q.pdf ├── handouts ├── EnterpriseApplication.md ├── Microservices.md └── TwelveFactorApp.md └── img ├── MonolithsandMicroservices.png ├── attached-resources.png ├── codebase-deploys.png ├── handout-20.png ├── process-types.png └── release.png /Books.md: -------------------------------------------------------------------------------- 1 | 2 | Books 3 | ============== 4 | 5 | * [How to Stand Out in DevOps (pdf)](https://www.lpi.org/sites/default/files/LPI_DevOps_Exam_Guide.pdf) 6 | -------------------------------------------------------------------------------- /Links.md: -------------------------------------------------------------------------------- 1 | # Table of Contents 2 | 3 | 4 | * [Getting Started](#GettingStarted) 5 | * [Modern Software Development](#ModernSoftwareDevelopment) 6 | * [Cloud Components and Platforms](#CloudComponentsandPlatforms) 7 | * [Source Code Management](#SourceCodeManagement) 8 | * [Continuous Delivery](#ContinuousDelivery) 9 | * [Container Basics](#ContainerBasics) 10 | * [Container Orchestration](#ContainerOrchestration) 11 | * [Container Infrastructure](#ContainerInfrastructure) 12 | * [Machine Deployment](#MachineDeployment) 13 | * [Ansible](#Ansible) 14 | * [Other Configuration Management Tools](#OtherConfigurationManagementTools) 15 | * [IT Operations and Monitoring](#ITOperationsandMonitoring) 16 | * [Log Management and Analysis](#LogManagementandAnalysis) 17 | * [Taking the Test](#TakingtheTest) 18 | 19 | 23 | 24 | ------------------------------------------------------------------------ 25 | 26 | ## 1. Getting Started 27 | 28 | - [x] [LPI Blog - DevOps Tools Introduction \#01: Getting 'Getting Started' 29 | Started \| Linux Professional 30 | Institute](https://www.lpi.org/blog/2018/01/09/devops-tools-introduction-01-getting-getting-started-started) 31 | 32 | - [x] [DevOps Tools Engineer Objectives V1 - LPI 33 | Wiki](https://wiki.lpi.org/wiki/DevOps_Tools_Engineer_Objectives_V1) 34 | 35 | ## 2. Modern Software Development 36 | 37 | - [x] [LPI Blog - DevOps Tools Introduction \#Modern Software Development 38 | \| Linux Professional 39 | Institute](https://www.lpi.org/blog/2018/01/16/devops-tools-introduction-02-modern-software-development) 40 | 41 | - [x] [The Twelve-Factor App](https://12factor.net/) [![alt handout-link](img/handout-20.png)](handouts/TwelveFactorApp.md) 42 | 43 | - [x] [Martin Fowler](https://martinfowler.com/) 44 | 45 | - [x] [EnterpriseApplication](https://martinfowler.com/bliki/EnterpriseApplication.html) [![alt handout-link](img/handout-20.png)](handouts/EnterpriseApplication.md) 46 | 47 | - [ ] [Microservices](https://martinfowler.com/articles/microservices.html) 48 | 49 | - [ ] [ImmutableServer](https://martinfowler.com/bliki/ImmutableServer.html) 50 | 51 | - [ ] [Don't start with a 52 | monolith](https://martinfowler.com/articles/dont-start-monolith.html) 53 | 54 | - [ ] [An Introduction to API's -- The RESTful 55 | Web](https://restful.io/an-introduction-to-api-s-cee90581ca1b) 56 | 57 | - [ ] [JSON:API --- A specification for building APIs in 58 | JSON](https://jsonapi.org/) 59 | 60 | - [ ] [OWASP](https://www.owasp.org/index.php/Main_Page) 61 | 62 | - [ ] [Cross-site Scripting (XSS) - 63 | OWASP](https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)) 64 | 65 | - [ ] [SQL Injection - OWASP](https://www.owasp.org/index.php/SQL_Injection) 66 | 67 | - [ ] [Web Service Security Cheat Sheet - 68 | OWASP](https://www.owasp.org/index.php/Web_Service_Security_Cheat_Sheet) 69 | 70 | - [ ] [Authentication Cheat Sheet - 71 | OWASP](https://www.owasp.org/index.php/Authentication_Cheat_Sheet) 72 | 73 | - [ ] [Transport Layer Protection Cheat Sheet - 74 | OWASP](https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet) 75 | 76 | - [ ] [Cross-Site Request Forgery (CSRF) - 77 | OWASP](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)) 78 | 79 | - [ ] [Error Handling, Auditing and Logging - 80 | OWASP](https://www.owasp.org/index.php/Error_Handling,_Auditing_and_Logging) 81 | 82 | - [ ] [OWASP Cheat Sheet Series - 83 | OWASP](https://www.owasp.org/index.php/OWASP_Cheat_Sheet_Series) 84 | 85 | - [ ] [What is the relation between SQL, NoSQL, the CAP theorem and ACID? - 86 | Quora](https://www.quora.com/What-is-the-relation-between-SQL-NoSQL-the-CAP-theorem-and-ACID) 87 | 88 | - [ ] [Manifesto for Agile Software Development](http://agilemanifesto.org/) 89 | 90 | - [ ] [The Agile Fluency 91 | Model](https://martinfowler.com/articles/agileFluency.html) 92 | 93 | - [ ] [Agile Guide](https://martinfowler.com/agile.html) 94 | 95 | - [ ] [DevOpsCulture](https://martinfowler.com/bliki/DevOpsCulture.html) 96 | 97 | ## 3. Cloud Components and Platforms 98 | 99 | - [ ] [LPI Blog - DevOps Tools Introduction \#03: Cloud Components and 100 | Platforms \| Linux Professional 101 | Institute](https://www.lpi.org/blog/2018/01/23/devops-tools-introduction-03-cloud-components-and-platforms) 102 | 103 | - [ ] [What is 104 | OpenStack?](https://www.openstack.org/software/project-navigator/openstack-components#openstack-services) 105 | 106 | - [ ] [Why Cloud Foundry \| Cloud 107 | Foundry](https://www.cloudfoundry.org/why-cloud-foundry/) 108 | 109 | - [ ] [Container Platform Features - Red Hat 110 | OpenShift](https://www.openshift.com/products/features/) 111 | 112 | ## 4. Source Code Management 113 | 114 | - [ ] [LPI Blog - DevOps Tools Introduction \#Source Code Management \| 115 | Linux Professional 116 | Institute](https://www.lpi.org/blog/2018/01/30/devops-tools-introduction-04-source-code-management) 117 | 118 | - [ ] [Resources to learn Git](http://try.github.io/) 119 | 120 | - [ ] [Git - Book](https://git-scm.com/book/en/v2) 121 | 122 | - [ ] [Git - Tagging](https://git-scm.com/book/en/v2/Git-Basics-Tagging) 123 | 124 | - [ ] [Git - Branches in a 125 | Nutshell](https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell) 126 | 127 | - [ ] [Git - Basic Branching and 128 | Merging](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) 129 | 130 | - [ ] [Git - Submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) 131 | 132 | - [ ] [Git - Revision 133 | Selection](https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection) 134 | 135 | - [ ] [Git - Setup and 136 | Config](https://git-scm.com/book/en/v2/Appendix-C%3A-Git-Commands-Setup-and-Config) 137 | 138 | - [ ] [GIT vs SVN - CodeForest](https://www.codeforest.net/git-vs-svn) 139 | 140 | - [ ] [VersionControlTools](https://martinfowler.com/bliki/VersionControlTools.html) 141 | 142 | ## 5. Continuous Delivery 143 | 144 | - [ ] [LPI Blog - DevOps Tools Introduction \#05: Continuous Delivery \| Linux 145 | Professional 146 | Institute](https://www.lpi.org/blog/2018/02/06/devops-tools-introduction-05-continuous-delivery) 147 | 148 | - [ ] [ContinuousDelivery](https://martinfowler.com/bliki/ContinuousDelivery.html) 149 | 150 | - [ ] [Continuous 151 | Integration](https://martinfowler.com/articles/continuousIntegration.html) 152 | 153 | - [ ] [DeploymentPipeline](https://martinfowler.com/bliki/DeploymentPipeline.html) 154 | 155 | - [ ] [CanaryRelease](https://martinfowler.com/bliki/CanaryRelease.html) 156 | 157 | - [ ] [BlueGreenDeployment](https://martinfowler.com/bliki/BlueGreenDeployment.html) 158 | 159 | - [ ] [Blue-green Deployments, A/B Testing, and Canary Releases -- Software 160 | Blog](http://blog.christianposta.com/deploy/blue-green-deployments-a-b-testing-and-canary-releases/) 161 | 162 | - [ ] [Getting started with the Guided 163 | Tour](https://jenkins.io/doc/pipeline/tour/getting-started/) 164 | 165 | - [ ] [Using a Jenkinsfile](https://jenkins.io/doc/book/pipeline/jenkinsfile/) 166 | 167 | - [ ] [Pipeline Syntax](https://jenkins.io/doc/book/pipeline/syntax/) 168 | 169 | - [ ] [Jenkins Plugins](https://plugins.jenkins.io/) 170 | 171 | ## 6. Container Basics 172 | 173 | - [ ] [LPI Blog - DevOps Tools Introduction \#Container Basics \| Linux 174 | Professional 175 | Institute](https://www.lpi.org/blog/2018/02/13/devops-tools-introduction-06-container-basics) 176 | 177 | - [ ] [Play with Docker Classroom](https://training.play-with-docker.com/) 178 | 179 | - [ ] [Docker for IT Pros and System 180 | Administrators](https://training.play-with-docker.com/ops-landing/) 181 | 182 | - [ ] [Introduction to 183 | Containers](https://container.training/intro-fullday.yml.html#1) 184 | 185 | - [ ] [Docker overview \| Docker 186 | Documentation](https://docs.docker.com/engine/docker-overview/) 187 | 188 | - [ ] [Network containers \| Docker 189 | Documentation](https://docs.docker.com/engine/tutorials/networkingcontainers/) 190 | 191 | - [ ] [Manage data in Docker \| Docker 192 | Documentation](https://docs.docker.com/storage/) 193 | 194 | - [ ] [Use volumes \| Docker 195 | Documentation](https://docs.docker.com/storage/volumes/) 196 | 197 | - [ ] [\| Docker 198 | Documentation](https://docs.docker.com/engine/reference/builder/) 199 | 200 | - [ ] [Best practices for writing Dockerfiles \| Docker 201 | Documentation](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) 202 | 203 | - [ ] [docker build \| Docker 204 | Documentation](https://docs.docker.com/engine/reference/commandline/build/) 205 | 206 | - [ ] [Use the Docker command line \| Docker 207 | Documentation](https://docs.docker.com/engine/reference/commandline/cli/) 208 | 209 | ## 7. Container Orchestration 210 | 211 | - [ ] [LPI Blog - DevOps Tools Introduction \#Container Orchestration \| 212 | Linux Professional 213 | Institute](https://www.lpi.org/blog/2018/02/20/devops-tools-introduction-07-container-orchestration) 214 | 215 | - [ ] [Container Orchestration with Docker and 216 | Swarm](https://container.training/swarm-selfpaced.yml.html#1) 217 | 218 | - [ ] [Play with Docker](https://labs.play-with-docker.com/) 219 | 220 | - [ ] [Learn Kubernetes Basics - 221 | Kubernetes](https://kubernetes.io/docs/tutorials/kubernetes-basics/) 222 | 223 | - [ ] [Play with Kubernetes](https://labs.play-with-k8s.com/) 224 | 225 | - [ ] [Picking the Right Solution - 226 | Kubernetes](https://kubernetes.io/docs/setup/pick-right-solution/#hosted-solutions) 227 | 228 | - [ ] [Install Minikube - 229 | Kubernetes](https://kubernetes.io/docs/tasks/tools/install-minikube/) 230 | 231 | - [ ] [Kubernetes 101](https://container.training/kube-halfday.yml.html#1) 232 | 233 | - [ ] [Pod Overview - 234 | Kubernetes](https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/) 235 | 236 | - [ ] [Pods - 237 | Kubernetes](https://kubernetes.io/docs/concepts/workloads/pods/pod/) 238 | 239 | - [ ] [Pod Lifecycle - 240 | Kubernetes](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/) 241 | 242 | - [ ] [Deployments - 243 | Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) 244 | 245 | - [ ] [ReplicaSet - 246 | Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/) 247 | 248 | - [ ] [Services - 249 | Kubernetes](https://kubernetes.io/docs/concepts/services-networking/service/) 250 | 251 | - [ ] [Tasks - Kubernetes](https://kubernetes.io/docs/tasks/) 252 | 253 | ## 8. Container Infrastructure 254 | 255 | - [ ] [LPI Blog - DevOps Tools Introduction \#Container Infrastructure \| 256 | Linux Professional 257 | Institute](https://www.lpi.org/blog/2018/02/27/devops-tools-introduction-08-container-infrastructure) 258 | 259 | - [ ] [Docker Machine Overview \| Docker 260 | Documentation](https://docs.docker.com/machine/overview/) 261 | 262 | - [ ] [Install Docker Machine \| Docker 263 | Documentation](https://docs.docker.com/machine/install-machine/) 264 | 265 | - [ ] [Get started with Docker Machine and a local VM \| Docker 266 | Documentation](https://docs.docker.com/machine/get-started/) 267 | 268 | - [ ] [Use Docker Machine to provision hosts on cloud providers \| Docker 269 | Documentation](https://docs.docker.com/machine/get-started-cloud/) 270 | 271 | - [ ] [Machine concepts and getting help \| Docker 272 | Documentation](https://docs.docker.com/machine/concepts/) 273 | 274 | - [ ] [Docker Machine command-line reference \| Docker 275 | Documentation](https://docs.docker.com/machine/reference/) 276 | 277 | - [ ] [Machine drivers \| Docker 278 | Documentation](https://docs.docker.com/machine/drivers/) 279 | 280 | - [ ] [Overview \| Docker Documentation](https://docs.docker.com/network/) 281 | 282 | - [ ] [Use overlay networks \| Docker 283 | Documentation](https://docs.docker.com/network/overlay/) 284 | 285 | - [ ] [Use bridge networks \| Docker 286 | Documentation](https://docs.docker.com/network/bridge/) 287 | 288 | - [ ] [Use bind mounts \| Docker 289 | Documentation](https://docs.docker.com/storage/bind-mounts/) 290 | 291 | - [ ] [Docker storage drivers \| Docker 292 | Documentation](https://docs.docker.com/storage/storagedriver/select-storage-driver/) 293 | 294 | - [ ] [About storage drivers \| Docker 295 | Documentation](https://docs.docker.com/storage/storagedriver/) 296 | 297 | - [ ] [ClusterHQ/flocker: Container data volume manager for your Dockerized 298 | application](https://github.com/ClusterHQ/flocker) 299 | 300 | - [ ] [coreos/flannel: flannel is a network fabric for containers, designed 301 | for Kubernetes](https://github.com/coreos/flannel) 302 | 303 | - [ ] [CoreOS Container Linux 304 | Documentation](https://coreos.com/os/docs/latest/) 305 | 306 | - [ ] [rkt, a security-minded, standards-based container 307 | engine](https://coreos.com/rkt/) 308 | 309 | - [ ] [Using etcd](https://coreos.com/etcd/) 310 | 311 | - [ ] [Service Discovery with Consul \| Sreenivas Makam\'s 312 | Blog](https://sreeninet.wordpress.com/2016/04/17/service-discovery-with-consul/) 313 | 314 | - [ ] [Docker security \| Docker 315 | Documentation](https://docs.docker.com/engine/security/security/) 316 | 317 | - [ ] [10 layers of Linux container security \| 318 | Opensource.com](https://opensource.com/article/17/10/10-layers-container-security) 319 | 320 | - [ ] [5 tips for securing your Docker containers - 321 | TechRepublic](https://www.techrepublic.com/article/5-tips-for-securing-your-docker-containers/) 322 | 323 | - [ ] [Assessing the Current State of Container Security - The New 324 | Stack](https://thenewstack.io/assessing-the-state-current-container-security/) 325 | 326 | - [ ] [The Ultimate Guide to Container 327 | Security](https://techspective.net/2017/07/20/ultimate-guide-container-security/) 328 | 329 | ## 9. Machine Deployment 330 | 331 | - [ ] [LPI Blog - DevOps Tools Introduction \#Machine Deployment \| Linux 332 | Professional 333 | Institute](https://www.lpi.org/blog/2018/03/06/devops-tools-introduction-09-machine-deployment) 334 | 335 | - [ ] [Getting Started - Vagrant by 336 | HashiCorp](https://www.vagrantup.com/intro/getting-started/index.html) 337 | 338 | - [ ] [Vagrantfile - Vagrant by 339 | HashiCorp](https://www.vagrantup.com/docs/vagrantfile/) 340 | 341 | - [ ] [Provisioning - Vagrant by 342 | HashiCorp](https://www.vagrantup.com/docs/provisioning/) 343 | 344 | - [ ] [File Uploads - Provisioning - Vagrant by 345 | HashiCorp](https://www.vagrantup.com/docs/provisioning/file.html) 346 | 347 | - [ ] [Shell Scripts - Provisioning - Vagrant by 348 | HashiCorp](https://www.vagrantup.com/docs/provisioning/shell.html) 349 | 350 | - [ ] [Ansible - Provisioning - Vagrant by 351 | HashiCorp](https://www.vagrantup.com/docs/provisioning/ansible.html) 352 | 353 | - [ ] [Docker - Provisioning - Vagrant by 354 | HashiCorp](https://www.vagrantup.com/docs/provisioning/docker.html) 355 | 356 | - [ ] [Multi-Machine - Vagrant by 357 | HashiCorp](https://www.vagrantup.com/docs/multi-machine/) 358 | 359 | - [ ] [Modules --- Cloud-Init 18.5 360 | documentation](https://cloudinit.readthedocs.io/en/latest/topics/modules.html) 361 | 362 | - [ ] [Cloud config examples --- Cloud-Init 18.5 363 | documentation](https://cloudinit.readthedocs.io/en/latest/topics/examples.html) 364 | 365 | - [ ] [Install Packer - Getting Started - Packer by 366 | HashiCorp](https://www.packer.io/intro/getting-started/install.html) 367 | 368 | - [ ] [Documentation - Packer by 369 | HashiCorp](https://www.packer.io/docs/index.html) 370 | 371 | - [ ] [Templates - Packer by 372 | HashiCorp](https://www.packer.io/docs/templates/index.html) 373 | 374 | - [ ] [Builders - Packer by 375 | HashiCorp](https://www.packer.io/docs/builders/index.html) 376 | 377 | ## 10. Ansible 378 | 379 | - [ ] [LPI Blog - DevOps Tools Introduction \#Ansible \| Linux 380 | Professional 381 | Institute](https://www.lpi.org/blog/2018/03/13/devops-tools-introduction-10-ansible) 382 | 383 | - [ ] [Installation Guide --- Ansible 384 | Documentation](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) 385 | 386 | - [ ] [Getting Started --- Ansible 387 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/intro_getting_started.html) 388 | 389 | - [ ] [Introduction To Ad-Hoc Commands --- Ansible 390 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html) 391 | 392 | - [ ] [Working with Inventory --- Ansible 393 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html) 394 | 395 | - [ ] [Working With Dynamic Inventory --- Ansible 396 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html) 397 | 398 | - [ ] [Working With Playbooks --- Ansible 399 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks.html) 400 | 401 | - [ ] [Using Variables --- Ansible 402 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html) 403 | 404 | - [ ] [Conditionals --- Ansible 405 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html) 406 | 407 | - [ ] [Loops --- Ansible 408 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html) 409 | 410 | - [ ] [Templating (Jinja2) --- Ansible 411 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html) 412 | 413 | - [ ] [Module Index --- Ansible 414 | Documentation](https://docs.ansible.com/ansible/latest/modules/modules_by_category.html) 415 | 416 | - [ ] [file - Sets attributes of files --- Ansible 417 | Documentation](https://docs.ansible.com/ansible/latest/modules/file_module.html) 418 | 419 | - [ ] [copy - Copies files to remote locations --- Ansible 420 | Documentation](https://docs.ansible.com/ansible/latest/modules/copy_module.html) 421 | 422 | - [ ] [template - Templates a file out to a remote server --- Ansible 423 | Documentation](https://docs.ansible.com/ansible/latest/modules/template_module.html) 424 | 425 | - [ ] [ini\_file - Tweak settings in INI files --- Ansible 426 | Documentation](https://docs.ansible.com/ansible/latest/modules/ini_file_module.html) 427 | 428 | - [ ] [lineinfile - Manage lines in text files --- Ansible 429 | Documentation](https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html) 430 | 431 | - [ ] [patch - Apply patch files using the GNU patch tool --- Ansible 432 | Documentation](https://docs.ansible.com/ansible/latest/modules/patch_module.html) 433 | 434 | - [ ] [replace - Replace all instances of a particular string in a file using 435 | a back-referenced regular expression. --- Ansible 436 | Documentation](https://docs.ansible.com/ansible/latest/modules/replace_module.html) 437 | 438 | - [ ] [user - Manage user accounts --- Ansible 439 | Documentation](https://docs.ansible.com/ansible/latest/modules/user_module.html) 440 | 441 | - [ ] [group - Add or remove groups --- Ansible 442 | Documentation](https://docs.ansible.com/ansible/latest/modules/group_module.html) 443 | 444 | - [ ] [command - Executes a command on a remote node --- Ansible 445 | Documentation](https://docs.ansible.com/ansible/latest/modules/command_module.html) 446 | 447 | - [ ] [shell - Execute commands in nodes. --- Ansible 448 | Documentation](https://docs.ansible.com/ansible/latest/modules/shell_module.html) 449 | 450 | - [ ] [service - Manage services --- Ansible 451 | Documentation](https://docs.ansible.com/ansible/latest/modules/service_module.html) 452 | 453 | - [ ] [systemd - Manage services --- Ansible 454 | Documentation](https://docs.ansible.com/ansible/latest/modules/systemd_module.html) 455 | 456 | - [ ] [cron - Manage cron.d and crontab entries --- Ansible 457 | Documentation](https://docs.ansible.com/ansible/latest/modules/cron_module.html) 458 | 459 | - [ ] [apt - Manages apt-packages --- Ansible 460 | Documentation](https://docs.ansible.com/ansible/latest/modules/apt_module.html) 461 | 462 | - [ ] [debconf - Configure a .deb package --- Ansible 463 | Documentation](https://docs.ansible.com/ansible/latest/modules/debconf_module.html) 464 | 465 | - [ ] [yum - Manages packages with the yum package manager --- Ansible 466 | Documentation](https://docs.ansible.com/ansible/latest/modules/yum_module.html) 467 | 468 | - [ ] [git - Deploy software (or files) from git checkouts --- Ansible 469 | Documentation](https://docs.ansible.com/ansible/latest/modules/git_module.html) 470 | 471 | - [ ] [debug - Print statements during execution --- Ansible 472 | Documentation](https://docs.ansible.com/ansible/latest/modules/debug_module.html) 473 | 474 | - [ ] [Ansible Vault --- Ansible 475 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/vault.html) 476 | 477 | - [ ] [Ansible Galaxy --- Ansible 478 | Documentation](https://docs.ansible.com/ansible/latest/reference_appendices/galaxy.html) 479 | 480 | - [ ] [Ansible Galaxy](https://galaxy.ansible.com/list#/roles) 481 | 482 | - [ ] [Windows Guides --- Ansible 483 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/windows.html) 484 | 485 | - [ ] [Ansible Galaxy](https://galaxy.ansible.com/home) 486 | 487 | - [ ] [BSD Support --- Ansible 488 | Documentation](https://docs.ansible.com/ansible/latest/user_guide/intro_bsd.html) 489 | 490 | - [ ] [Ansible Container - Container Automation with 491 | Ansible](https://www.ansible.com/integrations/containers/ansible-container) 492 | 493 | ## 11. Other Configuration Management Tools 494 | 495 | - [ ] [LPI Blog - DevOps Tools Introduction \#11: Other Configuration 496 | Management Tools \| Linux Professional 497 | Institute](https://www.lpi.org/blog/2018/03/20/devops-tools-introduction-11-other-configuration-management-tools) 498 | 499 | - [ ] [Learn Chef](https://learn.chef.io/#/) 500 | 501 | - [ ] [Learn the Chef basics - Modules \| Learn 502 | Chef](https://learn.chef.io/modules/learn-the-basics#/) 503 | 504 | - [ ] [Manage a node with Chef server - Modules \| Learn 505 | Chef](https://learn.chef.io/modules/manage-a-node-chef-server#/) 506 | 507 | - [ ] [Create a web app cookbook - Modules \| Learn 508 | Chef](https://learn.chef.io/modules/create-a-web-app-cookbook#/) 509 | 510 | - [ ] [Puppet 4.10 reference manual - Puppet (PE and open source) 4.10 \| 511 | Puppet](https://puppet.com/docs/puppet/4.10/index.html) 512 | 513 | - [ ] [Language: Basics - Puppet (PE and open source) 5.4 \| 514 | Puppet](https://puppet.com/docs/puppet/5.4/lang_summary.html) 515 | 516 | - [ ] [Puppet\'s commands - Puppet (PE and open source) 5.4 \| 517 | Puppet](https://puppet.com/docs/puppet/5.4/services_commands.html) 518 | 519 | - [ ] [Overview of Puppet\'s architecture - Puppet (PE and open source) 5.4 \| 520 | Puppet](https://puppet.com/docs/puppet/5.4/architecture.html) 521 | 522 | - [ ] [Quick start » Intro for \*nix users - Puppet (PE and open source) 5.4 523 | \| Puppet](https://puppet.com/docs/puppet/5.4/quick_start.html) 524 | 525 | - [ ] [Quick Start » Essential configuration - Puppet (PE and open source) 5.4 526 | \| 527 | Puppet](https://puppet.com/docs/puppet/5.4/quick_start_essential_config.html) 528 | 529 | - [ ] [Self-paced Training - Puppet 530 | Training](https://learn.puppet.com/category/self-paced-training) 531 | 532 | - [ ] [Core types cheat sheet - Puppet (PE and open source) 6.2 \| 533 | Puppet](https://puppet.com/docs/puppet/6.2/cheatsheet_core_types.html) 534 | 535 | - [ ] [Module cheat sheet - Puppet (PE and open source) 6.2 \| 536 | Puppet](https://puppet.com/docs/puppet/6.2/cheatsheet_module.html) 537 | 538 | ## 12. IT Operations and Monitoring 539 | 540 | - [ ] [LPI Blog - DevOps Tools Introduction \#IT Operations and Monitoring 541 | \| Linux Professional 542 | Institute](https://www.lpi.org/blog/2018/03/27/devops-tools-introduction-12-it-operations-and-monitoring) 543 | 544 | - [ ] [Installation \| 545 | Prometheus](https://prometheus.io/docs/prometheus/latest/installation/) 546 | 547 | - [ ] [Getting started \| 548 | Prometheus](https://prometheus.io/docs/prometheus/latest/getting_started/) 549 | 550 | - [ ] [prometheus/node\_exporter: Exporter for machine 551 | metrics](https://github.com/prometheus/node_exporter) 552 | 553 | - [ ] [prometheus/pushgateway: Push acceptor for ephemeral and batch 554 | jobs.](https://github.com/prometheus/pushgateway) 555 | 556 | - [ ] [Exporters and integrations \| 557 | Prometheus](https://prometheus.io/docs/instrumenting/exporters/) 558 | 559 | - [ ] [Alertmanager \| 560 | Prometheus](https://prometheus.io/docs/alerting/alertmanager/) 561 | 562 | - [ ] [Configuration \| 563 | Prometheus](https://prometheus.io/docs/alerting/configuration/) 564 | 565 | - [ ] [Grafana \| 566 | Prometheus](https://prometheus.io/docs/visualization/grafana/) 567 | 568 | - [ ] [Getting Started \| Grafana 569 | Documentation](http://docs.grafana.org/guides/getting_started/) 570 | 571 | - [ ] [RED Method for Prometheus - 3 Key Metrics for Microservices Monitoring 572 | DZone Performance](https://dzone.com/articles/red-method-for-prometheus-3-key-metrics-for-micros) 573 | 574 | - [ ] [Introduction to Performance Monitoring Metrics \| 575 | SmartBear](https://smartbear.com/learn/performance-monitoring/metrics-to-measure/) 576 | 577 | - [ ] [Introduction to Monitoring Microservices with 578 | Prometheus](https://winderresearch.com/introduction-to-monitoring-microservices-with-prometheus/) 579 | 580 | - [ ] [Monitoring Microservices with Prometheus - Container 581 | Solutions](https://container-solutions.com/microservice-monitoring-with-prometheus/) 582 | 583 | - [ ] [Buffer overflow attack - 584 | OWASP](https://www.owasp.org/index.php/Buffer_overflow_attack) 585 | 586 | - [ ] [Brute force attack - 587 | OWASP](https://www.owasp.org/index.php/Brute_force_attack) 588 | 589 | - [ ] [Denial of Service - 590 | OWASP](https://www.owasp.org/index.php/Denial_of_Service) 591 | 592 | - [ ] [Category:Attack - 593 | OWASP](https://www.owasp.org/index.php/Category:Attack) 594 | 595 | - [ ] [Security threats and their mitigation in infrastructure as a service - 596 | ScienceDirect](https://www.sciencedirect.com/science/article/pii/S2213020916301306) 597 | 598 | - [ ] [Explain How Firewalls Work to Me \| 599 | AlienVault](https://www.alienvault.com/blogs/security-essentials/explain-how-firewalls-work-to-me) 600 | 601 | - [ ] [Virtualization and Cloud 602 | Computing](https://resources.infosecinstitute.com/virtualization-cloud-computing/) 603 | 604 | ## 13. Log Management and Analysis 605 | 606 | - [ ] [LPI Blog - DevOps Tools Introduction \#Log Management and Analysis 607 | \| Linux Professional 608 | Institute](https://www.lpi.org/blog/2018/04/03/devops-tools-introduction-13-log-management-and-analysis) 609 | 610 | - [ ] [Powering Data Search, Log Analysis, Analytics \| 611 | Elastic](https://www.elastic.co/products) 612 | 613 | - [ ] [Logstash Reference 6.6 | Elastic](https://www.elastic.co/guide/en/logstash/current/index.html) 614 | 615 | - [ ] [Logstash Introduction \| Logstash Reference 6.6 | Elastic](https://www.elastic.co/guide/en/logstash/current/introduction.html) 616 | 617 | - [ ] [Getting Started with Logstash \| Logstash Reference 6.6 | Elastic](https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html) 618 | 619 | - [ ] [How Logstash Works \| Logstash Reference 6.6 | Elastic](https://www.elastic.co/guide/en/logstash/current/pipeline.html) 620 | 621 | - [ ] [elastic/stack-docker: The Elastic Stack, on Docker, right 622 | now.](https://github.com/elastic/stack-docker) 623 | 624 | - [ ] [elk-docker](https://elk-docker.readthedocs.io/) 625 | 626 | - [ ] [Configuring Logstash \| Logstash Reference 6.6| 627 | Elastic](https://www.elastic.co/guide/en/logstash/current/configuration.html) 628 | 629 | - [ ] [Filebeat Reference 6.6 | 630 | Elastic](https://www.elastic.co/guide/en/beats/filebeat/current/index.html) 631 | 632 | - [ ] [Filebeat overview \| Filebeat Reference 6.6 | 633 | Elastic](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html) 634 | 635 | - [ ] [Getting Started With Filebeat \| Filebeat Reference 6.6 | 636 | Elastic](https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html) 637 | 638 | - [ ] [Beats input plugin \| Logstash Reference 6.6 | 639 | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html) 640 | 641 | - [ ] [What is Syslog? Linux & Windows Syslog Server 642 | Options](https://www.networkmanagementsoftware.com/what-is-syslog/) 643 | 644 | - [ ] [syslog.conf(5): syslogd config file - Linux man 645 | page](https://linux.die.net/man/5/syslog.conf) 646 | 647 | - [ ] [Syslog input plugin \| Logstash Reference 6.6 | 648 | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-syslog.html) 649 | 650 | - [ ] [Output plugins \| Logstash Reference 6.6 | 651 | Elastic](https://www.elastic.co/guide/en/logstash/current/output-plugins.html) 652 | 653 | - [ ] [Filter plugins \| Logstash Reference 6.6 | 654 | Elastic](https://www.elastic.co/guide/en/logstash/current/filter-plugins.html) 655 | 656 | - [ ] [Grok filter plugin \| Logstash Reference 6.6 | 657 | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html) 658 | 659 | - [ ] [Email output plugin \| Logstash Reference 6.6 | 660 | Elastic](https://www.elastic.co/guide/en/logstash/current/plugins-outputs-email.html) 661 | 662 | - [ ] [Getting Started \| Elasticsearch Reference 6.6 | 663 | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html) 664 | 665 | - [ ] [What is an Elasticsearch Index? \| 666 | Elastic](https://www.elastic.co/blog/what-is-an-elasticsearch-index) 667 | 668 | - [ ] [Retiring Data \| Elasticsearch: The Definitive Guide 2.x | 669 | Elastic](https://www.elastic.co/guide/en/elasticsearch/guide/current/retiring-data.html) 670 | 671 | - [ ] [Kibana User Guide 6.6 | 672 | Elastic](https://www.elastic.co/guide/en/kibana/current/index.html) 673 | 674 | - [ ] [Discover \| Kibana User Guide 6.6 | 675 | Elastic](https://www.elastic.co/guide/en/kibana/current/discover.html) 676 | 677 | - [ ] [Visualize \| Kibana User Guide 6.6 | 678 | Elastic](https://www.elastic.co/guide/en/kibana/current/visualize.html) 679 | 680 | - [ ] [Dashboard \| Kibana User Guide 6.6 | 681 | Elastic](https://www.elastic.co/guide/en/kibana/current/dashboard.html) 682 | 683 | - [ ] [Logging best Practices 684 | -](https://logmatic.io/blog/beyond-application-monitoring-discover-logging-best-practices/) 685 | 686 | - [ ] [9 Logging Best Practices Based on Hands-on 687 | Experience](https://www.loomsystems.com/blog/single-post/2017/01/26/9-logging-best-practices-based-on-hands-on-experience) 688 | 689 | - [ ] [30 best practices for logging at scale \| Log Analysis \| Log 690 | Monitoring by 691 | Loggly](https://www.loggly.com/blog/30-best-practices-logging-scale/) 692 | 693 | ## 14. Taking the Test 694 | 695 | - [ ] [LPI Blog - DevOps Tools Introduction \#Taking the Test \| Linux 696 | Professional 697 | Institute](https://www.lpi.org/blog/2018/04/10/devops-tools-introduction-14-taking-test) 698 | 699 | - [ ] [Periodic Table of DevOps 700 | Tools](https://xebialabs.com/periodic-table-of-devops-tools/) 701 | 702 | - [ ] [Our Certification Development Standards \| Linux Professional 703 | Institute](https://www.lpi.org/value-of-certification/our-certification-development-standards) 704 | 705 | - [ ] [Getting started \| Linux Professional 706 | Institute](https://www.lpi.org/our-certifications/getting-started) 707 | 708 | - [ ] [DevOps Tools Engineer Exam 709 | Voucher](https://www.lpimarketplace.com/product-p/701-100_p.htm) 710 | 711 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | LPI DevOps study resources 3 | ============== 4 | 5 | Here I place the resource links I found useful on LPI blog studying for [Exam 701: DevOps Tools Engineer](https://www.lpi.org/our-certifications/exam-701-objectives). There are checkboxes for each topic that being checked when I finish studying that topic. Also I add my handouts after studying each link that can be accessed by clicking on this icon ![alt handout-link](img/handout-20.png). 6 | 7 | Feel free to contribute and add resources. 8 | 9 | ------------------------------------------------------------------------ 10 | 11 | ### Lets Get Started 12 | 13 | * [Getting Started](Links.md#GettingStarted) 14 | * [Modern Software Development](Links.md#ModernSoftwareDevelopment) 15 | * [Cloud Components and Platforms](Links.md#CloudComponentsandPlatforms) 16 | * [Source Code Management](Links.md#SourceCodeManagement) 17 | * [Continuous Delivery](Links.md#ContinuousDelivery) 18 | * [Container Basics](Links.md#ContainerBasics) 19 | * [Container Orchestration](Links.md#ContainerOrchestration) 20 | * [Container Infrastructure](Links.md#ContainerInfrastructure) 21 | * [Machine Deployment](Links.md#MachineDeployment) 22 | * [Ansible](Links.md#Ansible) 23 | * [Other Configuration Management Tools](Links.md#OtherConfigurationManagementTools) 24 | * [IT Operations and Monitoring](Links.md#ITOperationsandMonitoring) 25 | * [Log Management and Analysis](Links.md#LogManagementandAnalysis) 26 | * [Taking the Test](Links.md#TakingtheTest) 27 | * [Books](Books.md) 28 | 29 | -------------------------------------------------------------------------------- /exams/LPI.Passguaranteed.701-100.v2018-12-16.by.Hector.39q.pdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Account Suspended 10 | 11 | 100 | 101 | 102 |
103 | 104 | Account Suspended 105 | 106 |
107 |
108 |
109 |
110 |
111 | Compte suspendu . 112 | TEL: 0550.63.00.20 113 |
114 |
115 | Contact your hosting provider for more information. 116 |
117 |
118 |
119 |
120 | 121 | 122 | -------------------------------------------------------------------------------- /handouts/EnterpriseApplication.md: -------------------------------------------------------------------------------- 1 | ## Enterprise Application 2 | 3 | Enterprise applications usually have **a lot of persistent data**, usually managed by some kind of database management system. Usually this database is relational, but increasingly we're seeing NoSQL alternatives. This data will usually be longer lasting and more valuable than the applications that process it. 4 | 5 | This **data is accessed and manipulated concurrently**. The numbers vary a lot, in-house applications may have a few tens of users, but customer-facing web applications can easily have tens of thousands. 6 | 7 | With so much data, enterprise applications have **a lot of user interface screens** to handle it. 8 | 9 | You'll need to **integrate with other enterprise applications**. These systems are built by a wide range of teams, some from vendors who sell to many customers, others built internally just for your organization. 10 | 11 | Even when different applications access the same data there is considerable **conceptual dissonance** between them, a customer may mean something quite different to the sales organization than it does to technical support. 12 | 13 | If you want to change business rules you need sixty-seven meetings and three vice-presidents retiring, Do this a thousand times and you have the **complex business "illogic"** that lies in the heart of many enterprise applications. -------------------------------------------------------------------------------- /handouts/Microservices.md: -------------------------------------------------------------------------------- 1 | ## Microservices 2 | 3 | The microservice architectural style is **an approach to developing a single application as a suite of small services**, each running in its own process and communicating with lightweight mechanisms, often an **HTTP resource API**. These services are built around business capabilities and independently deployable by fully automated deployment machinery. 4 | 5 | ### Monolithic application 6 | 7 | Monolithic application built as a single unit. Enterprise Applications are often built in **three main parts**: 8 | 9 | * **a client-side user interface** (consisting of HTML pages and javascript running in a browser on the user's machine) 10 | 11 | * **a database** (consisting of many tables inserted into a common, and usually relational, database management system), 12 | 13 | * **a server-side application** (handling HTTP requests, executing domain logic, retrieving and updating data from the database) 14 | 15 | This server-side application is a *monolith* - a **single logical executable**. Any changes to the system involve building and deploying a new version of the server-side application. You can horizontally scale the monolith by running many instances behind a load-balancer. 16 | 17 | * Change cycles are tied together 18 | * A change made to a small part of the application, requires the entire monolith to be rebuilt and deployed. 19 | * Over time it's often hard to keep a good modular structure, 20 | * Scaling requires scaling of the entire application rather than parts of it that require greater resource. 21 | 22 | ![codebase deploys](../img/MonolithsandMicroservices.png) 23 | 24 | ### Characteristics of a Microservice Architecture 25 | 26 | There isn't a formal definition of the microservices architectural style, but we can attempt to describe what we see as common characteristics for architectures. 27 | 28 | #### Componentization via Services 29 | 30 | -------------------------------------------------------------------------------- /handouts/TwelveFactorApp.md: -------------------------------------------------------------------------------- 1 | ## The Twelve-Factor App 2 | 3 | The twelve-factor app is a methodology for building software-as-a-service apps that: 4 | * Use **declarative** formats for setup automation, to minimize time and cost 5 | * Have a **clean contract** with the underlying operating system, offering **maximum portability** 6 | * Are suitable for **deployment** on modern **cloud platforms** 7 | * **Minimize divergence** between development and production 8 | * And can **scale up** without significant changes to tooling, architecture, or development practices. 9 | 10 | ### 1. Codebase 11 | > One codebase tracked in revision control, many deploys 12 | 13 | * If there are multiple codebases, it’s not an app – it’s a distributed system. 14 | * Multiple apps sharing the same code is a violation of twelve-factor 15 | * There is only one codebase per app, but there will be many deploys of the app 16 | 17 | ![codebase deploys](../img/codebase-deploys.png) 18 | 19 | ### 2. Dependencies 20 | > Explicitly declare and isolate dependencies 21 | 22 | * Programming languages offer packaging system for distributing support libraries, such as **CPAN** for Perl or **Rubygems** for Ruby. 23 | * A twelve-factor app never relies on implicit existence of system-wide packages. 24 | 25 | | languages | declaration | isolation | 26 | |------------|--------------|-----------------| 27 | | ruby | Gemfile | bundle exec | 28 | | python | pip | virtualenv | 29 | | C | autoconf | static linking | 30 | 31 | ### 3. Config 32 | > Store config in the environment 33 | 34 | 35 | * Resource handles to the database, Memcached, and other backing services 36 | * Credentials to external services such as Amazon S3 or Twitter 37 | * Per-deploy values such as the canonical hostname for the deploy 38 | 39 | A litmus test for whether an app has all config correctly factored out of the code is whether the codebase could be made open source at any moment, without compromising any credentials. 40 | 41 | Another approach to config is the use of config files which are not checked into revision control, such as `config/database.yml` in Rails. Further, these formats tend to be language- or framework-specific. 42 | 43 | The twelve-factor app stores config in **environment variables** (often shortened to *env vars* or *env*). 44 | 45 | They are a language- and OS-agnostic standard. 46 | 47 | ### 4. Backing services 48 | > Treat backing services as attached resources 49 | 50 | A backing service is any service the app consumes over the network as part of its normal operation. Examples include: 51 | 52 | * datastores (such as MySQL or CouchDB) 53 | * messaging/queueing systems (such as RabbitMQ or Beanstalkd) 54 | * SMTP services for outbound email (such as Postfix) 55 | * and caching systems (such as Memcached). 56 | 57 | In addition to these locally-managed services, the app may also have services provided and managed by third parties. Examples include: 58 | * SMTP services (such as Postmark) 59 | * metrics-gathering services (such as New Relic or Loggly) 60 | * binary asset services (such as Amazon S3) 61 | * and even API-accessible consumer services (such as Twitter, Google Maps, or Last.fm). 62 | 63 | **The code for a twelve-factor app makes no distinction between local and third party services.** To the app, both are attached resources, accessed via a URL or other locator/credentials stored in the config. 64 | 65 | The twelve-factor app treats these databases as attached resources, which indicates their loose coupling to the deploy they are attached to. 66 | 67 | ![attached resources](../img/attached-resources.png) 68 | 69 | ### 5. Build, release, run 70 | > Strictly separate build and run stages 71 | 72 | A codebase is transformed into a (non-development) deploy through three stages: 73 | 74 | * The **build stage** is a transform which converts a code repo into an executable bundle known as a build. Using a version of the code at a commit specified by the deployment process, the build stage fetches vendors dependencies and compiles binaries and assets. 75 | * The **release stage** takes the build produced by the build stage and combines it with the deploy’s current config. The resulting release contains both the build and the config and is ready for immediate execution in the execution environment. 76 | * The **run stage** (also known as “runtime”) runs the app in the execution environment, by launching some set of the app’s processes against a selected release. 77 | 78 | ![releases](../img/release.png) 79 | 80 | **The twelve-factor app uses strict separation between the build, release, and run stages.** For example, it is impossible to make changes to the code at runtime, since there is no way to propagate those changes back to the build stage. 81 | 82 | Every release should always have a unique release ID, Releases are an append-only ledger and a release cannot be mutated once it is created. Any change must create a new release. 83 | 84 | ### 6. Processes 85 | > Execute the app as one or more stateless processes 86 | 87 | In the simplest case, the code is a stand-alone script, the execution environment is a developer’s local laptop with an installed language runtime, and the process is launched via the command line (for example, `python my_script.py`). 88 | 89 | **Twelve-factor processes are stateless and share-nothing.** Any data that needs to persist must be stored in a stateful backing service, typically a database. 90 | 91 | The twelve-factor app never assumes that anything cached in memory or on disk will be available on a future request or job. 92 | 93 | Some web systems rely on “sticky sessions” – that is, caching user session data in memory of the app’s process and expecting future requests from the same visitor to be routed to the same process. **Sticky sessions are a violation of twelve-factor and should never be used or relied upon.** Session state data is a good candidate for a datastore that offers time-expiration, such as *Memcached* or *Redis*. 94 | 95 | ### 7. Port binding 96 | > Export services via port binding 97 | 98 | **The twelve-factor app is completely self-contained** and does not rely on runtime injection of a webserver into the execution environment to create a web-facing service. The web app **exports HTTP as a service by binding to a port**, and listening to requests coming in on that port. 99 | 100 | In deployment, a routing layer handles routing requests from a public-facing hostname to the port-bound web processes. 101 | 102 | This is typically implemented by using **dependency declaration** to add a webserver library to the app, such as *Tornado* for Python, *Thin* for Ruby, or *Jetty* for Java and other JVM-based languages. This happens entirely in user space, that is, within the app’s code. The contract with the execution environment is binding to a port to serve requests. 103 | 104 | Note also that the port-binding approach means that one app can become the backing service for another app, by providing the URL to the backing app as a resource handle in the config for the consuming app. 105 | 106 | ### 8. Concurrency 107 | > Scale out via the process model 108 | 109 | **In the twelve-factor app, processes are a first class citizen.** Processes in the twelve-factor app take strong cues from the unix process model for running service daemons. Using this model, the developer can architect their app to handle diverse workloads by assigning each type of work to a process type. For example, HTTP requests may be handled by a web process, and long-running background tasks handled by a worker process. 110 | 111 | ![releases](../img/process-types.png) 112 | 113 | Twelve-factor app processes should never daemonize or write PID files. Instead, rely on the operating system’s process manager (such as systemd) to manage output streams, respond to crashed processes, and handle user-initiated restarts and shutdowns. 114 | 115 | ### 9. Disposability 116 | > Maximize robustness with fast startup and graceful shutdown 117 | 118 | **The twelve-factor app’s processes are disposable, meaning they can be started or stopped at a moment’s notice.** This facilitates fast elastic scaling, rapid deployment of code or config changes, and robustness of production deploys. 119 | 120 | Short startup time provides more agility for the release process and scaling up; and it aids robustness, because the process manager can more easily move processes to new physical machines when warranted. 121 | 122 | Processes **shut down gracefully when they receive a SIGTERM signal** from the process manager. For a web process, graceful shutdown is achieved by ceasing to listen on the service port (thereby refusing any new requests), allowing any current requests to finish, and then exiting. 123 | 124 | For a worker process, graceful shutdown is achieved by returning the current job to the work queue. For example, on RabbitMQ the worker can send a `NACK`. 125 | 126 | Processes should also be **robust against sudden death**, in the case of a failure in the underlying hardware. While this is a much less common occurrence than a graceful shutdown with `SIGTERM`, it can still happen. A recommended approach is use of a robust queueing backend, such as Beanstalkd, that returns jobs to the queue when clients disconnect or time out. 127 | 128 | ### 10. Dev/prod parity 129 | > Keep development, staging, and production as similar as possible 130 | 131 | Historically, there have been substantial gaps between development (a developer making live edits to a local deploy of the app) and production (a running deploy of the app accessed by end users). These gaps manifest in three areas: 132 | 133 | * **The time gap:** A developer may work on code that takes days, weeks, or even months to go into production. 134 | * **The personnel gap:** Developers write code, ops engineers deploy it. 135 | * **The tools gap:** Developers may be using a stack like Nginx, SQLite, and OS X, while the production deploy uses Apache, MySQL, and Linux. 136 | 137 | **The twelve-factor app is designed for continuous deployment by keeping the gap between development and production small.** 138 | 139 | | | Traditional app | Twelve-factor app | 140 | |------------|--------------|-----------------| 141 | | **Time between deploys** | Weeks | Hours | 142 | | **Code authors vs code deployers** | Different people | Same people | 143 | | **Dev vs production environments** | Divergent | As similar as possible | 144 | 145 | Developers sometimes find great appeal in using a lightweight backing service in their local environments, while a more serious and robust backing service will be used in production. For example, using SQLite locally and PostgreSQL in production; or local process memory for caching in development and Memcached in production. **The twelve-factor developer resists the urge to use different backing services between development and production.** 146 | 147 | ### 11. Logs 148 | > Treat logs as event streams 149 | 150 | Logs provide visibility into the behavior of a running app. In server-based environments they are commonly written to a file on disk (a “logfile”); but this is only an output format. 151 | 152 | Logs are the stream of aggregated, time-ordered events collected from the output streams of all running processes and backing services. 153 | 154 | **A twelve-factor app never concerns itself with routing or storage of its output stream.** 155 | 156 | In staging or production deploys, each process’ stream will be captured by the execution environment, collated together with all other streams from the app, and routed to one or more final destinations for viewing and long-term archival. These archival destinations are not visible to or configurable by the app, and instead are completely managed by the execution environment. Open-source log routers (such as Logplex and Fluentd) are available for this purpose. 157 | 158 | These systems allow for great power and flexibility for introspecting an app’s behavior over time, including: 159 | 160 | * Finding specific events in the past. 161 | * Large-scale graphing of trends (such as requests per minute). 162 | * Active alerting according to user-defined heuristics (such as an alert when the quantity of errors per minute exceeds a certain threshold). 163 | 164 | ### 12. Admin processes 165 | > Run admin/management tasks as one-off processes 166 | 167 | Developers will often wish to do one-off administrative or maintenance tasks for the app, such as: 168 | 169 | * Running database migrations (e.g. `manage.py migrate` in Django, `rake db:migrate` in Rails). 170 | * Running a console (also known as a REPL shell) to run arbitrary code or inspect the app’s models against the live database. Most languages provide a REPL by running the interpreter without any arguments (e.g. `python` or `perl`) or in some cases have a separate command (e.g. `irb` for Ruby, `rails console` for Rails). 171 | * Running one-time scripts committed into the app’s repo (e.g. `php scripts/fix_bad_records.php`). 172 | 173 | One-off admin processes should be run in an identical environment as the regular long-running processes of the app. They run against a release, using the same codebase and config as any process run against that release. Admin code must ship with application code to avoid synchronization issues. 174 | 175 | Twelve-factor strongly favors languages which provide a REPL shell out of the box, and which make it easy to run one-off scripts. In a local deploy, developers invoke one-off admin processes by a direct shell command inside the app’s checkout directory. In a production deploy, developers can use ssh or other remote command execution mechanism provided by that deploy’s execution environment to run such a process. -------------------------------------------------------------------------------- /img/MonolithsandMicroservices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyguy/lpi-devops-study/ca47f351055a89253bc0943fc7fad1b2047edf2c/img/MonolithsandMicroservices.png -------------------------------------------------------------------------------- /img/attached-resources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyguy/lpi-devops-study/ca47f351055a89253bc0943fc7fad1b2047edf2c/img/attached-resources.png -------------------------------------------------------------------------------- /img/codebase-deploys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyguy/lpi-devops-study/ca47f351055a89253bc0943fc7fad1b2047edf2c/img/codebase-deploys.png -------------------------------------------------------------------------------- /img/handout-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyguy/lpi-devops-study/ca47f351055a89253bc0943fc7fad1b2047edf2c/img/handout-20.png -------------------------------------------------------------------------------- /img/process-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyguy/lpi-devops-study/ca47f351055a89253bc0943fc7fad1b2047edf2c/img/process-types.png -------------------------------------------------------------------------------- /img/release.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pyguy/lpi-devops-study/ca47f351055a89253bc0943fc7fad1b2047edf2c/img/release.png --------------------------------------------------------------------------------