Foreword
Preface
- Second Edition
- Who is this book for?
- Typographic conventions
- Please help improve this book!
- Current Published Book Version Information
- About the Author
Introduction
- In the beginning, there were sysadmins
- Modern infrastructure management
- Ansible and Red Hat
- Ansible Examples
- Other resources
Chapter 1 - Getting Started with Ansible
- Ansible and Infrastructure Management
- On snowflakes and shell scripts
- Configuration management
- Installing Ansible
- Fedora/Red Hat Enterprise Linux
- Debian/Ubuntu
- Creating a basic inventory file
- Running your first Ad-Hoc Ansible command
- Summary
Chapter 2 - Local Infrastructure Development: Ansible and Vagrant
- Prototyping and testing with local virtual machines
- Your first local server: Setting up Vagrant
- Using Ansible with Vagrant
- Your first Ansible playbook
- Cleaning Up
- Summary
Chapter 3 - Ad-Hoc Commands
- Conducting an orchestra
- Build infrastructure with Vagrant for testing
- Inventory file for multiple servers
- Your first ad-hoc commands
- Discover Ansible’s parallel nature
- Learning about your environment
- Make changes using Ansible modules
- Configure groups of servers, or individual servers
- Configure the Application servers
- Configure the Database servers
- Make changes to just one server
- Manage users and groups
- Manage packages
- Manage files and directories
- Get information about a file
- Copy a file to the servers
- Retrieve a file from the servers
- Create directories and files
- Delete directories and files
- Run operations in the background
- Update servers asynchronously with asynchronous jobs
- Check log files
- Manage cron jobs
- Deploy a version-controlled application
- Ansible’s SSH connection history
- Paramiko
- OpenSSH (default)
- Faster OpenSSH with Pipelining
- Summary
Chapter 4 - Ansible Playbooks
- Power plays
- Running Playbooks with
ansible-playbook - Limiting playbooks to particular hosts and groups
- Setting user and sudo options with
ansible-playbook - Other options for
ansible-playbook - Real-world playbook: Rocky Linux Node.js app server
- Add extra repositories
- Deploy a Node.js app
- Launch a Node.js app
- Node.js app server summary
- Real-world playbook: Ubuntu LAMP server with Drupal
- Include a variables file, and discover
pre_tasksandhandlers - Basic LAMP server setup
- Configure Apache
- Configure PHP with
lineinfile - Configure MySQL
- Install Composer
- Create a Drupal project with Composer
- Install Drupal with Drush
- Drupal LAMP server summary
- Real-world playbook: Ubuntu server with Solr
- Include a variables file, and more
pre_tasks - Install Java
- Install Apache Solr
- Apache Solr server summary
- Summary
Chapter 5 - Ansible Playbooks - Beyond the Basics
- Handlers
- Environment variables
- Per-task environment variables
- Variables
- Playbook Variables
- Inventory variables
- Registered Variables
- Accessing Variables
- Host and Group variables
- Automatically-loaded
group_varsandhost_vars - Magic variables with host and group variables and information
- Facts (Variables derived from system information)
- Local Facts (Facts.d)
- Ansible Vault - Keeping secrets secret
- Variable Precedence
- If/then/when - Conditionals
- Jinja Expressions, Python built-ins, and Logic
registerwhenchanged_whenandfailed_whenignore_errors- Delegation, Local Actions, and Pauses
- Pausing playbook execution with
wait_for - Running an entire playbook locally
- Prompts
- Tags
- Blocks
- Summary
Chapter 6 - Playbook Organization - Roles, Includes, and Imports
- Imports
- Includes
- Dynamic includes
- Handler imports and includes
- Playbook imports
- Complete includes example
- Roles
- Role scaffolding
- Building your first role
- More flexibility with role vars and defaults
- Other role parts: handlers, files, and templates
- Handlers
- Files and Templates
- Organizing more complex and cross-platform roles
- Ansible Galaxy
- Getting roles from Galaxy
- Using role requirements files to manage dependencies
- A LAMP server in nine lines of YAML
- A Solr server in seven lines of YAML
- Helpful Galaxy commands
- Contributing to Ansible Galaxy
- Summary
Chapter 7 - Ansible Plugins and Content Collections
- Creating our first Ansible Plugin — A Jinja Filter
- The history of Ansible Content Collections
- The Anatomy of a Collection
- Putting our Plugin into a Collection
- Going deeper developing collections
- Collections on Automation Hub and Ansible Galaxy
- Collection version constraints
- Where are collections installed?
- Summary
Chapter 8 - Inventories
- A real-world web application server inventory
- Non-prod environments, separate inventory files
- Inventory variables
host_varsgroup_vars- Ephemeral infrastructure: Dynamic inventory
- Dynamic inventory with DigitalOcean
- DigitalOcean account prerequisites
- Connecting to your DigitalOcean account
- Creating a droplet with Ansible
- DigitalOcean dynamic inventory with
digital_ocean.py - Dynamic inventory with AWS
- Inventory on-the-fly:
add_hostandgroup_by - Multiple inventory sources - mixing static and dynamic inventories
- Creating custom dynamic inventories
- Building a Custom Dynamic Inventory in Python
- Building a Custom Dynamic Inventory in PHP
- Managing a PaaS with a Custom Dynamic Inventory
- Summary
Chapter 9 - Ansible Cookbooks
- Highly-Available Infrastructure with Ansible
- Directory Structure
- Individual Server Playbooks
- Main Playbook for Configuring All Servers
- Getting the required roles
- Vagrantfile for Local Infrastructure via VirtualBox
- Provisioner Configuration: DigitalOcean
- Provisioner Configuration: Amazon Web Services (EC2)
- AWS EC2 Dynamic inventory plugin
- Summary
- ELK Logging with Ansible
- ELK Playbook
- Forwarding Logs from Other Servers
- Summary
- GlusterFS Distributed File System Configuration with Ansible
- Configuring Gluster - Basic Overview
- Configuring Gluster with Ansible
- Summary
- Mac Provisioning with Ansible and Homebrew
- Running Ansible playbooks locally
- Automating Homebrew package and app management
- Configuring macOS through dotfiles
- Summary
Chapter 10 - Deployments with Ansible
- Deployment strategies
- Simple single-server deployments
- Provisioning a Ruby on Rails server
- Deploying a Rails app to the server
- Provisioning and Deploying the Rails App
- Deploying application updates
- Zero-downtime multi-server deployments
- Ensuring zero downtime with
serialand integration tests - Deploying to app servers behind a load balancer
- Capistrano-style and blue-green deployments
- Additional Deployment Features
- Summary
Chapter 11 - Server Security and Ansible
- A brief history of SSH and remote access
- Telnet
- rlogin, rsh and rcp
- SSH
- The evolution of SSH and the future of remote access
- Use secure and encrypted communication
- Disable root login and use
sudo - Remove unused software, open only required ports
- Use the principle of least privilege
- User account configuration
- File permissions
- Update the OS and installed software
- Automating updates
- Automating updates for RHEL systems
- Automating updates for Debian-based systems
- Use a properly-configured firewall
- Configuring a firewall with
ufwon Debian or Ubuntu - Configuring a firewall with
firewalldon Fedora, RHEL and RHEL-derivatives - Make sure log files are populated and rotated
- Monitor logins and block suspect IP addresses
- Use SELinux (Security-Enhanced Linux) or AppArmor
- Summary and further reading
Chapter 12 - Automating Your Automation with Ansible Tower and CI/CD
- Installing Ansible AWX
- Using AWX
- Uninstalling AWX
- Other Tower Features of Note
- Tower Alternatives
- Jenkins CI
- Build a local Jenkins server with Ansible
- Create an Ansible playbook on the Jenkins server
- Create a Jenkins job to run an Ansible Playbook
- Summary
Chapter 13 - Testing and CI for Ansible Content
- Unit, Integration, and Functional Testing
- Debugging and Asserting
- The
debugmodule - The
failandassertmodules - Linting YAML with
yamllint - Performing a
--syntax-check - Linting Ansible content with
ansible-lint - Automated testing and development with Molecule
- Testing a role with Molecule.
- Testing a playbook with Molecule
- Adjusting Molecule to use more flexible test containers
- Verifying a playbook with Molecule
- Adding lint configuration to Molecule
- Molecule Summary
- Running your playbook in check mode
- Automated testing on GitHub using GitHub Actions
- Automated testing in other CI environments
- Real-world examples
- Functional testing using serverspec or testinfra
- Summary
Chapter 14 - Automating HTTPS and TLS Certificates
- Generating Self-Signed Certificates with Ansible
- Idempotent Nginx HTTPS playbook with a self-signed cert
- Automating Let’s Encrypt with Ansible for free Certs
- Use Galaxy roles to get things done faster
- Create the playbook
- Create a server and configure DNS
- Point the playbook inventory at the server
- Access your server over HTTPS!
- Configuring Nginx to proxy HTTP traffic and serve it over HTTPS
- Modify the Nginx configuration to proxy traffic
- Summary
Chapter 15 - Docker and Ansible
- A brief introduction to Docker containers
- Using Ansible to build and manage containers
- Building a Flask app with Ansible and Docker
- Data storage container
- Flask container
- MySQL container
- Ship it!
- Building containers with Ansible from the outside
- Build a Hubot Slack bot container with
ansible_connection: docker - Hubot and Slack
- Building a Docker container with Ansible
- Building the
hubot-slackrole - Building and running the Hubot Slack bot container
- Summary
- Summary
Afterword
Appendix A - Using Ansible on Windows workstations
- Method 1 - Use the Windows Subsystem for Linux
- Installing Ansible inside WSL
- Method 2 - When WSL is not an option
- Prerequisites
- Set up an Ubuntu Linux Virtual Machine
- Log into the Virtual Machine
- Install Ansible
- Summary
Appendix B - Ansible Best Practices and Conventions
- Playbook Organization
- Write comments and use
nameliberally - Include related variables and tasks
- Use Roles to bundle logical groupings of configuration
- Use role defaults and vars correctly
- YAML Conventions and Best Practices
- YAML for Ansible tasks
- Three ways to format Ansible tasks
- Shorthand/one-line (
key=value) - Structured map/multi-line (
key:value) - Folded scalars/multi-line (
>) - Using
|to format multiline variables - Using
ansible-playbook - Use Ansible Tower
- Install Galaxy dependencies local to your playbook
- Discriminate wisely when choosing community dependencies
- Specify
--forksfor playbooks running on > 5 servers - Use Ansible’s Configuration file
- Summary
