DevOps Classroom Series – 20/Aug/2020

What can be done if the module is not available?

  • Scenario: You want to automate certain deployment and couldn’t find the module for the command

  • If the module is not found, then ansible gives provision to directly run the linux/windows commands using command modules. But these modules are not idempotent. Ensuring idempotence is your responsibility

  • In Ansible we have following command modules Refer Here

    1. command: Execute command on targets
    2. expect: Executes a command & respond to prompts
    3. psexec: Runs commands on a remote Windows host based on PSExec model
    4. raw: Executes a low level command on machines where python is not installed.
    5. shell: Executes the shell command on nodes
    6. script: Executes a local script on remote node after transferring it.
    7. telnet: Executes a low level telnet command
  • Lets write a very simple playbook with command modules

---
- name: execute commands
  hosts: all
  tasks:
    - name: execute simple shell command
      shell: 
        cmd: touch test.txt
        chdir: /home/ansible
  • Now execute this twice and we can observe there is no idempotance by ansible since we used command modules Preview
  • One approach for making this idempotent is check if file exists and if the file doesnot exist then execute the task Preview
  • Now lets change the playbook to
---
- name: execute commands
  hosts: all
  tasks:
    - name: check for file existence
      stat:
        path: /home/ansible/test.txt
      register: stat_result
    - name: execute simple shell command
      shell: 
        cmd: touch test.txt
        chdir: /home/ansible
      when: not stat_result.stat.exists
      
        
  • Now execute the ansible playbook again Preview
  • How to make the commands which donot create a file idempotent
---
- name: execute commands
  hosts: all
  tasks:
    - name: check for file existence
      stat:
        path: /home/ansible/.pingexecution
      register: stat_result
    - name: execute simple shell command
      shell: 
        cmd: ping -c 4 google.com
      when: not stat_result.stat.exists
      notify:
        - store ping execution
  handlers:
    - name: store ping execution
      file:
        path: /home/ansible/.pingexecution
        state: touch
  • During the execution of playbook if i need to set the variable value for usage at the host level we have a module called as set_fact

Reusing others work

  • Scenario: I have been asked to install mysql on centos and ubuntu nodes.
  • Solution: Write your own ansible playbook or since we are not the first people to try mysql execution from ansible we can reuse others work
  • Ansible makes it possible to share work(playbooks/roles/collection) done by users to community using Ansible-Galaxy
  • Now lets search mysql in ansible galaxy Preview
  • We should understand how to reuse work shared by others i.e. understanding roles and collections.

Leave a Reply

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

About learningthoughtsadmin