Ansible 8 of 9: Loops
1 of 17. Open Cloud 9
2 of 17. Provision the infrastructure
Don't forget to update the inventory file 'hosts'. Validate that you can connect to all the hosts.
cd ansible-tasks
terraform apply -auto-approve
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{Instance:InstanceId,Name:Tags[?Key==`Name`]|[0].Value,PublicIP:PublicIpAddress,PrivateIP:PrivateIpAddress,State:State.Name}' \
    --output table
cat hosts
ansible all -m ping
3 of 17. Create a new Ansible playbook: create-files-folders.yml
Populate the new file with content.
touch create-files-folders.yml
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/folder01
        state: directory
    - name: Creating File
      file:
        path: /home/{{ ansible_user }}/folder01/file01
        state: touch
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Check if file exist
      stat:
        path: /home/{{ ansible_user }}/folder01/file01
      register: register_file
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
    - name: Report if file exists
      debug:
        msg: "The file exists"
      when: register_file.stat.exists
4 of 17. Run the playbook.
The script uses "stat" to determine if stuff exists.
ansible-playbook create-files-folders.yml
5 of 17. Use 'with_items' to create folders.
Modify create-files-folders.yml to use 'with_items' to create folders
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/{{ item }}
        state: directory
      with_items:
        - folder01
        - folder02
        - folder03
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Check if file exist
      stat:
        path: /home/{{ ansible_user }}/folder01/file01
      register: register_file
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
    - name: Report if file exists
      debug:
        msg: "The file exists"
      when: register_file.stat.exists
6 of 17. Run the playbook"
Validate the additional folders are created.
ansible-playbook create-files-folders.yml
7 of 17. Modify the playbook to remove the folders.
State should change to "absent"
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/{{ item }}
        state: absent
      with_items:
        - folder01
        - folder02
        - folder03
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Check if file exist
      stat:
        path: /home/{{ ansible_user }}/folder01/file01
      register: register_file
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
    - name: Report if file exists
      debug:
        msg: "The file exists"
      when: register_file.stat.exists
08 of 17. Run the playbook to remove the folders
Validate the folders are gone.
ansible-playbook create-files-folders.yml
09 of 17. Modify the playbook to use the loop directive to create folders
Note: Beyond the syntax difference, loop only works on flattened structures. E.g.: If one entry in the list contains sub-items, that entry would have to be "flattened" to use loop.
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/{{ item }}
        state: directory
      loop:
        - folder01
        - folder02
        - folder03
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
10 of 17. Run the playbook to recreate those folders
Validate the folders are created.
ansible-playbook create-files-folders.yml
11 of 17. One more time, modify the playbook to remove the folders.
State should change to "absent"
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/{{ item }}
        state: absent
      loop:
        - folder01
        - folder02
        - folder03
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
12 of 17. Run the playbook again to remove the folders
Validate the folders are gone.
ansible-playbook create-files-folders.yml
13 of 17. Modify the playbook to create a file inside each folder.
This will be done using a loop, also.
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/{{ item }}
        state: directory
      loop:
        - folder01
        - folder02
        - folder03
    - name: Creating files
      file:
        path: /home/{{ ansible_user }}/{{ item.dir }}/{{ item.file }}
        state: touch
      with_items:
        - { dir: "folder01", file: "file01"}
        - { dir: "folder02", file: "file02"}
        - { dir: "folder03", file: "file03"}
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Check if file exist
      stat:
        path: /home/{{ ansible_user }}/folder01/file01
      register: register_file
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
    - name: Report if file exists
      debug:
        msg: "The file exists"
      when: register_file.stat.exists
14 of 17. Run the playbook again to add folders and files
Validate the folders and files are present.
ansible-playbook create-files-folders.yml
15 of 17. Modify the playbook to remove all created.
The state should change to "absent"
- hosts: all
  tasks:
    - name: Creating Folder
      file:
        path: /home/{{ ansible_user }}/{{ item }}
        state: absent
      loop:
        - folder01
        - folder02
        - folder03
    - name: Creating files
      file:
        path: /home/{{ ansible_user }}/{{ item.dir }}/{{ item.file }}
        state: absent
      with_items:
        - { dir: "folder01", file: "file01"}
        - { dir: "folder02", file: "file02"}
        - { dir: "folder03", file: "file03"}
    - name: Check if folder exist
      stat:
        path: /home/{{ ansible_user }}/folder01
      register: register_folder
    - name: Check if file exist
      stat:
        path: /home/{{ ansible_user }}/folder01/file01
      register: register_file
    - name: Report if folder exists
      debug:
        msg: "The directory exists"
      when: register_folder.stat.exists and register_folder.stat.isdir
    - name: Report if file exists
      debug:
        msg: "The file exists"
      when: register_file.stat.exists
16 of 17. Run the playbook to remove the items
ansible-playbook create-files-folders.yml
17 of 17. Cleanup
terraform destroy -auto-approve
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{Instance:InstanceId,Name:Tags[?Key==`Name`]|[0].Value,PublicIP:PublicIpAddress,PrivateIP:PrivateIpAddress,State:State.Name}' \
    --output table
References
ansible.builtin.file module – Manage files and file properties - Ansible Documentation
Ansible playbooks - Ansible documentation
ansible.builtin.stat module – Retrieve file or file system status - Ansible Documentation
ansible.builtin.debug module – Print statements during execution - Ansible Documentation
Command: init | Terraform | HashiCorp Developer
Command: plan | Terraform | HashiCorp Developer
Comments
Post a Comment