Explain the Playbooks and How it works in Ansible
Playbooks
Each playbook is composed of one or more ‘modules’ in a list
Playbooks are divided into many sections like….
• Target Section – Defines the hosts against which playbooks tasks has to be
executed
• Variable Section – Defines variables
• Tasks Section – List of all modules that we need to run, in an order
Our First Playbook
• All sections begin with “-” & its attributes & parameters beneath it
• Indentation is imp, use only spaces & not tabs
• Create a folder(playbooks) & go inside that(vi test.yml)
• test.yml
--- # My First YAML playbook - hosts: demo tasks: - name: Install httpd on server action: yum pkg=httpd state=installed
• Run ansible-playbook to call the playbook
ansible-playbook test.yml
Target Section
- Create a file (vi first.yml)
Example: --- # My First YAML playbook - hosts: demo user: ansible become: yes # yes or no connection: ssh # ssh or paramico gather_facts: yes # yes or no
- Run ansible-playbook to call the playbook
ansible-playbook first.yml
Task Section
Example: --- # My First YAML playbook - hosts: demo user: ansible become: yes connection: ssh tasks: - name: Install HTTPD on centos 7 action: yum name=httpd state=installed - name: Install MYSQL on centos 7 action: yum name=mysql state=installed
- Run ansible-playbook to call the playbook
ansible-playbook first.yml (Remove httpd package)
Variables: Inclusion Types
• Create a section called vars within a playbook
• Put vars above tasks so that we define it first & use it later
--- # My First YAML playbook - hosts: demo user: ansible become: yes connection: ssh vars: pkgname: httpd tasks: - name: Install HTTPD server on centos 7 action: yum name=‘{{pkgname}}’ state=installed (remove httpd package)
Handler Section
• Consists the ability to notify when something happens
• Also call another set of tasks
(Remove apache from node)
Example --- # My First YAML playbook - hosts: demo user: ansible become: yes connection: ssh tasks: - name: Install HTTPD server on centos 7 action: yum name=httpd state=installed notify: restart HTTPD #is called only if the action is ran & successful # handlers: - name: restart HTTPD #has to match the notify name. Otherwise throws error # action: service name=httpd state=restarted (Install httpd in both nodes & don’t start service. Then try running above script. It won’t start service)
• Run ansible-playbook to call the playbook
ansible-playbook first.yml (Remove httpd from node)
Dry Run
• Check whether the playbook is formatted correctly
• Test how the playbook is going to behave without running the
tasks
ansible-playbook webserver.yml --check
Loops
• Often you’ll want to do many things in one task, such as create a lot of users, install a lot of
packages, or repeat a polling step until a certain result is reached
• Example --- # Loop Playbook - hosts: demo user: ansible become: yes connection: ssh tasks: - name: add a list of users user: name='{{ item }}' state=present with_items: - Raj - Sai - Hari
Conditionals
• Few tasks might be needed to execute only on specific scenario
• When statement
Sometimes you will want to skip a particular step on a particular host
• Example 1 --- # When playbook example - hosts: demo user: ansible become: yes connection: ssh tasks: - name: Install apache for debian command: apt-get -y install apache2 when: ansible_os_family == "Debian" - name: Install apache for redhat command: yum -y install httpd when: ansible_os_family == "RedHat“ cat /etc/os-rele*
Vault
• Ansible allows keeping sensitive data such as passwords or keys in encrypted files, rather
than as plaintext in your playbooks
• Creating a new Encrypted playbook (Put —) (Verify file permissions) (Open playbook now)
ansible-vault create playbook.yml
• Edit the Encrypted playbook
ansible-vault edit playbook.yml
• Change the password
ansible-vault rekey playbook.yml
• Decrypt the playbook & verify by opening playbook
ansible-vault decrypt playbook.yml
• Encrypt an existing playbook (verify by opening playbook)
ansible-vault encrypt playbook.yml
Roles (Theory)
• Adding more & more functionality to the playbooks will make it difficult to maintain in a
single file
• We can organize playbooks into a directory structure called roles
• Creating Role Framework (eg: playbook/roles/webserver)
/master.yml playbook/roles/webserver/tasks/main.yml /vars/main.yml /handlers/main.yml
Roles (Lab)
• master.yml (master.yml & roles folder must be in same directory level)
• vi roles/webserver/tasks/main.yml
- name: Install Apache on CentOS yum: pkg=httpd state=latest playbook/roles/webserver/tasks/main.yml /master.yml /ansible-playbook master.yml (command run place)
• This is how we mention Role in play-books
Example Create master.yml (inside playbook folder) --- # master playbook for web servers - hosts: all user: ansible become: yes connection: ssh roles: - webserver ansible-playbook master.yml (run being present in playbook folder) easy_install pip pip install ansible ansible --version ansible demo –b –m file -a “name=myfile state=touch” yum update –y (Take RHEL machine) rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install ansible –y ansibel --version sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm yum install ansible –y ansible –version