DevOps Classroom Series – 16/Nov/2019

Ansible Files


  • In DevOps Pipelines, it will necessary to download/copy the package built by build system (Maven, Msbuild, make) to the Node.
  • To Download the file into node use module get_url
  • To copy the file from ACS to node use copy
  • Now lets use the same lamp playbook and create a file called as info.php with following contnets
  • Now lets add the copy module to the existing playbook
- hosts: webservers
  become: yes
    - name: fail if it is unsupported os
        msg: This playbook is supported only on redhat and debain variants
      when: ansible_facts['os_family'] != "RedHat" and ansible_facts['os_family'] != "Debian"
    - name: install apache
        name: "{{ package_name }}"
        state: present
        - restart and enable apache
    - name: printing php modules
        var: php_modules
    - name: install php modules
        name: "{{ item }}"
        state: present
      loop: "{{ php_modules }}"
    - name: copy the home page
        src: info.php
        dest: /var/www/html/info.php
        - restart and enable apache
    #- name: Download info php page
    #  get_url:
    #    url:
    #    dest: /var/www/html/info.php
    #  notify:
    #    - restart and enable apache
    - name: restart and enable apache
        name: "{{ package_name }}"
        enabled: yes
        state: restarted


  • Create a file called as Readme.txt in the root folder.
  • The contents of the file should be
Create by Ansible
Os family is <os >
Os distribution is <distribution>
version is <version>

Solution to above Exercise

  • Whenever you have dynamic values, ansible has a templating system which is widely used in python based developments. That templating system is Jinja
  • Jinja templates are the files with extension .j2
  • Lets try to solve the above situation
  • Create a Readme.txt.j2 file with following content
Create by Ansible
Os family is {{ ansible_os_family }}
Os distribution is {{ ansible_distribution }}
version is {{ ansible_distribution_version }}
  • Write a simple playbook with following content
- hosts: all
  - name: copy the readme
      src: Readme.txt.j2
      dest: "{{ ansible_user_dir }}/Readme.txt"
  • Run this playbook and check the results
  • In the J2 file facts and variables (user defined) can be used.
  • Individual find and replaces can be done with a module lineinfile

Pre-Tasks and Post-Tasks

  • Pre-Tasks are the tasks which get executed before execution of tasks
  • Post-Tasks are the tasks which get executed after execution of tasks
- hosts: all
  become: yes
    - name: write a message
        msg: "Starting Execution of Playbook"
    - name: install tree
        name: tree
        state: present
    - debug:
        msg: Playbook execution completed

How to Reuse Playbooks

  • You already have lamp.yaml, now you want to use same lamp installation along with some other configurations
  • You can call existing playbooks using include or import playbooks. Refer
  • Lets write a simple playbook to call other playbook
- hosts: all
  become: yes
   - name: call lamp playbook
     import_playbook: lamp.yaml
   - name: install mysql
       name: mysql-server
       state: present

Ansible roles

  • Its all about reusability
  • Using others automation efforts in ansible is simplified using roles
  • Any user can share the work by converting playbook to ansible role and submit to ansible community. Ansible community which shares these roles is Ansible Galaxy
  • As an example lets install java using Ansible Galaxy role. Refer Here
  • Download the Ansible Role by executing ansible-galaxy install
  • Now to install java lets write a playbook
- hosts: all 
  become: yes
    - role:

Creating Ansible Roles

  • Sample folder structure
    • playbooks
      • roles
        • rolename
  • Login into the ACS and create a new directory called roles and execute the following command
ansible-galaxy init lamp
  • Now use lamp playbook to copy tasks in to tasks\main.yml, and do the same for handlers
  • if you have any files or templates copy them in files or templates folder
  • Now cd into playbooks folder and create one more folder called as environments
    • playbooks
      • roles
        • lamp (folder)
      • environments
        • DEV (file)
        • TEST (file)
        • UAT (file)
      • myplaybook.yml
  • Edit myplaybook.yml file with
- hosts: webservers
  become: yes
    - role: lamp
  • To create DEV Environment execute
ansible-playbook -i environments/DEV  myplaybook.yml

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

About continuous learner

devops & cloud enthusiastic learner