<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Infrastructure &amp; Automation on Aadarsha Khadka</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/</link><description>Recent content in Infrastructure &amp; Automation on Aadarsha Khadka</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://aadarshakhadka.com.np/practice-log/infrastructure/index.xml" rel="self" type="application/rss+xml"/><item><title>PL - 013 — Automating Linux Storage Management with Ansible</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-013-automate-storage/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-013-automate-storage/</guid><description>&lt;h3 id="attatching-5gb-on-each-testserver-and-prodserver-vm"&gt;Attatching 5GB on each testserver and prodserver vm:&lt;/h3&gt;
&lt;p&gt;A dedicated 5 GiB virtual disk is attached to each VM to provide additional storage for the disk-management exercise.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;aadarkdk@pop-os:~$ VBoxManage controlvm testserver acpipowerbutton
aadarkdk@pop-os:~$ VBoxManage controlvm prodserver acpipowerbutton

aadarkdk@pop-os:~$ VBoxManage list runningvms
&amp;#34;node&amp;#34; {734df242-0e74-4437-a378-c829764b7d10}
&amp;#34;dev1&amp;#34; {21aa3e65-2a67-408f-b924-3475b21e70a0}
&amp;#34;dev2&amp;#34; {c4798a4a-7bd1-4289-8f1f-037924cbabf1}

aadarkdk@pop-os:~$ VBoxManage createmedium disk --filename &amp;#34;$HOME/VirtualBox VMs/testserver/testserver-data.vdi&amp;#34; --size 5120 --format VDI
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: 5fac21fc-55ec-4e17-b738-c3f863141424
aadarkdk@pop-os:~$ VBoxManage storageattach testserver --storagectl &amp;#34;SATA&amp;#34; --port 1 --device 0 --type hdd --medium &amp;#34;$HOME/VirtualBox VMs/testserver/testserver-data.vdi&amp;#34;

aadarkdk@pop-os:~$ VBoxManage createmedium disk --filename &amp;#34;$HOME/VirtualBox VMs/prodserver/prodserver-data.vdi&amp;#34; --size 5120 --format VDI
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Medium created. UUID: bf403542-e047-46f3-9a10-c2878782e9e3
aadarkdk@pop-os:~$ VBoxManage storageattach prodserver --storagectl &amp;#34;SATA&amp;#34; --port 1 --device 0 --type hdd --medium &amp;#34;$HOME/VirtualBox VMs/prodserver/prodserver-data.vdi&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="verify-the-newly-attached-data-disks"&gt;Verify the Newly Attached Data Disks&lt;/h3&gt;
&lt;p&gt;The newly attached disks are verified on both managed nodes using &lt;code&gt;lsblk&lt;/code&gt;. The additional disk is expected to appear as &lt;code&gt;/dev/sdb&lt;/code&gt; with a capacity of approximately 5 GiB.&lt;/p&gt;</description></item><item><title>PL - 012 — Automating Linux system Administration Tasks with Ansible</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-012-automate-tasks/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-012-automate-tasks/</guid><description>&lt;h3 id="automating-linux-system-adminstration-tasks"&gt;Automating Linux system Adminstration Tasks&lt;/h3&gt;
&lt;p&gt;i. Software and Subscription Management
ii. Scheduling Tasks&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="lab-session"&gt;Lab Session:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;aadarkdk@pop-os:~$ ssh cnode@192.168.254.15
cnode@192.168.254.15&amp;#39;s password: 
Last login: Wed Sep 16 06:10:27 2026
[cnode@control-node ~]$ ls 
ansible-lab done validate_nodes.sh
[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="configure-yum-repository-manually-and-using-ansible"&gt;Configure yum repository, manually and using Ansible:&lt;/h3&gt;
&lt;p&gt;Working mechanism of installing the package manually:&lt;/p&gt;</description></item><item><title>PL - 011 — Ansible Practice: Ansible Inclusion with Variables, Tasks, and Playbooks</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-011-inclusion/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-011-inclusion/</guid><description>&lt;h3 id="ansible-inclusion"&gt;Ansible Inclusion&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Ansible inclusion means incorporating variables, tasks, or entire playbooks into an Ansible execution, allowing reusable components to be organized separately.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="lab-session"&gt;Lab Session&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ ls
ansible-lab done validate_nodes.sh
[cnode@control-node ~]$ cat validate_nodes.sh 
#!/bin/bash

nodes=(dev1 dev2 testserver prodserver)

for host in &amp;#34;${nodes[@]}&amp;#34;;
do
 echo &amp;#34;----- $host -----&amp;#34;

 ssh -o BatchMode=yes \
 -o PasswordAuthentication=no \
 &amp;#34;cnode@$host&amp;#34; &amp;#39;hostname; sudo -n whoami&amp;#39;
 
 echo
done
[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$ cd ansible-lab/
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ cat ansible.cfg 
[defaults]
inventory = ./inventory
remote_user = cnode

[privilege_escalation]
become = true
become_method = sudo
[cnode@control-node ansible-lab]$ cat inventory 
[myself]
control-node

[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ mkdir vars
[cnode@control-node ansible-lab]$ vim vars/variables.yml
[cnode@control-node ansible-lab]$ cat vars/variables.yml 
---
fwll_pkg: firewalld
web_pkg: httpd
[cnode@control-node ansible-lab]$ mkdir tasks
[cnode@control-node ansible-lab]$ vim tasks/tasks.yml
[cnode@control-node ansible-lab]$ cat tasks/tasks.yml 
---
- name: Install {{ web_pkg }} package
 ansible.builtin.dnf:
 name: &amp;#34;{{ web_pkg }}&amp;#34;
 state: latest

- name: Install {{ fwll_pkg }} package
 ansible.builtin.dnf:
 name: &amp;#34;{{ fwll_pkg }}&amp;#34;
 state: latest

- name: Start the {{ web_svc }} service
 ansible.builtin.service:
 name: &amp;#34;{{ web_svc }}&amp;#34;
 state: &amp;#34;{{ svc_state }}&amp;#34;
 enabled: yes

- name: Start the {{ fwll_svc }} service
 ansible.builtin.service:
 name: &amp;#34;{{ fwll_svc }}&amp;#34;
 state: &amp;#34;{{ svc_state }}&amp;#34;
 enabled: yes

- name: Allow http packets through the firewall
 ansible.posix.firewalld:
 service: &amp;#34;{{ fwll_rule }}&amp;#34;
 state: &amp;#34;{{ fwll_rule_state }}&amp;#34;
 permanent: true
 immediate: true
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ vim index.html
[cnode@control-node ansible-lab]$ cat index.html 
&amp;lt;h1&amp;gt;Hello from prodserver&amp;lt;/h1&amp;gt;
[cnode@control-node ansible-lab]$ 

┌─[cnode@control-node]─[~/ansible-lab]
└──╼ $ ls
ansible.cfg inventory plays tasks vars

┌─[cnode@control-node]─[~/ansible-lab]
└──╼ $ ansible-doc ansible.builtin.import_playbook

[cnode@control-node ansible-lab]$ vim webdeploy_inclusion.yml
[cnode@control-node ansible-lab]$ vim webdeploy_inclusion.yml
[cnode@control-node ansible-lab]$ vim tasks/tasks.yml 
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory plays tasks vars webdeploy_inclusion.yml webdeploy.yml
[cnode@control-node ansible-lab]$ vim plays/test.yml 
[cnode@control-node ansible-lab]$ cat plays/test.yml
---
- name: Test web site
 hosts: production
 become: false

 tasks:
 - name: test website
 ansible.builtin.uri:
 url: &amp;#34;{{ url }}&amp;#34;
 status_code: 200
[cnode@control-node ansible-lab]$ vim webdeploy_inclusion.yml 
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@prodserver ~]$ hostname
prodserver
[cnode@prodserver ~]$ hostname -I
192.168.254.19 
[cnode@prodserver ~]$ whoami
cnode
[cnode@prodserver ~]$ rpm -q httpd
package httpd is not installed
[cnode@prodserver ~]$ 

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory plays tasks vars webdeploy_inclusion.yml webdeploy.yml

[cnode@control-node ansible-lab]$ cat webdeploy_inclusion.yml 
---
- name: Play using inclusion
 hosts: production
 vars:
 index_page: index.html
 index_dest: /var/www/html/index.html

 tasks:
 - name: Include variables
 ansible.builtin.include_vars:
 file: vars/variables.yml

 - name: Include/load tasks
 ansible.builtin.include_tasks:
 file: tasks/tasks.yml
 vars:
 web_svc: httpd
 svc_state: started
 fwll_svc: firewalld
 fwll_rule: http
 fwll_rule_state: enabled

 - name: Copy index.html file
 ansible.builtin.copy:
 src: &amp;#34;{{ index_page }}&amp;#34;
 dest: &amp;#34;{{ index_dest }}&amp;#34;

- name: Play-2 testing website
 ansible.builtin.import_playbook: plays/test.yml
 vars:
 url: http://192.168.254.19
[cnode@control-node ansible-lab]$ 

┌─[cnode@control-node]─[~/ansible-lab]
└──╼ $ ansible-playbook --syntax-check webdeploy_inclusion.yml 
playbook: webdeploy_inclusion.yml
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="final-run-and-output"&gt;Final run and output:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ls
ansible.cfg index.html inventory plays tasks vars webdeploy_inclusion.yml
[cnode@control-node ansible-lab]$ cat index.html 
&amp;lt;h1&amp;gt;Hello from prodserver&amp;lt;/h1&amp;gt;
[cnode@control-node ansible-lab]$ cat vars/variables.yml 
---
fwll_pkg: firewalld
web_pkg: httpd
[cnode@control-node ansible-lab]$ cat tasks/tasks.yml 
---
- name: Install {{ web_pkg }} package
 ansible.builtin.dnf:
 name: &amp;#34;{{ web_pkg }}&amp;#34;
 state: latest

- name: Install {{ fwll_pkg }} package
 ansible.builtin.dnf:
 name: &amp;#34;{{ fwll_pkg }}&amp;#34;
 state: latest

- name: Start the {{ web_svc }} service
 ansible.builtin.service:
 name: &amp;#34;{{ web_svc }}&amp;#34;
 state: &amp;#34;{{ svc_state }}&amp;#34;
 enabled: yes

- name: Start the {{ fwll_svc }} service
 ansible.builtin.service:
 name: &amp;#34;{{ fwll_svc }}&amp;#34;
 state: &amp;#34;{{ svc_state }}&amp;#34;
 enabled: yes

- name: Allow http packets through the firewall
 ansible.posix.firewalld:
 service: &amp;#34;{{ fwll_rule }}&amp;#34;
 state: &amp;#34;{{ fwll_rule_state }}&amp;#34;
 permanent: true
 immediate: true
[cnode@control-node ansible-lab]$ cat plays/test.yml 
---
- name: Test web site
 hosts: production
 become: false

 tasks:
 - name: test website
 ansible.builtin.uri:
 url: &amp;#34;{{ url }}&amp;#34;
 status_code: 200
[cnode@control-node ansible-lab]$ cat webdeploy_inclusion.yml 
---
- name: Play using inclusion
 hosts: production
 vars:
 index_page: index.html
 index_dest: /var/www/html/index.html

 tasks:
 - name: Include variables
 ansible.builtin.include_vars:
 file: vars/variables.yml

 - name: Include/load tasks
 ansible.builtin.include_tasks:
 file: tasks/tasks.yml
 vars:
 web_svc: httpd
 svc_state: started
 fwll_svc: firewalld
 fwll_rule: http
 fwll_rule_state: enabled

 - name: Copy index.html file
 ansible.builtin.copy:
 src: &amp;#34;{{ index_page }}&amp;#34;
 dest: &amp;#34;{{ index_dest }}&amp;#34;

- name: Play-2 testing website
 ansible.builtin.import_playbook: plays/test.yml
 vars:
 url: http://192.168.254.19
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check webdeploy_inclusion.yml 

playbook: webdeploy_inclusion.yml
[cnode@control-node ansible-lab]$ ansible-playbook webdeploy_inclusion.yml

PLAY [Play using inclusion] *********************************************************

TASK [Gathering Facts] **************************************************************
ok: [prodserver]

TASK [Include variables] ************************************************************
ok: [prodserver]

TASK [Include/load tasks] ***********************************************************
included: /home/cnode/ansible-lab/tasks/tasks.yml for prodserver

TASK [Install httpd package] ********************************************************
ok: [prodserver]

TASK [Install firewalld package] ****************************************************
ok: [prodserver]

TASK [Start the httpd service] ******************************************************
ok: [prodserver]

TASK [Start the firewalld service] **************************************************
ok: [prodserver]

TASK [Allow http packets through the firewall] **************************************
ok: [prodserver]

TASK [Copy index.html file] *********************************************************
ok: [prodserver]

PLAY [Test web site] ****************************************************************

TASK [Gathering Facts] **************************************************************
ok: [prodserver]

TASK [test website] *****************************************************************
ok: [prodserver]

PLAY RECAP **************************************************************************
prodserver : ok=11 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;</description></item><item><title>PL - 010 — Ansible Practice: Error Handling, File Management &amp; Remote File Operations</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-010-error-handling/</link><pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-010-error-handling/</guid><description>&lt;h3 id="error-handling-in-automation"&gt;Error Handling in Automation&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$ cd ansible-lab/

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ 

[cnode@testserver ~]$ ls
[cnode@testserver ~]$ rpm -q httpd nginx mariadb-server php
package httpd is not installed
package nginx is not installed
mariadb-server-10.11.18-1.el10.x86_64
package php is not installed
[cnode@testserver ~]$ sudo rpm -e --nodeps mariadb-server
Removed &amp;#39;/etc/systemd/system/multi-user.target.wants/mariadb.service&amp;#39;.
Removed &amp;#39;/etc/systemd/system/mysql.service&amp;#39;.
Removed &amp;#39;/etc/systemd/system/mysqld.service&amp;#39;.
[cnode@testserver ~]$ rpm -q httpd nginx mariadb-server php
package httpd is not installed
package nginx is not installed
package mariadb-server is not installed
package php is not installed
[cnode@testserver ~]$ 

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ vi playbook_handle-error.yml
[cnode@control-node ansible-lab]$ vim playbook_handle-error.yml 

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory playbook_handle-error.yml
[cnode@control-node ansible-lab]$ cat playbook_handle-error.yml 
---
# Installing different packages

- name: Play handling errors
 hosts: test
 become: true

 tasks:

 - name: Install the latest version of Apache
 ansible.builtin.dnf:
 name: htpd
 state: latest

 - name: Install the latest version of MariaDB
 ansible.builtin.dnf:
 name: mariadb-server
 state: latest

 - name: Install the latest version of PHP
 ansible.builtin.dnf:
 name: php
 state: latest

 - name: Install the latest version of Samba
 ansible.builtin.dnf:
 name: samba
 state: latest
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check playbook_handle-error.yml

playbook: playbook_handle-error.yml
[cnode@control-node ansible-lab]$ ansible-playbook playbook_handle-error.yml

PLAY [Play handling errors] *********************************************************

TASK [Gathering Facts] **************************************************************
ok: [testserver]

TASK [Install the latest version of Apache] *****************************************
fatal: [testserver]: FAILED! =&amp;gt; {&amp;#34;changed&amp;#34;: false, &amp;#34;failures&amp;#34;: [&amp;#34;No package htpd available.&amp;#34;], &amp;#34;msg&amp;#34;: &amp;#34;Failed to install some of the specified packages&amp;#34;, &amp;#34;rc&amp;#34;: 1, &amp;#34;results&amp;#34;: []}

PLAY RECAP **************************************************************************
testserver : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 


# If first tasks fails, remaining other automatically fails because ansible runs sequentially, thus 
using errors handling concepts, where previous errors don&amp;#39;t depend on successive tasks.


# To ignore error and proceed the next module
# The preceeding module should not depend on the previous module
# For example: web deployment depends on web server existance/installation


[cnode@control-node ansible-lab]$ vim playbook_handle-error.yml
[cnode@control-node ansible-lab]$ cat playbook_handle-error.yml 
---
# Installing different packages

- name: Play handling errors
 hosts: test
 become: true

 tasks:

 - name: Install the latest version of Apache
 ansible.builtin.dnf:
 name: htpd
 state: latest
 ignore_errors: yes

 - name: Install the latest version of MariaDB
 ansible.builtin.dnf:
 name: mariadb-server
 state: latest
 ignore_errors: yes

 - name: Install the latest version of PHP
 ansible.builtin.dnf:
 name: php
 state: latest
 ignore_errors: yes

 - name: Install the latest version of Samba
 ansible.builtin.dnf:
 name: samba
 state: latest
 ignore_errors: yes
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check playbook_handle-error.yml

playbook: playbook_handle-error.yml
[cnode@control-node ansible-lab]$ ansible-playbook --check playbook_handle-error.yml

PLAY [Play handling errors] *********************************************************

TASK [Gathering Facts] **************************************************************
ok: [testserver]

TASK [Install the latest version of Apache] *****************************************
fatal: [testserver]: FAILED! =&amp;gt; {&amp;#34;changed&amp;#34;: false, &amp;#34;failures&amp;#34;: [&amp;#34;No package htpd available.&amp;#34;], &amp;#34;msg&amp;#34;: &amp;#34;Failed to install some of the specified packages&amp;#34;, &amp;#34;rc&amp;#34;: 1, &amp;#34;results&amp;#34;: []}
...ignoring

TASK [Install the latest version of MariaDB] ****************************************
changed: [testserver]

TASK [Install the latest version of PHP] ********************************************
changed: [testserver]

TASK [Install the latest version of Samba] ******************************************
changed: [testserver]

PLAY RECAP **************************************************************************
testserver : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 

[cnode@control-node ansible-lab]$ 

# errors are ignored and next tasks are performed successfully.

# But, actually in this case, httpd gets installed as it depends on mariadb-server

# NOTE: don&amp;#39;t use the similar packages for same purpose
# For example: if using httpd don&amp;#39;t use NGINX, there will be port conflict.

---

[cnode@control-node ansible-lab]$ cat playbook_handle-error-2.yml 
---
# Installing different packages

- name: Play handling errors
 hosts: test
 become: true

 tasks:

 - name: Install the latest version of Apache
 ansible.builtin.dnf:
 name: httpd
 state: latest
 register: httpd_out
 ignore_errors: yes

 - name: Install the latest version of Nginx
 ansible.builtin.dnf:
 name: nginx
 state: latest
 when: &amp;#34;http_out.rc == 1&amp;#34;
 ignore_errors: yes

 - name: Install the latest version of MariaDB
 ansible.builtin.dnf:
 name: mariadb-server
 state: latest
 ignore_errors: yes

 - name: Install the latest version of PHP
 ansible.builtin.dnf:
 name: php
 state: latest
 ignore_errors: yes

 - name: Install the latest version of Samba
 ansible.builtin.dnf:
 name: samba
 state: latest
 ignore_errors: yes
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ cp playbook_handle-error.yml playbook_handle-error-2.yml 
[cnode@control-node ansible-lab]$ vim playbook_handle-error-2.yml 
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check playbook_handle-error-2.yml

playbook: playbook_handle-error-2.yml
[cnode@control-node ansible-lab]$ ansible-playbook --check playbook_handle-error-2.yml

PLAY [Play handling errors] *********************************************************

TASK [Gathering Facts] **************************************************************
ok: [testserver]

TASK [Install the latest version of Apache] *****************************************
changed: [testserver]

TASK [Install the latest version of Nginx] ******************************************
fatal: [testserver]: FAILED! =&amp;gt; {&amp;#34;msg&amp;#34;: &amp;#34;The conditional check &amp;#39;http_out.rc == 1&amp;#39; failed. The error was: error while evaluating conditional (http_out.rc == 1): &amp;#39;http_out&amp;#39; is undefined. &amp;#39;http_out&amp;#39; is undefined\n\nThe error appears to be in &amp;#39;/home/cnode/ansible-lab/playbook_handle-error-2.yml&amp;#39;: line 21, column 13, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n state: latest\n when: \&amp;#34;http_out.rc == 1\&amp;#34;\n ^ here\n&amp;#34;}
...ignoring

TASK [Install the latest version of MariaDB] ****************************************
changed: [testserver]

TASK [Install the latest version of PHP] ********************************************
changed: [testserver]

TASK [Install the latest version of Samba] ******************************************
changed: [testserver]

PLAY RECAP **************************************************************************
testserver : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 
[cnode@control-node ansible-lab]$ 


# But

[cnode@control-node ansible-lab]$ vim playbook_handle-error-2.yml 
[cnode@control-node ansible-lab]$ cat playbook_handle-error-2.yml 
---
# Installing different packages

- name: Play handling errors
 hosts: test
 become: true

 tasks:

 - name: Install the latest version of Apache
 ansible.builtin.dnf:
 name: htpd
 state: latest
 register: httpd_out
 ignore_errors: yes

 - name: Install the latest version of Nginx
 ansible.builtin.dnf:
 name: nginx
 state: latest
 when: &amp;#34;http_out.rc == 1&amp;#34;
 ignore_errors: yes

 - name: Install the latest version of MariaDB
 ansible.builtin.dnf:
 name: mariadb-server
 state: latest
 ignore_errors: yes

 - name: Install the latest version of PHP
 ansible.builtin.dnf:
 name: php
 state: latest
 ignore_errors: yes

 - name: Install the latest version of Samba
 ansible.builtin.dnf:
 name: samba
 state: latest
 ignore_errors: yes
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check playbook_handle-error-2.yml

playbook: playbook_handle-error-2.yml
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook --check playbook_handle-error-2.yml

PLAY [Play handling errors] *********************************************************

TASK [Gathering Facts] **************************************************************
ok: [testserver]

TASK [Install the latest version of Apache] *****************************************
fatal: [testserver]: FAILED! =&amp;gt; {&amp;#34;changed&amp;#34;: false, &amp;#34;failures&amp;#34;: [&amp;#34;No package htpd available.&amp;#34;], &amp;#34;msg&amp;#34;: &amp;#34;Failed to install some of the specified packages&amp;#34;, &amp;#34;rc&amp;#34;: 1, &amp;#34;results&amp;#34;: []}
...ignoring

TASK [Install the latest version of Nginx] ******************************************
fatal: [testserver]: FAILED! =&amp;gt; {&amp;#34;msg&amp;#34;: &amp;#34;The conditional check &amp;#39;http_out.rc == 1&amp;#39; failed. The error was: error while evaluating conditional (http_out.rc == 1): &amp;#39;http_out&amp;#39; is undefined. &amp;#39;http_out&amp;#39; is undefined\n\nThe error appears to be in &amp;#39;/home/cnode/ansible-lab/playbook_handle-error-2.yml&amp;#39;: line 21, column 13, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n state: latest\n when: \&amp;#34;http_out.rc == 1\&amp;#34;\n ^ here\n&amp;#34;}
...ignoring

TASK [Install the latest version of MariaDB] ****************************************
changed: [testserver]

TASK [Install the latest version of PHP] ********************************************
changed: [testserver]

TASK [Install the latest version of Samba] ******************************************
changed: [testserver]

PLAY RECAP **************************************************************************
testserver : ok=6 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=2 

[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="ansible-block-rescue-and-always"&gt;Ansible block, rescue and always&lt;/h3&gt;
&lt;p&gt;Ansible provides block, rescue, and always to organize tasks and handle errors in a controlled way.&lt;/p&gt;</description></item><item><title>PL - 009 — Ansible Lab: Facts, Jinja2 Templates, Loops, Variables, Conditionals, and User Management</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-009-facts-templates/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-009-facts-templates/</guid><description>&lt;h3 id="lab-session"&gt;Lab Session:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ ls
ansible-lab done validate_nodes.sh
[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$ cd ansible-lab/
[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory webserver.yml

[cnode@control-node ansible-lab]$ ansible testprod -m setup -a &amp;#39;filter=*ipv4*&amp;#39;
testserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;ansible_all_ipv4_addresses&amp;#34;: [
 &amp;#34;192.168.254.18&amp;#34;
 ],
 &amp;#34;ansible_default_ipv4&amp;#34;: {
 &amp;#34;address&amp;#34;: &amp;#34;192.168.254.18&amp;#34;,
 &amp;#34;alias&amp;#34;: &amp;#34;enp0s3&amp;#34;,
 &amp;#34;broadcast&amp;#34;: &amp;#34;192.168.254.255&amp;#34;,
 &amp;#34;gateway&amp;#34;: &amp;#34;192.168.254.254&amp;#34;,
 &amp;#34;interface&amp;#34;: &amp;#34;enp0s3&amp;#34;,
 &amp;#34;macaddress&amp;#34;: &amp;#34;08:00:47:e2:6f:f1&amp;#34;,
 &amp;#34;mtu&amp;#34;: 1500,
 &amp;#34;netmask&amp;#34;: &amp;#34;255.255.255.0&amp;#34;,
 &amp;#34;network&amp;#34;: &amp;#34;192.168.254.0&amp;#34;,
 &amp;#34;prefix&amp;#34;: &amp;#34;24&amp;#34;,
 &amp;#34;type&amp;#34;: &amp;#34;ether&amp;#34;
 },
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false
}
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;ansible_all_ipv4_addresses&amp;#34;: [
 &amp;#34;192.168.254.19&amp;#34;
 ],
 &amp;#34;ansible_default_ipv4&amp;#34;: {
 &amp;#34;address&amp;#34;: &amp;#34;192.168.254.19&amp;#34;,
 &amp;#34;alias&amp;#34;: &amp;#34;enp0s3&amp;#34;,
 &amp;#34;broadcast&amp;#34;: &amp;#34;192.168.254.255&amp;#34;,
 &amp;#34;gateway&amp;#34;: &amp;#34;192.168.254.254&amp;#34;,
 &amp;#34;interface&amp;#34;: &amp;#34;enp0s3&amp;#34;,
 &amp;#34;macaddress&amp;#34;: &amp;#34;08:00:37:8f:95:5e&amp;#34;,
 &amp;#34;mtu&amp;#34;: 1500,
 &amp;#34;netmask&amp;#34;: &amp;#34;255.255.255.0&amp;#34;,
 &amp;#34;network&amp;#34;: &amp;#34;192.168.254.0&amp;#34;,
 &amp;#34;prefix&amp;#34;: &amp;#34;24&amp;#34;,
 &amp;#34;type&amp;#34;: &amp;#34;ether&amp;#34;
 },
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible prodserver -m setup -a &amp;#39;filter=*ipv4*&amp;#39;
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;ansible_all_ipv4_addresses&amp;#34;: [
 &amp;#34;192.168.254.19&amp;#34;
 ],
 &amp;#34;ansible_default_ipv4&amp;#34;: {
 &amp;#34;address&amp;#34;: &amp;#34;192.168.254.19&amp;#34;,
 &amp;#34;alias&amp;#34;: &amp;#34;enp0s3&amp;#34;,
 &amp;#34;broadcast&amp;#34;: &amp;#34;192.168.254.255&amp;#34;,
 &amp;#34;gateway&amp;#34;: &amp;#34;192.168.254.254&amp;#34;,
 &amp;#34;interface&amp;#34;: &amp;#34;enp0s3&amp;#34;,
 &amp;#34;macaddress&amp;#34;: &amp;#34;08:10:27:9d:95:5e&amp;#34;,
 &amp;#34;mtu&amp;#34;: 1500,
 &amp;#34;netmask&amp;#34;: &amp;#34;255.255.255.0&amp;#34;,
 &amp;#34;network&amp;#34;: &amp;#34;192.168.254.0&amp;#34;,
 &amp;#34;prefix&amp;#34;: &amp;#34;24&amp;#34;,
 &amp;#34;type&amp;#34;: &amp;#34;ether&amp;#34;
 },
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false
}

[cnode@control-node ansible-lab]$ ansible prodserver -m setup -a &amp;#39;filter=*cpu*&amp;#39;
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;ansible_processor_vcpus&amp;#34;: 2,
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible prodserver -m setup -a &amp;#39;filter=*bios*&amp;#39;
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;ansible_bios_date&amp;#34;: &amp;#34;12/01/2006&amp;#34;,
 &amp;#34;ansible_bios_vendor&amp;#34;: &amp;#34;innotek GmbH&amp;#34;,
 &amp;#34;ansible_bios_version&amp;#34;: &amp;#34;VirtualBox&amp;#34;,
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ vim files/index.html.j2 
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check webserver.yml 

playbook: webserver.yml
[cnode@control-node ansible-lab]$ ansible-playbook webserver.yml

PLAY [Configure Apache web server] **************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Install Apache web server] ****************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Start and enable Apache service] **********************************************************************************************************
ok: [prodserver]
ok: [testserver]

TASK [Print return information from the previous task] ******************************************************************************************
ok: [testserver] =&amp;gt; {
 &amp;#34;service_out&amp;#34;: {
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;enabled&amp;#34;: true,
 &amp;#34;failed&amp;#34;: false,
 &amp;#34;name&amp;#34;: &amp;#34;httpd&amp;#34;,
 &amp;#34;state&amp;#34;: &amp;#34;started&amp;#34;,
 &amp;#34;status&amp;#34;: {
...
 }
 }
}

TASK [Allow HTTP traffic through the firewall] **************************************************************************************************
ok: [prodserver]
ok: [testserver]

TASK [Deploy website index page] ****************************************************************************************************************
changed: [prodserver]
changed: [testserver]

PLAY RECAP **************************************************************************************************************************************
prodserver : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.shell -a &amp;#34;curl 0&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;h2&amp;gt;Machine&amp;#39;s Hostname(old-style): testserver&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;Machine&amp;#39;s Hostname(new-style): testserver&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;No.of CPUs in this system (old-style): 2 &amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;No.of CPUs in this system (new-style): 2 &amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;IPv4 Address(old-style): 192.168.254.18&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;IPv4 Address(new-style): 192.168.254.18&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;BIOS date of this system (old-style): 12/01/2006 &amp;lt;/h2&amp;gt;
&amp;lt;h2&amp;gt;BIOS date of this system (old-style): 12/01/2006 &amp;lt;/h2&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt; % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 637 100 637 0 0 639k 0 --:--:-- --:--:-- --:--:-- 622k
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;h2&amp;gt;Machine&amp;#39;s Hostname(old-style): prodserver&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;Machine&amp;#39;s Hostname(new-style): prodserver&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;No.of CPUs in this system (old-style): 2 &amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;No.of CPUs in this system (new-style): 2 &amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;IPv4 Address(old-style): 192.168.254.19&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;IPv4 Address(new-style): 192.168.254.19&amp;lt;/h2&amp;gt;
 &amp;lt;h2&amp;gt;BIOS date of this system (old-style): 12/01/2006 &amp;lt;/h2&amp;gt;
&amp;lt;h2&amp;gt;BIOS date of this system (old-style): 12/01/2006 &amp;lt;/h2&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt; % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 637 100 637 0 0 662k 0 --:--:-- --:--:-- --:--:-- 622k
[cnode@control-node ansible-lab]$ 



-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------

time 27 minutes (sep 9)

# Creating playbooks with loop and conditional tasks


[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ vim loop-usercreate.yml
[cnode@control-node ansible-lab]$ cat loop-usercreate.yml 
---
# Loops

- name: Create users
 hosts: develop

 vars:
 devusers:
 - devuser1
 - devuser2
 - devuser3
 - devuser4
 - devuser5

 tasks:
 - name: Add developer users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 with_items: &amp;#34;{{ devusers }}&amp;#34;
[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#34;tail -5 /etc/passwd&amp;#34;
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
chrony:x:997:996:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-coredump:x:995:995:systemd Core Dumper:/:/usr/sbin/nologin
cnode:x:1000:1000:Control Node:/home/cnode:/bin/bash
user1:x:1005:1001::/home/user1:/bin/bash
ram:x:1006:1006::/home/ram:/bin/bash
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
chrony:x:997:996:chrony system user:/var/lib/chrony:/sbin/nologin
systemd-coredump:x:995:995:systemd Core Dumper:/:/usr/sbin/nologin
cnode:x:1000:1000:Control Node:/home/cnode:/bin/bash
user1:x:1005:1001::/home/user1:/bin/bash
ram:x:1006:1006::/home/ram:/bin/bash
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check loop-usercreate.yml

playbook: loop-usercreate.yml
[cnode@control-node ansible-lab]$ ansible-playbook loop-usercreate.yml

PLAY [Create users] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [dev1]
ok: [dev2]

TASK [Add developer users] *****************************************************
changed: [dev1] =&amp;gt; (item=devuser1)
changed: [dev2] =&amp;gt; (item=devuser1)
changed: [dev1] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser2)
changed: [dev1] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser3)
changed: [dev1] =&amp;gt; (item=devuser4)
changed: [dev2] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser5)
changed: [dev2] =&amp;gt; (item=devuser5)

PLAY RECAP *********************************************************************
dev1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#34;tail -5 /etc/passwd&amp;#34;
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
devuser1:x:1007:1007::/home/devuser1:/bin/bash
devuser2:x:1008:1008::/home/devuser2:/bin/bash
devuser3:x:1009:1009::/home/devuser3:/bin/bash
devuser4:x:1010:1010::/home/devuser4:/bin/bash
devuser5:x:1011:1011::/home/devuser5:/bin/bash
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
devuser1:x:1007:1007::/home/devuser1:/bin/bash
devuser2:x:1008:1008::/home/devuser2:/bin/bash
devuser3:x:1009:1009::/home/devuser3:/bin/bash
devuser4:x:1010:1010::/home/devuser4:/bin/bash
devuser5:x:1011:1011::/home/devuser5:/bin/bash
[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ vim loop-usercreate.yml 
[cnode@control-node ansible-lab]$ cat loop-usercreate.yml 
---
# Loops

- name: Create users
 hosts: develop

 vars:
 devusers:
 - devuser2
 - devuser3
 - devuser4
 - devuser5

 tasks:
 - name: Add developer users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 state: absent
 remove: yes
 with_items: &amp;#34;{{ devusers }}&amp;#34;
[cnode@control-node ansible-lab]$ ansible-playbook loop-usercreate.yml

PLAY [Create users] *****************************************************************

TASK [Gathering Facts] **************************************************************
ok: [dev1]
ok: [dev2]

TASK [Add developer users] **********************************************************
changed: [dev2] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser3)
changed: [dev1] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser5)
changed: [dev1] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser5)

PLAY RECAP **************************************************************************
dev1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#34;id deveuser5&amp;#34;
dev2 | FAILED | rc=1 &amp;gt;&amp;gt;
id: ‘deveuser5’: no such usernon-zero return code
dev1 | FAILED | rc=1 &amp;gt;&amp;gt;
id: ‘deveuser5’: no such usernon-zero return code
[cnode@control-node ansible-lab]$ 




[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory loop-usercreate.yml
[cnode@control-node ansible-lab]$ mkdir vars
[cnode@control-node ansible-lab]$ vim vars/newusers.yml
[cnode@control-node ansible-lab]$ cat vars/newusers.yml 
newusers:
 - name: newuser1
 pw: newuser1pass
 - name: newuser2
 pw: newuser2pass
 - name: newuser3
 pw: newuser3pass
 - name: newuser4pass
 pw: newuser4pass
[cnode@control-node ansible-lab]$ cp loop-usercreate.yml loop-newusercreate.yml 

[cnode@control-node ansible-lab]$ vim loop-newusercreate.yml

[cnode@control-node ansible-lab]$ cat loop-newusercreate.yml 
---
# Loops

- name: Create new users from file
 hosts: develop

 vars_files:
 - vars/newusers.yml

 tasks:
 - name: Add some new users
 ansible.builtin.user:
 name: &amp;#34;{{ item.name }}&amp;#34;
 state: present
 password: &amp;#34;{{ item.pw | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
 with_items: &amp;#34;{{ newusers }}&amp;#34;
[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory loop-newusercreate.yml loop-usercreate.yml vars
[cnode@control-node ansible-lab]$ vim loop-newusercreate.yml 
[cnode@control-node ansible-lab]$ cat loop-newusercreate.yml 
---
# Provision users and their required groups on development hosts.

- name: Provision development users
 hosts: develop
 become: true

 vars_files:
 - vars/newusers.yml

 vars:
 # Groups required by the development environment.
 newgroups:
 - developers
 - managers
 - admins
 - employees

 # Supplementary groups assigned to newly created users.
 user_groups:
 - developers
 - managers
 - admins

 tasks:

 - name: Create required user groups
 ansible.builtin.group:
 name: &amp;#34;{{ item }}&amp;#34;
 state: present
 loop: &amp;#34;{{ newgroups }}&amp;#34;
 loop_control:
 label: &amp;#34;{{ item }}&amp;#34;

 - name: Create development users
 ansible.builtin.user:
 name: &amp;#34;{{ item.name }}&amp;#34;
 state: present
 password: &amp;#34;{{ item.pw | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
 group: employees
 groups: &amp;#34;{{ user_groups | join(&amp;#39;,&amp;#39;) }}&amp;#34;
 loop: &amp;#34;{{ newusers }}&amp;#34;
 loop_control:
 label: &amp;#34;{{ item.name }}&amp;#34;
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check loop-newusercreate.yml

playbook: loop-newusercreate.yml
[cnode@control-node ansible-lab]$ ansible-playbook --check loop-newusercreate.yml

PLAY [Provision development users] **************************************************

TASK [Gathering Facts] **************************************************************
ok: [dev2]
ok: [dev1]

TASK [Create required user groups] **************************************************
changed: [dev1] =&amp;gt; (item=developers)
changed: [dev2] =&amp;gt; (item=developers)
changed: [dev1] =&amp;gt; (item=managers)
changed: [dev2] =&amp;gt; (item=managers)
changed: [dev1] =&amp;gt; (item=admins)
changed: [dev2] =&amp;gt; (item=admins)
changed: [dev1] =&amp;gt; (item=employees)
changed: [dev2] =&amp;gt; (item=employees)

TASK [Create development users] *****************************************************
[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. The 
Python crypt module is deprecated and will be removed from Python 3.13. Install the 
passlib library for continued encryption functionality. This feature will be removed
 in version 2.17. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.
changed: [dev1] =&amp;gt; (item=newuser1)
changed: [dev2] =&amp;gt; (item=newuser1)
changed: [dev1] =&amp;gt; (item=newuser2)
changed: [dev2] =&amp;gt; (item=newuser2)
changed: [dev1] =&amp;gt; (item=newuser3)
changed: [dev2] =&amp;gt; (item=newuser3)
changed: [dev1] =&amp;gt; (item=newuser4pass)
changed: [dev2] =&amp;gt; (item=newuser4pass)

PLAY RECAP **************************************************************************
dev1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible-playbook loop-newusercreate.yml

PLAY [Provision development users] **************************************************

TASK [Gathering Facts] **************************************************************
ok: [dev2]
ok: [dev1]

TASK [Create required user groups] **************************************************
changed: [dev2] =&amp;gt; (item=developers)
changed: [dev1] =&amp;gt; (item=developers)
changed: [dev2] =&amp;gt; (item=managers)
changed: [dev1] =&amp;gt; (item=managers)
changed: [dev1] =&amp;gt; (item=admins)
changed: [dev2] =&amp;gt; (item=admins)
changed: [dev1] =&amp;gt; (item=employees)
changed: [dev2] =&amp;gt; (item=employees)

TASK [Create development users] *****************************************************
[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. The 
Python crypt module is deprecated and will be removed from Python 3.13. Install the 
passlib library for continued encryption functionality. This feature will be removed
 in version 2.17. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.
changed: [dev2] =&amp;gt; (item=newuser1)
changed: [dev1] =&amp;gt; (item=newuser1)
changed: [dev1] =&amp;gt; (item=newuser2)
changed: [dev2] =&amp;gt; (item=newuser2)
changed: [dev1] =&amp;gt; (item=newuser3)
changed: [dev2] =&amp;gt; (item=newuser3)
changed: [dev1] =&amp;gt; (item=newuser4pass)
changed: [dev2] =&amp;gt; (item=newuser4pass)

PLAY RECAP **************************************************************************
dev1 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ansible-playbook loop-newusercreate.yml

PLAY [Provision development users] ******************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [dev2]
ok: [dev1]

TASK [Create required user groups] ******************************************************************************************************************************************
ok: [dev1] =&amp;gt; (item=developers)
ok: [dev2] =&amp;gt; (item=developers)
ok: [dev1] =&amp;gt; (item=managers)
ok: [dev2] =&amp;gt; (item=managers)
ok: [dev2] =&amp;gt; (item=admins)
ok: [dev1] =&amp;gt; (item=admins)
ok: [dev1] =&amp;gt; (item=employees)
ok: [dev2] =&amp;gt; (item=employees)

TASK [Create development users] *********************************************************************************************************************************************
[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. The Python crypt module is deprecated and will be removed from Python 3.13. Install the 
passlib library for continued encryption functionality. This feature will be removed in version 2.17. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.
changed: [dev1] =&amp;gt; (item=newuser1)
changed: [dev2] =&amp;gt; (item=newuser1)
changed: [dev1] =&amp;gt; (item=newuser2)
changed: [dev2] =&amp;gt; (item=newuser2)
changed: [dev1] =&amp;gt; (item=newuser3)
changed: [dev2] =&amp;gt; (item=newuser3)
changed: [dev1] =&amp;gt; (item=newuser4pass)
changed: [dev2] =&amp;gt; (item=newuser4pass)

PLAY RECAP ******************************************************************************************************************************************************************
dev1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#39;getent group developers managers admins employees&amp;#39;
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
developers:x:1008:newuser1,newuser2,newuser3,newuser4pass
managers:x:1009:newuser1,newuser2,newuser3,newuser4pass
admins:x:1010:newuser1,newuser2,newuser3,newuser4pass
employees:x:1011:
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
developers:x:1008:newuser1,newuser2,newuser3,newuser4pass
managers:x:1009:newuser1,newuser2,newuser3,newuser4pass
admins:x:1010:newuser1,newuser2,newuser3,newuser4pass
employees:x:1011:

[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#39;getent passwd newuser1 newuser2 newuser3 newuser4pass&amp;#39;
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
newuser1:x:1008:1011::/home/newuser1:/bin/bash
newuser2:x:1009:1011::/home/newuser2:/bin/bash
newuser3:x:1010:1011::/home/newuser3:/bin/bash
newuser4pass:x:1011:1011::/home/newuser4pass:/bin/bash
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
newuser1:x:1008:1011::/home/newuser1:/bin/bash
newuser2:x:1009:1011::/home/newuser2:/bin/bash
newuser3:x:1010:1011::/home/newuser3:/bin/bash
newuser4pass:x:1011:1011::/home/newuser4pass:/bin/bash
[cnode@control-node ansible-lab]$

[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#39;id newuser1&amp;#39;
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1008(newuser1) gid=1011(employees) groups=1011(employees),1008(developers),1009(managers),1010(admins)
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1008(newuser1) gid=1011(employees) groups=1011(employees),1008(developers),1009(managers),1010(admins)
[cnode@control-node ansible-lab]$ 





-----


[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory loop-newusercreate.yml loop-usercreate.yml vars
[cnode@control-node ansible-lab]$ cp loop-usercreate.yml createusers.yml
[cnode@control-node ansible-lab]$ vim createusers.yml 



[cnode@control-node ansible-lab]$ vim createusers.yml
[cnode@control-node ansible-lab]$ cat createusers.yml 
---
# Create users 

- name: Create users on different machines
 hosts: all

 vars:
 devusers:
 - devuser2
 - devuser3
 - devuser4
 - devuser5

 testusers:
 - testuser1
 - testuser2
 - testuser3
 - testuser4
 
 produsers:
 - produser1
 - produser2
 - produser3
 - produser4

 tasks:
 - name: Add developer users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 state: present
 with_items: &amp;#34;{{ devusers }}&amp;#34;
 when: inventory_hostname in groups[&amp;#39;develop&amp;#39;]

 - name: Add test users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 state: present
 with_items: &amp;#34;{{ testusers }}&amp;#34;
 when: inventory_hostname in groups[&amp;#39;test&amp;#39;]

 - name: Add production users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 state: present
 with_items: &amp;#34;{{ produsers }}&amp;#34;
 when: inventory_hostname in groups[&amp;#39;production&amp;#39;]
[cnode@control-node ansible-lab]$ cat inventory 
[myself]
control-node

[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check createusers.yml 

playbook: createusers.yml

[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$ ansible-playbook --check createusers.yml 

PLAY [Create users on different machines] **********************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [prodserver]
ok: [dev2]
ok: [dev1]
ok: [testserver]

TASK [Add developer users] *************************************************************************************************************************************************
skipping: [testserver] =&amp;gt; (item=devuser2) 
skipping: [testserver] =&amp;gt; (item=devuser3) 
skipping: [testserver] =&amp;gt; (item=devuser4) 
skipping: [prodserver] =&amp;gt; (item=devuser2) 
skipping: [testserver] =&amp;gt; (item=devuser5) 
skipping: [prodserver] =&amp;gt; (item=devuser3) 
skipping: [testserver]
skipping: [prodserver] =&amp;gt; (item=devuser4) 
skipping: [prodserver] =&amp;gt; (item=devuser5) 
skipping: [prodserver]
changed: [dev2] =&amp;gt; (item=devuser2)
changed: [dev1] =&amp;gt; (item=devuser2)
changed: [dev1] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser4)
changed: [dev2] =&amp;gt; (item=devuser5)
changed: [dev1] =&amp;gt; (item=devuser5)

TASK [Add test users] ******************************************************************************************************************************************************
skipping: [dev1] =&amp;gt; (item=testuser1) 
skipping: [dev1] =&amp;gt; (item=testuser2) 
skipping: [dev1] =&amp;gt; (item=testuser3) 
skipping: [dev1] =&amp;gt; (item=testuser4) 
skipping: [dev1]
skipping: [dev2] =&amp;gt; (item=testuser1) 
skipping: [dev2] =&amp;gt; (item=testuser2) 
skipping: [dev2] =&amp;gt; (item=testuser3) 
skipping: [dev2] =&amp;gt; (item=testuser4) 
skipping: [dev2]
skipping: [prodserver] =&amp;gt; (item=testuser1) 
skipping: [prodserver] =&amp;gt; (item=testuser2) 
skipping: [prodserver] =&amp;gt; (item=testuser3) 
skipping: [prodserver] =&amp;gt; (item=testuser4) 
skipping: [prodserver]
changed: [testserver] =&amp;gt; (item=testuser1)
changed: [testserver] =&amp;gt; (item=testuser2)
changed: [testserver] =&amp;gt; (item=testuser3)
changed: [testserver] =&amp;gt; (item=testuser4)

TASK [Add production users] ************************************************************************************************************************************************
skipping: [dev1] =&amp;gt; (item=produser1) 
skipping: [dev1] =&amp;gt; (item=produser2) 
skipping: [dev1] =&amp;gt; (item=produser3) 
skipping: [dev1] =&amp;gt; (item=produser4) 
skipping: [dev1]
skipping: [testserver] =&amp;gt; (item=produser1) 
skipping: [dev2] =&amp;gt; (item=produser1) 
skipping: [dev2] =&amp;gt; (item=produser2) 
skipping: [dev2] =&amp;gt; (item=produser3) 
skipping: [testserver] =&amp;gt; (item=produser2) 
skipping: [testserver] =&amp;gt; (item=produser3) 
skipping: [dev2] =&amp;gt; (item=produser4) 
skipping: [dev2]
skipping: [testserver] =&amp;gt; (item=produser4) 
skipping: [testserver]
changed: [prodserver] =&amp;gt; (item=produser1)
changed: [prodserver] =&amp;gt; (item=produser2)
changed: [prodserver] =&amp;gt; (item=produser3)
changed: [prodserver] =&amp;gt; (item=produser4)

PLAY RECAP *****************************************************************************************************************************************************************
dev1 : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
dev2 : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
prodserver : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
testserver : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible-playbook createusers.yml

PLAY [Create users on different machines] **********************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [prodserver]
ok: [testserver]
ok: [dev1]
ok: [dev2]

TASK [Add developer users] *************************************************************************************************************************************************
skipping: [testserver] =&amp;gt; (item=devuser2) 
skipping: [testserver] =&amp;gt; (item=devuser3) 
skipping: [testserver] =&amp;gt; (item=devuser4) 
skipping: [testserver] =&amp;gt; (item=devuser5) 
skipping: [testserver]
skipping: [prodserver] =&amp;gt; (item=devuser2) 
skipping: [prodserver] =&amp;gt; (item=devuser3) 
skipping: [prodserver] =&amp;gt; (item=devuser4) 
skipping: [prodserver] =&amp;gt; (item=devuser5) 
skipping: [prodserver]
changed: [dev1] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser3)
changed: [dev1] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser4)
changed: [dev2] =&amp;gt; (item=devuser5)
changed: [dev1] =&amp;gt; (item=devuser5)

TASK [Add test users] ******************************************************************************************************************************************************
skipping: [dev1] =&amp;gt; (item=testuser1) 
skipping: [dev1] =&amp;gt; (item=testuser2) 
skipping: [dev1] =&amp;gt; (item=testuser3) 
skipping: [dev1] =&amp;gt; (item=testuser4) 
skipping: [dev2] =&amp;gt; (item=testuser1) 
skipping: [dev1]
skipping: [dev2] =&amp;gt; (item=testuser2) 
skipping: [dev2] =&amp;gt; (item=testuser3) 
skipping: [dev2] =&amp;gt; (item=testuser4) 
skipping: [prodserver] =&amp;gt; (item=testuser1) 
skipping: [dev2]
skipping: [prodserver] =&amp;gt; (item=testuser2) 
skipping: [prodserver] =&amp;gt; (item=testuser3) 
skipping: [prodserver] =&amp;gt; (item=testuser4) 
skipping: [prodserver]
changed: [testserver] =&amp;gt; (item=testuser1)
changed: [testserver] =&amp;gt; (item=testuser2)
changed: [testserver] =&amp;gt; (item=testuser3)
changed: [testserver] =&amp;gt; (item=testuser4)

TASK [Add production users] ************************************************************************************************************************************************
skipping: [dev1] =&amp;gt; (item=produser1) 
skipping: [dev1] =&amp;gt; (item=produser2) 
skipping: [dev1] =&amp;gt; (item=produser3) 
skipping: [dev1] =&amp;gt; (item=produser4) 
skipping: [dev2] =&amp;gt; (item=produser1) 
skipping: [dev1]
skipping: [dev2] =&amp;gt; (item=produser2) 
skipping: [dev2] =&amp;gt; (item=produser3) 
skipping: [dev2] =&amp;gt; (item=produser4) 
skipping: [testserver] =&amp;gt; (item=produser1) 
skipping: [dev2]
skipping: [testserver] =&amp;gt; (item=produser2) 
skipping: [testserver] =&amp;gt; (item=produser3) 
skipping: [testserver] =&amp;gt; (item=produser4) 
skipping: [testserver]
changed: [prodserver] =&amp;gt; (item=produser1)
changed: [prodserver] =&amp;gt; (item=produser2)
changed: [prodserver] =&amp;gt; (item=produser3)
changed: [prodserver] =&amp;gt; (item=produser4)

PLAY RECAP *****************************************************************************************************************************************************************
dev1 : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
dev2 : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
prodserver : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
testserver : ok=2 changed=1 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ls
ansible.cfg createusers.yml inventory loop-newusercreate.yml loop-usercreate.yml vars
[cnode@control-node ansible-lab]$ vim deleteusers.yml
[cnode@control-node ansible-lab]$ cat deleteusers.yml 
---
- name: Delete all created users from lab machines
 hosts: all
 become true
 gather_facts: false

 vars:
 users_to_delete:
 - devuser1
 - devuser2
 - devuser3
 - devuser4
 - devuser5
 - testuser1
 - testuser2
 - testuser3
 - testuser4
 - produser1
 - produser2
 - produser3
 - produser4
 
 tasks:
 - name: Delete created users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 state: absent
 remove: true
 loop: &amp;#34;{{ users_to_delete }}&amp;#34;

[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check deleteusers.yml 

[cnode@control-node ansible-lab]$ vim deleteusers.yml 
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check deleteusers.yml 

playbook: deleteusers.yml
[cnode@control-node ansible-lab]$ cat deleteusers.yml 
---
- name: Delete all created users from lab machines
 hosts: all
 become: true
 gather_facts: false

 vars:
 users_to_delete:
 - devuser1
 - devuser2
 - devuser3
 - devuser4
 - devuser5
 - testuser1
 - testuser2
 - testuser3
 - testuser4
 - produser1
 - produser2
 - produser3
 - produser4
 
 tasks:
 - name: Delete created users
 ansible.builtin.user:
 name: &amp;#34;{{ item }}&amp;#34;
 state: absent
 remove: true
 loop: &amp;#34;{{ users_to_delete }}&amp;#34;

[cnode@control-node ansible-lab]$ ansible-playbook --check deleteusers.yml 

PLAY [Delete all created users from lab machines] **************************************************************************************************************************

TASK [Delete created users] ************************************************************************************************************************************************
changed: [dev2] =&amp;gt; (item=devuser1)
ok: [testserver] =&amp;gt; (item=devuser1)
ok: [prodserver] =&amp;gt; (item=devuser1)
changed: [dev2] =&amp;gt; (item=devuser2)
ok: [testserver] =&amp;gt; (item=devuser2)
ok: [prodserver] =&amp;gt; (item=devuser2)
changed: [dev1] =&amp;gt; (item=devuser1)
ok: [prodserver] =&amp;gt; (item=devuser3)
changed: [dev1] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser3)
ok: [testserver] =&amp;gt; (item=devuser3)
ok: [prodserver] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser4)
ok: [testserver] =&amp;gt; (item=devuser4)
ok: [prodserver] =&amp;gt; (item=devuser5)
changed: [dev1] =&amp;gt; (item=devuser4)
changed: [dev2] =&amp;gt; (item=devuser5)
ok: [testserver] =&amp;gt; (item=devuser5)
ok: [prodserver] =&amp;gt; (item=testuser1)
changed: [dev1] =&amp;gt; (item=devuser5)
ok: [dev2] =&amp;gt; (item=testuser1)
changed: [testserver] =&amp;gt; (item=testuser1)
ok: [prodserver] =&amp;gt; (item=testuser2)
ok: [dev1] =&amp;gt; (item=testuser1)
changed: [testserver] =&amp;gt; (item=testuser2)
ok: [dev2] =&amp;gt; (item=testuser2)
ok: [prodserver] =&amp;gt; (item=testuser3)
ok: [dev1] =&amp;gt; (item=testuser2)
ok: [dev2] =&amp;gt; (item=testuser3)
changed: [testserver] =&amp;gt; (item=testuser3)
ok: [prodserver] =&amp;gt; (item=testuser4)
ok: [dev1] =&amp;gt; (item=testuser3)
changed: [testserver] =&amp;gt; (item=testuser4)
ok: [dev2] =&amp;gt; (item=testuser4)
ok: [dev1] =&amp;gt; (item=testuser4)
changed: [prodserver] =&amp;gt; (item=produser1)
ok: [testserver] =&amp;gt; (item=produser1)
ok: [dev2] =&amp;gt; (item=produser1)
changed: [prodserver] =&amp;gt; (item=produser2)
ok: [dev1] =&amp;gt; (item=produser1)
ok: [testserver] =&amp;gt; (item=produser2)
ok: [dev2] =&amp;gt; (item=produser2)
changed: [prodserver] =&amp;gt; (item=produser3)
ok: [dev1] =&amp;gt; (item=produser2)
ok: [testserver] =&amp;gt; (item=produser3)
ok: [dev2] =&amp;gt; (item=produser3)
ok: [dev1] =&amp;gt; (item=produser3)
changed: [prodserver] =&amp;gt; (item=produser4)
ok: [testserver] =&amp;gt; (item=produser4)
ok: [dev2] =&amp;gt; (item=produser4)
ok: [dev1] =&amp;gt; (item=produser4)

PLAY RECAP *****************************************************************************************************************************************************************
dev1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
prodserver : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook deleteusers.yml 

PLAY [Delete all created users from lab machines] **************************************************************************************************************************

TASK [Delete created users] ************************************************************************************************************************************************
ok: [prodserver] =&amp;gt; (item=devuser1)
ok: [testserver] =&amp;gt; (item=devuser1)
ok: [prodserver] =&amp;gt; (item=devuser2)
ok: [testserver] =&amp;gt; (item=devuser2)
changed: [dev1] =&amp;gt; (item=devuser1)
changed: [dev2] =&amp;gt; (item=devuser1)
ok: [prodserver] =&amp;gt; (item=devuser3)
ok: [testserver] =&amp;gt; (item=devuser3)
ok: [prodserver] =&amp;gt; (item=devuser4)
ok: [testserver] =&amp;gt; (item=devuser4)
changed: [dev1] =&amp;gt; (item=devuser2)
changed: [dev2] =&amp;gt; (item=devuser2)
ok: [prodserver] =&amp;gt; (item=devuser5)
ok: [testserver] =&amp;gt; (item=devuser5)
ok: [prodserver] =&amp;gt; (item=testuser1)
ok: [prodserver] =&amp;gt; (item=testuser2)
changed: [dev1] =&amp;gt; (item=devuser3)
changed: [dev2] =&amp;gt; (item=devuser3)
ok: [prodserver] =&amp;gt; (item=testuser3)
ok: [prodserver] =&amp;gt; (item=testuser4)
changed: [testserver] =&amp;gt; (item=testuser1)
changed: [dev1] =&amp;gt; (item=devuser4)
changed: [dev2] =&amp;gt; (item=devuser4)
changed: [prodserver] =&amp;gt; (item=produser1)
changed: [testserver] =&amp;gt; (item=testuser2)
changed: [dev1] =&amp;gt; (item=devuser5)
changed: [dev2] =&amp;gt; (item=devuser5)
ok: [dev1] =&amp;gt; (item=testuser1)
ok: [dev2] =&amp;gt; (item=testuser1)
ok: [dev1] =&amp;gt; (item=testuser2)
ok: [dev2] =&amp;gt; (item=testuser2)
changed: [prodserver] =&amp;gt; (item=produser2)
changed: [testserver] =&amp;gt; (item=testuser3)
ok: [dev1] =&amp;gt; (item=testuser3)
ok: [dev2] =&amp;gt; (item=testuser3)
ok: [dev1] =&amp;gt; (item=testuser4)
ok: [dev2] =&amp;gt; (item=testuser4)
ok: [dev1] =&amp;gt; (item=produser1)
ok: [dev2] =&amp;gt; (item=produser1)
changed: [prodserver] =&amp;gt; (item=produser3)
changed: [testserver] =&amp;gt; (item=testuser4)
ok: [dev1] =&amp;gt; (item=produser2)
ok: [dev2] =&amp;gt; (item=produser2)
ok: [testserver] =&amp;gt; (item=produser1)
ok: [dev2] =&amp;gt; (item=produser3)
ok: [dev1] =&amp;gt; (item=produser3)
changed: [prodserver] =&amp;gt; (item=produser4)
ok: [testserver] =&amp;gt; (item=produser2)
ok: [dev2] =&amp;gt; (item=produser4)
ok: [dev1] =&amp;gt; (item=produser4)
ok: [testserver] =&amp;gt; (item=produser3)
ok: [testserver] =&amp;gt; (item=produser4)

PLAY RECAP *****************************************************************************************************************************************************************
dev1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
prodserver : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>PL - 008 — Ansible Conditionals, Handlers and Tags</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-008-conditionals/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-008-conditionals/</guid><description>&lt;h3 id="ansible-conditionals-with-loops"&gt;Ansible Conditionals with Loops&lt;/h3&gt;
&lt;p&gt;Ansible conditionals allow tasks to be executed only when specified conditions are true.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;with_items &amp;ndash;&amp;gt; looping&lt;/li&gt;
&lt;li&gt;when &amp;ndash;&amp;gt; conditional execution&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: The passwords shown here are lab-only examples. In a real environment, credentials should not be stored in plaintext in a playbook or variables file. Use Ansible Vault or another secrets-management solution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ cat ansible.cfg 
[defaults]
inventory = ./inventory
remote_user = cnode

[privilege_escalation]
become = true
become_method = sudo
[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$ vim vars/newemployee.yml
[cnode@control-node ansible-lab]$ cat vars/newemployee.yml 
---
newemp:
 - name: suman
 pass: suman123
 team: developers
 - name: raman
 pass: raman123
 team: developers
 - name: ravi
 pass: ravi123
 team: production
 - name: tom
 pass: tom123
 team: testers 
[cnode@control-node ansible-lab]$ vim create_newemp.yml
[cnode@control-node ansible-lab]$ cat create_newemp.yml
---
# Create new employees

- name: play to create new employee
 hosts: all
 vars_files:
 - vars/newemployee.yml

 tasks:
 - name: Create a group
 ansible.builtin.group:
 name: newemp
 state: present

 - name: Create developer accounts
 ansible.builtin.user:
 name: &amp;#34;{{ item.name }}&amp;#34;
 password: &amp;#34;{{ item.pass | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
 groups: newemp
 with_items: &amp;#34;{{ newemp }}&amp;#34;
 when: 
 - item.team == &amp;#34;developers&amp;#34;
 - inventory_hostname in groups[&amp;#39;develop&amp;#39;]

 - name: Create production accounts
 ansible.builtin.user:
 name: &amp;#34;{{ item.name }}&amp;#34;
 password: &amp;#34;{{ item.pass | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
 groups: newemp
 with_items: &amp;#34;{{ newemp }}&amp;#34;
 when: 
 - item.team == &amp;#34;production&amp;#34; 
 - inventory_hostname in groups[&amp;#39;production&amp;#39;]

 - name: Create test accounts
 ansible.builtin.user:
 name: &amp;#34;{{ item.name }}&amp;#34;
 password: &amp;#34;{{ item.pass | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
 groups: newemp
 with_items: &amp;#34;{{ newemp }}&amp;#34;
 when: 
 - item.team == &amp;#34;testers&amp;#34; 
 - inventory_hostname in groups[&amp;#39;test&amp;#39;]
[cnode@control-node ansible-lab]$ 

PLAY [play to create new employee] **************************************************

TASK [Gathering Facts] **************************************************************
ok: [dev1]
ok: [testserver]
ok: [prodserver]
ok: [dev2]

TASK [Create a group] ***************************************************************
changed: [prodserver]
changed: [dev1]
changed: [testserver]
changed: [dev2]

TASK [Create developer accounts] ****************************************************
[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. The 
Python crypt module is deprecated and will be removed from Python 3.13. Install the 
passlib library for continued encryption functionality. This feature will be removed
 in version 2.17. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [testserver]
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [prodserver]
changed: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;})
changed: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;})
changed: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;})
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
changed: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;})
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 

TASK [Create production accounts] ***************************************************
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [dev1]
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [dev2]
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver]
changed: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;})
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 

TASK [Create test accounts] *********************************************************
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [dev1] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev1]
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [dev2] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [dev2]
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;suman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;suman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;raman&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;raman123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;developers&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;ravi&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;ravi123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;production&amp;#39;}) 
skipping: [prodserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;}) 
skipping: [prodserver]
changed: [testserver] =&amp;gt; (item={&amp;#39;name&amp;#39;: &amp;#39;tom&amp;#39;, &amp;#39;pass&amp;#39;: &amp;#39;tom123&amp;#39;, &amp;#39;team&amp;#39;: &amp;#39;testers&amp;#39;})

PLAY RECAP **************************************************************************
dev1 : ok=3 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
dev2 : ok=3 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
prodserver : ok=3 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 
testserver : ok=3 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ansible develop -m shell -a &amp;#39;id suman; id raman; getent group newemp&amp;#39;
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1012(suman) gid=1013(suman) groups=1013(suman),1012(newemp)
uid=1013(raman) gid=1014(raman) groups=1014(raman),1012(newemp)
newemp:x:1012:suman,raman
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1012(suman) gid=1013(suman) groups=1013(suman),1012(newemp)
uid=1013(raman) gid=1014(raman) groups=1014(raman),1012(newemp)
newemp:x:1012:suman,raman
[cnode@control-node ansible-lab]$ ansible production -m shell -a &amp;#39;id ravi; getent group newemp&amp;#39;
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1011(ravi) gid=1011(ravi) groups=1011(ravi),1003(newemp)
newemp:x:1003:ravi
[cnode@control-node ansible-lab]$ ansible test -m shell -a &amp;#39;id tom; getent group newemp&amp;#39;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1011(tom) gid=1011(tom) groups=1011(tom),1003(newemp)
newemp:x:1003:tom
[cnode@control-node ansible-lab]$ 


[cnode@control-node ansible-lab]$ ssh cnode@dev1
Last login: Sun Sep 13 07:30:16 2026 from 192.168.254.15
[cnode@dev1 ~]$ id suman
uid=1012(suman) gid=1013(suman) groups=1013(suman),1012(newemp)
[cnode@dev1 ~]$ id raman
uid=1013(raman) gid=1014(raman) groups=1014(raman),1012(newemp)
[cnode@dev1 ~]$ getent group newemp
newemp:x:1012:suman,raman
[cnode@dev1 ~]$
cnode@dev1 ~]$ exit
logout
Connection to dev1 closed.
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ssh cnode@prodserver
Last login: Sun Sep 13 07:30:56 2026 from 192.168.254.15
[cnode@prodserver ~]$ id ravi
uid=1011(ravi) gid=1011(ravi) groups=1011(ravi),1003(newemp)
[cnode@prodserver ~]$ getent group newemp
newemp:x:1003:ravi
[cnode@prodserver ~]$ exit
logout
Connection to prodserver closed.
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="handlers"&gt;Handlers&lt;/h3&gt;
&lt;p&gt;Handlers are special tasks in Ansible that run only when they are notified by another task.&lt;/p&gt;</description></item><item><title>PL - 007 — Ansible Loops, Conditionals, Variables and User Management</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-007-loops/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-007-loops/</guid><description>&lt;h3 id="concepts-covered-in-this-practical"&gt;Concepts Covered in This Practical&lt;/h3&gt;
&lt;h3 id="1-loops"&gt;1. Loops&lt;/h3&gt;
&lt;p&gt;Ansible loops allow the same task to be executed multiple times for different items.&lt;/p&gt;
&lt;p&gt;The modern syntax is &lt;code&gt;loop&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Create developer users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ansible.builtin.user&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ item }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;present&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;loop&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;{{ devusers }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, &lt;code&gt;item&lt;/code&gt; represents the current value from the &lt;code&gt;devusers&lt;/code&gt; list.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;devusers&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;devuser1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;devuser2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;devuser3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;devuser4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;devuser5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The task runs once for each user.&lt;/p&gt;
&lt;h4 id="with_items"&gt;&lt;code&gt;with_items&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;with_items&lt;/code&gt; is an older loop syntax that performs the same basic operation:&lt;/p&gt;</description></item><item><title>PL - 006 — Ansible Practice: Managing Secrets, Ansible Facts</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-006-secrets-mgmt/</link><pubDate>Sat, 12 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-006-secrets-mgmt/</guid><description>&lt;h3 id="managing-secrets"&gt;Managing Secrets&lt;/h3&gt;
&lt;h3 id="using-ansible-vault"&gt;Using Ansible Vault&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; Secret
 |
 v
 +----------------+
 | Ansible Vault |
 | Encryption |
 +----------------+
 |
 v
 Encrypted File
 |
 v
 Git Repository
 |
 v
 ansible-playbook
 |
 Vault password
 |
 v
 Decrypt at runtime
 |
 v
 Use secret securely
 |
 v
 Target System
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="lab-session"&gt;Lab Session&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ ls
ansible-lab done validate_nodes.sh
[cnode@control-node ~]$ cat validate_nodes.sh 
#!/bin/bash

nodes=(dev1 dev2 testserver prodserver)

for host in &amp;#34;${nodes[@]}&amp;#34;;
do
 echo &amp;#34;----- $host -----&amp;#34;

 ssh -o BatchMode=yes \
 -o PasswordAuthentication=no \
 &amp;#34;cnode@$host&amp;#34; &amp;#39;hostname; sudo -n whoami&amp;#39;
 
 echo
done
[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$ cd ansible-lab/
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory vars-play.yml
[cnode@control-node ansible-lab]$ mv vars-play.yml ../done/
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ ansible-vault create secret.yml
New Vault password: 
Confirm New Vault password: 
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory secret.yml
[cnode@control-node ansible-lab]$ ls -l secret.yml 
-rw-------. 1 cnode cnode 484 Sep 9 13:49 secret.yml
[cnode@control-node ansible-lab]$ cat secret.yml 
$ANSIBLE_VAULT;1.1;AES256
31346562356565383666336333613262303966326261336238643963653433613135386563623438
3735373036363637373432313931363465643432636266320a323839633832326436356165663931
63323432393761623661663363613666343666396439666235643138306263323462363737346565
3063663961343333330a313337663763616530306137623630313633353762323561363431663639
36343539666335643037323131653238306664623137306235363764323031306432313131623331
6537376564366539666561376132613662646639326530353539
[cnode@control-node ansible-lab]$ ansible-vault view secret.yml 
Vault password: 
ERROR! Decryption failed (no vault secrets were found that could decrypt) on secret.yml for secret.yml
[cnode@control-node ansible-lab]$ ansible-vault view secret.yml
Vault password: 
name: aadarsha
password: Nepal_123
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory secret.yml
[cnode@control-node ansible-lab]$ vim secretfile.yml
[cnode@control-node ansible-lab]$ cat secretfile.yml 
name: aadarsha
password: secret_password
[cnode@control-node ansible-lab]$ ansible-vault encrypt secretfile.yml
New Vault password: 
Confirm New Vault password: 
[WARNING]: Error in vault password prompt (default): Passwords do not match
ERROR! Passwords do not match
[cnode@control-node ansible-lab]$ ansible-vault encrypt secretfile.yml
New Vault password: 
Confirm New Vault password: 
Encryption successful
[cnode@control-node ansible-lab]$ cat secretfile.yml 
$ANSIBLE_VAULT;1.1;AES256
38663636393038663237656236396631663465383862386565333362313136653464306435653265
6365356638353263653437393733393638313536306539360a323765643462653961396338643064
36333564663061393637623538336564636666666133616465366331363361313338313333363538
3034656531323562640a303230623437313030623961306438393261646662616337383934336665
30663632393530363637353134633634646233653461356563386230366433393862373463313632
6265316164326134623837323238656434373838363266366532
[cnode@control-node ansible-lab]$ ansible-vault view secretfile.yml
Vault password: 
name: aadarsha
password: secret_password
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory secretfile.yml secret.yml
[cnode@control-node ansible-lab]$ ansible-vault rekey secret.yml 
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful
[cnode@control-node ansible-lab]$ 
[cnode@control-node ansible-lab]$ ansible-vault view secret.yml 
Vault password: 
name: aadarsha
password: Nepal_123
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ansible-vault --help

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory secretfile.yml secret.yml
[cnode@control-node ansible-lab]$ ansible-vault decrypt secret.yml 
Vault password: 
Decryption successful
[cnode@control-node ansible-lab]$ cat secret.yml 
name: aadarsha
password: Nepal_123
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
[cnode@control-node ansible-lab]$ ansible-inventory --list
{
 &amp;#34;_meta&amp;#34;: {
 &amp;#34;hostvars&amp;#34;: {}
 },
 &amp;#34;all&amp;#34;: {
 &amp;#34;children&amp;#34;: [
 &amp;#34;ungrouped&amp;#34;,
 &amp;#34;develop&amp;#34;,
 &amp;#34;testprod&amp;#34;
 ]
 },
 &amp;#34;develop&amp;#34;: {
 &amp;#34;hosts&amp;#34;: [
 &amp;#34;dev1&amp;#34;,
 &amp;#34;dev2&amp;#34;
 ]
 },
 &amp;#34;production&amp;#34;: {
 &amp;#34;hosts&amp;#34;: [
 &amp;#34;prodserver&amp;#34;
 ]
 },
 &amp;#34;test&amp;#34;: {
 &amp;#34;hosts&amp;#34;: [
 &amp;#34;testserver&amp;#34;
 ]
 },
 &amp;#34;testprod&amp;#34;: {
 &amp;#34;children&amp;#34;: [
 &amp;#34;test&amp;#34;,
 &amp;#34;production&amp;#34;
 ]
 }
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory secretfile.yml secret.yml
[cnode@control-node ansible-lab]$ mkdir vars
[cnode@control-node ansible-lab]$ ansible-vault create vars/userinfo.yml
New Vault password: 
Confirm New Vault password: 
[cnode@control-node ansible-lab]$ ls vars/
userinfo.yml
[cnode@control-node ansible-lab]$ vi vault_usercreate.yml
[cnode@control-node ansible-lab]$ vim vault_usercreate.yml 
[cnode@control-node ansible-lab]$ cat vault_usercreate.yml 
---
 # 
 
 - name: Create users using ansible vault
 hosts: dev
 
 vars_files:
 - vars/userinfo.yml
 
 tasks:
 - name: Add a user
 ansible.builtin.user:
 name: &amp;#34;{{ username }}&amp;#34;
 state: present
 password: &amp;#34;{{ password | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check --ask-vault-pass vault_usercreate.yml
Vault password: 
[WARNING]: Could not match supplied host pattern, ignoring: dev

playbook: vault_usercreate.yml
[cnode@control-node ansible-lab]$ vim vault_usercreate.yml 
[cnode@control-node ansible-lab]$ cat vault_usercreate.yml 
---
 # 
 
 - name: Create users using ansible vault
 hosts: develop
 
 vars_files:
 - vars/userinfo.yml
 
 tasks:
 - name: Add a user
 ansible.builtin.user:
 name: &amp;#34;{{ username }}&amp;#34;
 state: present
 password: &amp;#34;{{ password | password_hash(&amp;#39;sha512&amp;#39;) }}&amp;#34;
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check --ask-vault-pass vault_usercreate.yml
Vault password: 

playbook: vault_usercreate.yml
[cnode@control-node ansible-lab]$ ls
ansible.cfg secretfile.yml vars
inventory secret.yml vault_usercreate.yml
[cnode@control-node ansible-lab]$ echo &amp;#34;KhoYo123!&amp;#34; &amp;gt;passfile
[cnode@control-node ansible-lab]$ cat passfile 
KhoYo123!
[cnode@control-node ansible-lab]$ ls -l passfile 
-rw-r--r--. 1 cnode cnode 10 Sep 9 14:18 passfile
[cnode@control-node ansible-lab]$ chmod 400 passfile 
[cnode@control-node ansible-lab]$ ls -l passfile 
-r--------. 1 cnode cnode 10 Sep 9 14:18 passfile
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check --vault-password-file=passfile vault_usercreate.yml

playbook: vault_usercreate.yml
[cnode@control-node ansible-lab]$ ansible-playbook --vault-password-file=passfile vault_usercreate.yml

PLAY [Create users using ansible vault] ****************************************

TASK [Gathering Facts] *********************************************************
ok: [dev2]
ok: [dev1]

TASK [Add a user] **************************************************************
[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. 
The Python crypt module is deprecated and will be removed from Python 3.13. 
Install the passlib library for continued encryption functionality. This 
feature will be removed in version 2.17. Deprecation warnings can be disabled 
by setting deprecation_warnings=False in ansible.cfg.
changed: [dev1]
changed: [dev2]

PLAY RECAP *********************************************************************
dev1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-doc user

:
/EXAMPLES

/password
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ls
ansible.cfg passfile secret.yml vault_usercreate.yml
inventory secretfile.yml vars
[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.shell -a &amp;#34;id ram&amp;#34;
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1006(ram) gid=1006(ram) groups=1006(ram)
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1006(ram) gid=1006(ram) groups=1006(ram)
[cnode@control-node ansible-lab]$

[cnode@dev1 ~]$ hostname
dev1
[cnode@dev1 ~]$ grep ram /etc/passwd
ram:x:1006:1006::/home/ram:/bin/bash
[cnode@dev1 ~]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;hr&gt;
&lt;h3 id="managing-ansible-facts"&gt;Managing Ansible Facts&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Ansible facts are variables that are automatically discovered by ansible on a managed host&lt;/p&gt;</description></item><item><title>PL - 005 — Ansible Practice: Variables, Loops, Register, and Debug</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-005-variables/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-005-variables/</guid><description>&lt;h3 id="lab-session"&gt;Lab Session&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ ls
ansible-lab done validate_nodes.sh
[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$ cd ansible-lab/
[cnode@control-node ansible-lab]$

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory vars-play.yml
[cnode@control-node ansible-lab]$ vim vars-play.yml 
[cnode@control-node ansible-lab]$ cat vars-play.yml 
---
# Use of variables

- name: Deploy web, mail, and database services to test and production hosts
 hosts: testprod
 vars:
 web_pkg: httpd
 mail_pkg: postfix
 db_pkg: mariadb-server
 services:
 - httpd
 - postfix
 - mariadb
 firewall_rules:
 - http
 - https
 - smtp
 - mysql

 tasks:
 - name: Install the latest version of the packages
 ansible.builtin.yum:
 name:
 - &amp;#34;{{ web_pkg }}&amp;#34;
 - &amp;#34;{{ mail_pkg }}&amp;#34;
 - &amp;#34;{{ db_pkg }}&amp;#34;
 state: latest

 - name: Start services, if not started
 ansible.builtin.service:
 name: &amp;#34;{{ item }}&amp;#34;
 state: started
 enabled: yes
 with_items: &amp;#34;{{ services }}&amp;#34;

 - name: Permanently enable http, https, smtp, mysql
 ansible.posix.firewalld:
 service: &amp;#34;{{ item }}&amp;#34;
 state: enabled
 permanent: true
 immediate: true
 loop: &amp;#34;{{ firewall_rules }}&amp;#34;
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check vars-play.yml

playbook: vars-play.yml
[cnode@control-node ansible-lab]$ echo $?
0
[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.ping
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
testserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
[cnode@control-node ansible-lab]$ ansible-playbook vars-play.yml

PLAY [play to deploy web, mail and db services on the test and prod services] *******

TASK [Gathering Facts] **************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Install the latest version of the packages] ***********************************
changed: [prodserver]
changed: [testserver]

TASK [Start services, if not started] ***********************************************
changed: [testserver] =&amp;gt; (item=httpd)
changed: [prodserver] =&amp;gt; (item=httpd)
changed: [testserver] =&amp;gt; (item=postfix)
changed: [prodserver] =&amp;gt; (item=postfix)
changed: [testserver] =&amp;gt; (item=mariadb)
changed: [prodserver] =&amp;gt; (item=mariadb)

TASK [Permanently enable http, https, smtp, mysql] **********************************
changed: [testserver] =&amp;gt; (item=http)
changed: [prodserver] =&amp;gt; (item=http)
changed: [prodserver] =&amp;gt; (item=https)
changed: [testserver] =&amp;gt; (item=https)
changed: [prodserver] =&amp;gt; (item=smtp)
changed: [testserver] =&amp;gt; (item=smtp)
changed: [prodserver] =&amp;gt; (item=mysql)
changed: [testserver] =&amp;gt; (item=mysql)

PLAY RECAP **************************************************************************
prodserver : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.shell -a &amp;#34;rpm -q httpd postfix mariadb-server&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
httpd-2.4.63-16.el10.x86_64
postfix-3.8.5-11.el10.x86_64
mariadb-server-10.11.18-1.el10.x86_64
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
httpd-2.4.63-16.el10.x86_64
postfix-3.8.5-11.el10.x86_64
mariadb-server-10.11.18-1.el10.x86_64
[cnode@control-node ansible-lab]$

[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.shell -a &amp;#34;systemctl is-active httpd postfix mariadb&amp;#34;
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
active
active
active
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
active
active
active
[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.shell -a &amp;#34;systemctl is-enabled httpd postfix mariadb&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
enabled
enabled
enabled
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
enabled
enabled
enabled
[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.shell -a &amp;#34;firewall-cmd --list-services&amp;#34;
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
cockpit dhcpv6-client http https mysql smtp ssh
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
cockpit dhcpv6-client http https mysql smtp ssh
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-doc debug
...
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory vars-play.yml
[cnode@control-node ansible-lab]$ cd ../done/
[cnode@control-node done]$ ls
files multiplays.yml undeploy-webserver.yml webserver.yml
[cnode@control-node done]$ cp ../ansible-lab/ansible.cfg .
[cnode@control-node done]$ ls
ansible.cfg files multiplays.yml undeploy-webserver.yml webserver.yml
[cnode@control-node done]$ cp ../ansible-lab/inventory .
[cnode@control-node done]$ ls
ansible.cfg files inventory multiplays.yml undeploy-webserver.yml webserver.yml
[cnode@control-node done]$ cat ansible.cfg 
[defaults]
inventory = ./inventory
remote_user = cnode

[privilege_escalation]
become = true
become_method = sudo
[cnode@control-node done]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node done]$ cat webserver.yml 
---

- name: Configure Apache web server
 hosts: testprod
 
 tasks:

 # Install the Apache HTTP server package.
 - name: Install Apache web server
 ansible.builtin.yum:
 name: httpd
 state: latest

 # Start Apache and configure it to start automatically at boot. 
 - name: Start and enable Apache service
 ansible.builtin.service:
 name: httpd
 state: started
 enabled: yes

 # Open HTTP port 80 firewalld and make the change persistent.
 - name: Allow HTTP traffic through the firewall
 ansible.posix.firewalld:
 service: http
 state: enabled
 permanent: true
 immediate: true

 # Deploy the website&amp;#39;s index page to Apache&amp;#39;s document root.
 - name: Deploy website index page
 ansible.builtin.copy:
 src: files/index.html
 dest: /var/www/html/index.html
 owner: root
 group: root
 mode: &amp;#39;0644&amp;#39;
[cnode@control-node done]$ vim webserver.yml 
[cnode@control-node done]$ ansible-playbook --syntax-check webserver.yml
ERROR! Invalid variable name in &amp;#39;register&amp;#39; specified: &amp;#39;service-out&amp;#39;
[cnode@control-node done]$ vim webserver.yml 
[cnode@control-node done]$ ansible-playbook --syntax-check webserver.yml
ERROR! Invalid variable name in &amp;#39;register&amp;#39; specified: &amp;#39;service-out&amp;#39;
[cnode@control-node done]$ vim webserver.yml 
[cnode@control-node done]$ ansible-playbook --syntax-check webserver.yml

playbook: webserver.yml
[cnode@control-node done]$ cat webserver.yml
---

- name: Configure Apache web server
 hosts: testprod
 
 tasks:

 # Install the Apache HTTP server package.
 - name: Install Apache web server
 ansible.builtin.yum:
 name: httpd
 state: latest

 # Start Apache and configure it to start automatically at boot. 
 - name: Start and enable Apache service
 ansible.builtin.service:
 name: httpd
 state: started
 enabled: yes
 register: service_out
 
 # Display the result returned by the Apache service task. 
 - name: Print return information from the previous task
 ansible.builtin.debug:
 var: service_out

 # Open HTTP port 80 firewalld and make the change persistent.
 - name: Allow HTTP traffic through the firewall
 ansible.posix.firewalld:
 service: http
 state: enabled
 permanent: true
 immediate: true

 # Deploy the website&amp;#39;s index page to Apache&amp;#39;s document root.
 - name: Deploy website index page
 ansible.builtin.copy:
 src: files/index.html
 dest: /var/www/html/index.html
 owner: root
 group: root
 mode: &amp;#39;0644&amp;#39;
[cnode@control-node done]$ ansible-playbook webserver.yml

PLAY [Configure Apache web server] **************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Install Apache web server] ****************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Start and enable Apache service] **********************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Print return information from the previous task] ******************************************************************************************
ok: [testserver] =&amp;gt; {
 &amp;#34;service_out&amp;#34;: {
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;enabled&amp;#34;: true,
 &amp;#34;failed&amp;#34;: false,
 &amp;#34;name&amp;#34;: &amp;#34;httpd&amp;#34;,
 &amp;#34;state&amp;#34;: &amp;#34;started&amp;#34;,
 &amp;#34;status&amp;#34;: {
...
...
 &amp;#34;WatchdogUSec&amp;#34;: &amp;#34;0&amp;#34;
 }
 }
}

TASK [Allow HTTP traffic through the firewall] **************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Deploy website index page] ****************************************************************************************************************
changed: [testserver]
changed: [prodserver]

PLAY RECAP **************************************************************************************************************************************
prodserver : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=6 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node done]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;</description></item><item><title>PL - 004 — Ansible Practice: Multi-Play Playbook for Users and Groups</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-004-multi-play/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-004-multi-play/</guid><description>&lt;h3 id="lab-session"&gt;Lab Session&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory undeploy-webserver.yml webserver.yml
[cnode@control-node ansible-lab]$ vim usercreate.yml

[cnode@control-node ansible-lab]$ ansible-doc user
/EXAMPLES

[cnode@control-node ansible-lab]$ ansible-doc group
/EXAMPLES

[cnode@control-node ansible-lab]$ vim usercreate.yml
[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory undeploy-webserver.yml usercreate.yml webserver.yml
[cnode@control-node ansible-lab]$ mv usercreate.yml multiplays.yml
[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory multiplays.yml undeploy-webserver.yml webserver.yml
[cnode@control-node ansible-lab]$ mkdir done
[cnode@control-node ansible-lab]$ mv undeploy-webserver.yml webserver.yml done/
[cnode@control-node ansible-lab]$ ls
ansible.cfg done files inventory multiplays.yml
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check multiplays.yml 
[WARNING]: Could not match supplied host pattern, ignoring: dev

playbook: multiplays.yml
[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$ vim multiplays.yml 
[cnode@control-node ansible-lab]$ ansible-playbook --syntax-check multiplays.yml

playbook: multiplays.yml
[cnode@control-node ansible-lab]$

[cnode@control-node ansible-lab]$ ls
ansible.cfg done files inventory multiplays.yml
[cnode@control-node ansible-lab]$ vim multiplays.yml 
[cnode@control-node ansible-lab]$ cat multiplays.yml 
---
# Creating a multi-play playbook

- name: Create groups and users on develop nodes
 hosts: develop

 tasks:
 
 # Create a group &amp;#34;employee&amp;#34;

 - name: Create a group &amp;#34;employee&amp;#34;
 ansible.builtin.group:
 name: employee
 state: present

 # Create a group &amp;#34;devgroup&amp;#34;

 - name: Create a group &amp;#34;devgroup&amp;#34;
 ansible.builtin.group:
 name: devgroup
 state: present
 
 # create a user &amp;#34;user1&amp;#34; 
 
 - name: Add the user &amp;#39;user1&amp;#39;
 ansible.builtin.user:
 name: user1
 group: employee
 groups: devgroup
 uid: 1005
 state: present

- name: Create groups and users on testprod nodes
 hosts: testprod

 tasks:
 
 # Create a group &amp;#34;staff&amp;#34;

 - name: Create a group &amp;#34;staff&amp;#34;
 ansible.builtin.group:
 name: staff
 state: present

 # Create a group &amp;#34;maintainer&amp;#34;

 - name: Create a group &amp;#34;maintainer&amp;#34;
 ansible.builtin.group:
 name: maintainer
 state: present
 
 # create a user &amp;#34;user2&amp;#34; 
 
 - name: Add the user &amp;#39;user2&amp;#39;
 ansible.builtin.user:
 name: user2
 group: staff
 groups: maintainer
 uid: 1010
 state: present
[cnode@control-node ansible-lab]$ ansible-playbook --check multiplays.yml

PLAY [Create groups and users on develop nodes] *************************************

TASK [Gathering Facts] **************************************************************
ok: [dev1]
ok: [dev2]

TASK [Create a group &amp;#34;employee&amp;#34;] ****************************************************
changed: [dev2]
changed: [dev1]

TASK [Create a group &amp;#34;devgroup&amp;#34;] ****************************************************
changed: [dev2]
changed: [dev1]

TASK [Add the user &amp;#39;user1&amp;#39;] *********************************************************
changed: [dev2]
changed: [dev1]

PLAY [Create groups and users on testprod nodes] ************************************

TASK [Gathering Facts] **************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Create a group &amp;#34;staff&amp;#34;] *******************************************************
changed: [prodserver]
changed: [testserver]

TASK [Create a group &amp;#34;maintainer&amp;#34;] **************************************************
changed: [testserver]
changed: [prodserver]

TASK [Add the user &amp;#39;user2&amp;#39;] *********************************************************
changed: [testserver]
changed: [prodserver]

PLAY RECAP **************************************************************************
dev1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
prodserver : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible-playbook multiplays.yml 

PLAY [Create groups and users on develop nodes] *****************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [dev1]
ok: [dev2]

TASK [Create a group &amp;#34;employee&amp;#34;] ********************************************************************************************************************************************
changed: [dev1]
changed: [dev2]

TASK [Create a group &amp;#34;devgroup&amp;#34;] ********************************************************************************************************************************************
changed: [dev2]
changed: [dev1]

TASK [Add the user &amp;#39;user1&amp;#39;] *************************************************************************************************************************************************
changed: [dev1]
changed: [dev2]

PLAY [Create groups and users on testprod nodes] ****************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Create a group &amp;#34;staff&amp;#34;] ***********************************************************************************************************************************************
changed: [prodserver]
changed: [testserver]

TASK [Create a group &amp;#34;maintainer&amp;#34;] ******************************************************************************************************************************************
changed: [testserver]
changed: [prodserver]

TASK [Add the user &amp;#39;user2&amp;#39;] *************************************************************************************************************************************************
changed: [testserver]
changed: [prodserver]

PLAY RECAP ******************************************************************************************************************************************************************
dev1 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
dev2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
prodserver : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible develop -a &amp;#39;id user1&amp;#39;
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1005(user1) gid=1001(employee) groups=1001(employee),1002(devgroup)
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1005(user1) gid=1001(employee) groups=1001(employee),1002(devgroup)
[cnode@control-node ansible-lab]$ ansible develop -m ansible.builtin.getent -a &amp;#34;database=passwd&amp;#34;
dev1 | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;,
 &amp;#34;getent_passwd&amp;#34;: {
 ...
 &amp;#34;cnode&amp;#34;: [
 &amp;#34;x&amp;#34;,
 &amp;#34;1000&amp;#34;,
 &amp;#34;1000&amp;#34;,
 &amp;#34;Control Node&amp;#34;,
 &amp;#34;/home/cnode&amp;#34;,
 &amp;#34;/bin/bash&amp;#34;
 ],
 ...
 &amp;#34;user1&amp;#34;: [
 &amp;#34;x&amp;#34;,
 &amp;#34;1005&amp;#34;,
 &amp;#34;1001&amp;#34;,
 &amp;#34;&amp;#34;,
 &amp;#34;/home/user1&amp;#34;,
 &amp;#34;/bin/bash&amp;#34;
 ]
 }
 },
 &amp;#34;changed&amp;#34;: false
}
dev2 | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;,
 &amp;#34;getent_passwd&amp;#34;: {
 ...
 &amp;#34;user1&amp;#34;: [
 &amp;#34;x&amp;#34;,
 &amp;#34;1005&amp;#34;,
 &amp;#34;1001&amp;#34;,
 &amp;#34;&amp;#34;,
 &amp;#34;/home/user1&amp;#34;,
 &amp;#34;/bin/bash&amp;#34;
 ]
 }
 },
 &amp;#34;changed&amp;#34;: false
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible develop -a &amp;#34;getent group employee&amp;#34;
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
employee:x:1001:
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
employee:x:1001:
[cnode@control-node ansible-lab]$ ansible develop -a &amp;#34;getent group devgroup&amp;#34;
dev1 | CHANGED | rc=0 &amp;gt;&amp;gt;
devgroup:x:1002:user1
dev2 | CHANGED | rc=0 &amp;gt;&amp;gt;
devgroup:x:1002:user1
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible testprod -a &amp;#34;id user2&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1010(user2) gid=1001(staff) groups=1001(staff),1002(maintainer)
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1010(user2) gid=1001(staff) groups=1001(staff),1002(maintainer)
[cnode@control-node ansible-lab]$ ansible testprod -a &amp;#34;getent group staff&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
staff:x:1001:
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
staff:x:1001:
[cnode@control-node ansible-lab]$ ansible testprod -a &amp;#34;getent group maintainer&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
maintainer:x:1002:user2
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
maintainer:x:1002:user2
[cnode@control-node ansible-lab]$ echo $?
0
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-doc uri
...
[cnode@control-node ansible-lab]$
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>PL - 003 — Ansible Playbook: Automating Apache Web Server Deployment</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-003-ansible-playbook/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-003-ansible-playbook/</guid><description>&lt;h3 id="manual-steps-to-configure-the-apache-web-server"&gt;Manual Steps to Configure the Apache Web Server&lt;/h3&gt;
&lt;p&gt;The complete manual process is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Install Apache
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo dnf -y install httpd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Start and enable Apache
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo systemctl enable --now httpd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Allow HTTP through firewall
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo firewall-cmd --permanent --add-service&lt;span style="color:#f92672"&gt;=&lt;/span&gt;http
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Reload firewall
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Create index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo vi /var/www/html/index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Set ownership
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo chown root:root /var/www/html/index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Set permissions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo chmod &lt;span style="color:#ae81ff"&gt;644&lt;/span&gt; /var/www/html/index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Test Apache
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 sudo systemctl is-active httpd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 	 ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 Test website
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 curl http://localhost
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ ls
ansible-lab validate_nodes.sh
[cnode@control-node ~]$ ./validate_nodes.sh 
----- dev1 -----
dev1
root

----- dev2 -----
dev2
root

----- testserver -----
testserver
root

----- prodserver -----
prodserver
root

[cnode@control-node ~]$ cd ansible-lab/
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$ cat ansible.cfg 
[defaults]
inventory = ./inventory
remote_user = cnode

[privilege_escalation]
become = true
become_method = sudo
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="automation-steps-to-configure-web-servers-on-two-managed-nodes"&gt;Automation steps to configure web servers on two managed nodes&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ vi webserver.yml

[cnode@control-node ansible-lab]$ ansible-doc copy

[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory webserver.yml
[cnode@control-node ansible-lab]$ mkdir files
[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory webserver.yml
[cnode@control-node ansible-lab]$ vim files/index.html
[cnode@control-node ansible-lab]$ cat files/index.html 
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

[cnode@control-node ansible-lab]$ vim webserver.yml
[cnode@control-node ansible-lab]$ pwd
/home/cnode/ansible-lab
[cnode@control-node ansible-lab]$ vim webserver.yml
[cnode@control-node ansible-lab]$ cat webserver.yml 
- name: Configure Apache web server
 hosts: testprod
 
 tasks:

### Install the Apache HTTP server package.
 - name: Install Apache web server
 ansible.builtin.yum:
 name: httpd
 state: latest

 # Start Apache and configure it to start automatically at boot. 
 - name: Start and enable Apache service
 ansible.builtin.service:
 name: httpd
 state: started
 enabled: yes

 # Open HTTP port 80 firewalld and make the change persistent.
 - name: Allow HTTP traffic through the firewall
 ansible.posix.firewalld:
 service: http
 state: enabled
 permanent: true
 immediate: true

 # Deploy the website&amp;#39;s index page to Apache&amp;#39;s document root.
 - name: Deploy website index page
 ansible.builtin.copy:
 src: /home/cnode/ansible-lab/files/index.html
 dest: /var/www/html/index.html
 owner: root
 group: root
 mode: &amp;#39;0644&amp;#39;
[cnode@control-node ansible-lab]$ vim webserver.yml
[cnode@control-node ansible-lab]$ cat webserver.yml
---

- name: Configure Apache web server
 hosts: testprod
 
 tasks:

 # Install the Apache HTTP server package.
 - name: Install Apache web server
 ansible.builtin.yum:
 name: httpd
 state: latest

 # Start Apache and configure it to start automatically at boot. 
 - name: Start and enable Apache service
 ansible.builtin.service:
 name: httpd
 state: started
 enabled: yes

 # Open HTTP port 80 firewalld and make the change persistent.
 - name: Allow HTTP traffic through the firewall
 ansible.posix.firewalld:
 service: http
 state: enabled
 permanent: true
 immediate: true

 # Deploy the website&amp;#39;s index page to Apache&amp;#39;s document root.
 - name: Deploy website index page
 ansible.builtin.copy:
 src: files/index.html
 dest: /var/www/html/index.html
 owner: root
 group: root
 mode: &amp;#39;0644&amp;#39;
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory webserver.yml
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-galaxy collection list

# /home/cnode/.ansible/collections/ansible_collections
Collection Version
---------------------------------------- -------
community.crypto 3.4.0 
community.general 13.3.0 
community.library_inventory_filtering_v1 1.1.5 

# /usr/share/ansible/collections/ansible_collections
Collection Version
---------------------------------------- -------
microsoft.sql 2.6.6 
redhat.leapp 1.7.6 
redhat.rhel_system_roles 2.4.2 
[cnode@control-node ansible-lab]$ ansible-galaxy collection install ansible.posix
Starting galaxy collection install process
[WARNING]: Collection community.general does not support Ansible version 2.16.19
[WARNING]: Collection community.crypto does not support Ansible version 2.16.19
Process install dependency map
Starting collection install process
Downloading https://galaxy.ansible.com/api/v3/plugin/ansible/content/published/collections/artifacts/ansible-posix-2.2.2.tar.gz to /home/cnode/.ansible/tmp/ansible-local-4840p_p0zrme/tmpm4pk34fg/ansible-posix-2.2.2-iqb9w1az
Installing &amp;#39;ansible.posix:2.2.2&amp;#39; to &amp;#39;/home/cnode/.ansible/collections/ansible_collections/ansible/posix&amp;#39;
ansible.posix:2.2.2 was installed successfully
[cnode@control-node ansible-lab]$ ansible-galaxy collection list | grep ansible.posix 
ansible.posix 2.2.2 
[cnode@control-node ansible-lab]$ ansible-playbook webserver.yml --syntax-check

playbook: webserver.yml
[cnode@control-node ansible-lab]$ ansible testprod --list-hosts
 hosts (2):
 testserver
 prodserver
[cnode@control-node ansible-lab]$ ansible testprod -m ping
testserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook webserver.yml --syntax-check

playbook: webserver.yml
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook webserver.yml

PLAY [Configure Apache web server] **************************************************

TASK [Gathering Facts] **************************************************************
ok: [prodserver]
ok: [testserver]

TASK [Install Apache web server] ****************************************************
changed: [testserver]
changed: [prodserver]

TASK [Start and enable Apache service] **********************************************
changed: [testserver]
changed: [prodserver]

TASK [Allow HTTP traffic through the firewall] **************************************
changed: [testserver]
changed: [prodserver]

TASK [Deploy website index page] ****************************************************
changed: [testserver]
changed: [prodserver]

PLAY RECAP **************************************************************************
prodserver : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible testprod -m command -a &amp;#34;systemctl is-active httpd&amp;#34;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
active
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
active
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible testprod -m command -a &amp;#34;curl -s http://localhost&amp;#34;
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ curl http://testserver
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

[cnode@control-node ansible-lab]$ curl http://prodserver
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Ansible Lab&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;Hello from Ansible!&amp;lt;/h1&amp;gt;
 &amp;lt;p&amp;gt;This Apache web server was configured using Ansible.&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-playbook webserver.yml --check --diff
...

# DRY RUN

[cnode@control-node ansible-lab]$ ansible-playbook webserver.yml --check

PLAY [Configure Apache web server] *****************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Install Apache web server] *******************************************************************************************************************************************
ok: [prodserver]
ok: [testserver]

TASK [Start and enable Apache service] *************************************************************************************************************************************
ok: [prodserver]
ok: [testserver]

TASK [Allow HTTP traffic through the firewall] *****************************************************************************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Deploy website index page] *******************************************************************************************************************************************
ok: [prodserver]
ok: [testserver]

PLAY RECAP *****************************************************************************************************************************************************************
prodserver : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id="undeploy-the-apache-web-server"&gt;Undeploy the Apache web server.&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ls
ansible.cfg files inventory webserver.yml
[cnode@control-node ansible-lab]$ cp webserver.yml undeploy-webserver.yml
[cnode@control-node ansible-lab]$ vim undeploy-webserver.yml
[cnode@control-node ansible-lab]$ ansible-doc firewalld
...

[cnode@control-node ansible-lab]$ vim undeploy-webserver.yml 
[cnode@control-node ansible-lab]$ cat undeploy-webserver.yml
---

- name: Undeploy Apache web server
 hosts: testprod
 
 tasks:

 # Remove the HTTP service from firewalld.
 - name: Remove HTTP traffic from the firewall
 ansible.posix.firewalld:
 service: http
 state: disabled
 permanent: true
 immediate: true

 # Stop Apache and prevent it from starting automatically
 - name: Stop and disable Apache service
 ansible.builtin.service:
 name: httpd
 state: stopped
 enabled: false

 # Remove the deployed website.
 - name: Remove website index page
 ansible.builtin.file:
 path: /var/www/html/index.html
 state: absent

 # Uninstall the Apache HTTP server package.
 - name: Remove Apache web server
 ansible.builtin.yum:
 name: httpd
 state: absent
[cnode@control-node ansible-lab]$ ansible-playbook undeploy-webserver.yml --syntax-check

playbook: undeploy-webserver.yml
[cnode@control-node ansible-lab]$ ansible testprod --list-hosts
 hosts (2):
 testserver
 prodserver
[cnode@control-node ansible-lab]$ ansible-playbook --check undeploy-webserver.yml

PLAY [Undeploy Apache web server] ***************************************************

TASK [Gathering Facts] **************************************************************
ok: [prodserver]
ok: [testserver]

TASK [Remove HTTP traffic from the firewall] ****************************************
changed: [prodserver]
changed: [testserver]

TASK [Stop and disable Apache service] **********************************************
changed: [prodserver]
changed: [testserver]

TASK [Remove website index page] ****************************************************
changed: [testserver]
changed: [prodserver]

TASK [Remove Apache web server] *****************************************************
changed: [prodserver]
changed: [testserver]

PLAY RECAP **************************************************************************
prodserver : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ ansible-playbook undeploy-webserver.yml

PLAY [Undeploy Apache web server] ***************************************************

TASK [Gathering Facts] **************************************************************
ok: [testserver]
ok: [prodserver]

TASK [Remove HTTP traffic from the firewall] ****************************************
changed: [prodserver]
changed: [testserver]

TASK [Stop and disable Apache service] **********************************************
changed: [prodserver]
changed: [testserver]

TASK [Remove website index page] ****************************************************
changed: [testserver]
changed: [prodserver]

TASK [Remove Apache web server] *****************************************************
changed: [prodserver]
changed: [testserver]

PLAY RECAP **************************************************************************
prodserver : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 
testserver : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible testprod -m command -a &amp;#34;systemctl is-active httpd&amp;#34;
testserver | FAILED | rc=4 &amp;gt;&amp;gt;
inactivenon-zero return code
prodserver | FAILED | rc=4 &amp;gt;&amp;gt;
inactivenon-zero return code

[cnode@control-node ansible-lab]$ ansible testprod -m command -a &amp;#34;rpm -q httpd&amp;#34;
testserver | FAILED | rc=1 &amp;gt;&amp;gt;
package httpd is not installednon-zero return code
prodserver | FAILED | rc=1 &amp;gt;&amp;gt;
package httpd is not installednon-zero return code
[cnode@control-node ansible-lab]$ curl http://testserver
curl: (7) Failed to connect to testserver port 80 after 1 ms: Could not connect to server
[cnode@control-node ansible-lab]$ curl http://prodserver
curl: (7) Failed to connect to prodserver port 80 after 1 ms: Could not connect to server
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>PL - 002 — Ansible Fundamentals: Inventory, Ad-Hoc Commands, and Collections</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-002-fundamentals/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-002-fundamentals/</guid><description>&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ~]$ pwd
/home/cnode
[cnode@control-node ~]$ ls
ansible-lab validate_nodes.sh
[cnode@control-node ~]$ cd ansible-lab/
[cnode@control-node ansible-lab]$ pwd
/home/cnode/ansible-lab
[cnode@control-node ansible-lab]$ ls
ansible.cfg inventory
[cnode@control-node ansible-lab]$ cat ansible.cfg 
[defaults]
inventory=/home/cnode/ansible-lab/inventory
remote_user=cnode

[privilege_escalation]
become=true
[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[all:vars]
ansible_user=cnode
ansible_become=true
ansible_become_method=sudo
[cnode@control-node ansible-lab]$ vim inventory 
[cnode@control-node ansible-lab]$ vim ansible.cfg
[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
prodserver
[cnode@control-node ansible-lab]$ cat ansible.cfg
[defaults]
inventory = ./inventory
remote_user = cnode

[privilege_escalation]
become = true
become_method = sudo

[cnode@control-node ansible-lab]$ vim inventory 
[cnode@control-node ansible-lab]$ cat inventory 
[develop]
dev1
dev2

[test]
testserver

[production]
prodserver

[testprod:children]
test
production
[cnode@control-node ansible-lab]$ ansible-inventory --graph
@all:
 |--@ungrouped:
 |--@develop:
 | |--dev1
 | |--dev2
 |--@testprod:
 | |--@test:
 | | |--testserver
 | |--@production:
 | | |--prodserver
[cnode@control-node ansible-lab]$ ansible all -m ping
testserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
dev1 | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
dev2 | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.user -a &amp;#39;name=testuser state=absent&amp;#39;
prodserver | SUCCESS =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: false,
 &amp;#34;name&amp;#34;: &amp;#34;testuser&amp;#34;,
 &amp;#34;state&amp;#34;: &amp;#34;absent&amp;#34;
}
testserver | CHANGED =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: true,
 &amp;#34;force&amp;#34;: false,
 &amp;#34;name&amp;#34;: &amp;#34;testuser&amp;#34;,
 &amp;#34;remove&amp;#34;: false,
 &amp;#34;state&amp;#34;: &amp;#34;absent&amp;#34;
}
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.command -a &amp;#39;sudo useradd testuser&amp;#39;
prodserver | FAILED | rc=9 &amp;gt;&amp;gt;
useradd: user &amp;#39;testuser&amp;#39; already existsnon-zero return code
testserver | FAILED | rc=9 &amp;gt;&amp;gt;
useradd: user &amp;#39;testuser&amp;#39; already existsnon-zero return code
[cnode@control-node ansible-lab]$ echo $?
0
[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.command -a &amp;#39;id testuser&amp;#39;
testserver | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)
prodserver | CHANGED | rc=0 &amp;gt;&amp;gt;
uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)
[cnode@control-node ansible-lab]$ 

# before deletion

[cnode@testserver ~]$ grep testuser /etc/passwd
testuser:x:1001:1001::/home/testuser:/bin/bash

[cnode@prodserver ~]$ grep testuser /etc/passwd
testuser:x:1001:1001::/home/testuser:/bin/bash
 
# after deletion

[cnode@control-node ansible-lab]$ ansible testprod -m ansible.builtin.user -a &amp;#39;name=testuser state=absent remove=yes&amp;#39;
prodserver | CHANGED =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: true,
 &amp;#34;force&amp;#34;: false,
 &amp;#34;name&amp;#34;: &amp;#34;testuser&amp;#34;,
 &amp;#34;remove&amp;#34;: true,
 &amp;#34;state&amp;#34;: &amp;#34;absent&amp;#34;
}
testserver | CHANGED =&amp;gt; {
 &amp;#34;ansible_facts&amp;#34;: {
 &amp;#34;discovered_interpreter_python&amp;#34;: &amp;#34;/usr/bin/python3&amp;#34;
 },
 &amp;#34;changed&amp;#34;: true,
 &amp;#34;force&amp;#34;: false,
 &amp;#34;name&amp;#34;: &amp;#34;testuser&amp;#34;,
 &amp;#34;remove&amp;#34;: true,
 &amp;#34;state&amp;#34;: &amp;#34;absent&amp;#34;
}
[cnode@control-node ansible-lab]$ 

# and

[cnode@prodserver ~]$ grep testuser /etc/passwd
[cnode@prodserver ~]$ 

[cnode@testserver ~]$ grep testuser /etc/passwd
[cnode@testserver ~]$ 

[cnode@control-node ansible-lab]$ ansible testprod -m command -a &amp;#39;id testuser&amp;#39;
testserver | FAILED | rc=1 &amp;gt;&amp;gt;
id: ‘testuser’: no such usernon-zero return code
prodserver | FAILED | rc=1 &amp;gt;&amp;gt;
id: ‘testuser’: no such usernon-zero return code
[cnode@control-node ansible-lab]$ echo $?
2
[cnode@control-node ansible-lab]$ 
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[cnode@control-node ansible-lab]$ ansible --version
ansible [core 2.16.19]
 config file = /home/cnode/ansible-lab/ansible.cfg
 configured module search path = [&amp;#39;/home/cnode/.ansible/plugins/modules&amp;#39;, &amp;#39;/usr/share/ansible/plugins/modules&amp;#39;]
 ansible python module location = /usr/lib/python3.12/site-packages/ansible
 ansible collection location = /home/cnode/.ansible/collections:/usr/share/ansible/collections
 executable location = /usr/bin/ansible
 python version = 3.12.13 (main, Apr 16 2026, 00:00:00) [GCC 14.3.1 20251022 (Red Hat 14.3.1-4)] (/usr/bin/python3)
 jinja version = 3.1.6
 libyaml = True
[cnode@control-node ansible-lab]$ ansible-galaxy --version
ansible-galaxy [core 2.16.19]
 config file = /home/cnode/ansible-lab/ansible.cfg
 configured module search path = [&amp;#39;/home/cnode/.ansible/plugins/modules&amp;#39;, &amp;#39;/usr/share/ansible/plugins/modules&amp;#39;]
 ansible python module location = /usr/lib/python3.12/site-packages/ansible
 ansible collection location = /home/cnode/.ansible/collections:/usr/share/ansible/collections
 executable location = /usr/bin/ansible-galaxy
 python version = 3.12.13 (main, Apr 16 2026, 00:00:00) [GCC 14.3.1 20251022 (Red Hat 14.3.1-4)] (/usr/bin/python3)
 jinja version = 3.1.6
 libyaml = True
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ ansible-galaxy collection list

# /usr/share/ansible/collections/ansible_collections
Collection Version
------------------------ -------
microsoft.sql 2.6.6 
redhat.leapp 1.7.6 
redhat.rhel_system_roles 2.4.2 
[cnode@control-node ansible-lab]$

[cnode@control-node ansible-lab]$ sudo dnf list *roles*
Last metadata expiration check: 0:17:15 ago on Mon 07 Sep 2026 01:22:42 PM +0545.
Installed Packages
rhel-system-roles.noarch 2.4.2-0.1.el10 @appstream
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ sudo dnf -y install rhel-system-roles
Last metadata expiration check: 0:33:48 ago on Mon 07 Sep 2026 01:22:42 PM +0545.
Package rhel-system-roles-2.4.2-0.1.el10.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[cnode@control-node ansible-lab]$ 

[cnode@control-node ansible-lab]$ dnf list ansible-core ansible
Last metadata expiration check: 0:01:41 ago on Mon 07 Sep 2026 01:58:36 PM +0545.
Installed Packages
ansible-core.noarch 1:2.16.19-2.el10 @appstream
[cnode@control-node ansible-lab]$ 

# To install collection, general syntax:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ansible-galaxy collection install &lt;!-- raw HTML omitted --&gt;.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description></item><item><title>PL - 001 — Installation ansible-core and Ad-hoc commands</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-001-adhoc-command/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-001-adhoc-command/</guid><description>&lt;h1 id="ansible-ad-hoc-commands"&gt;Ansible Ad-Hoc Commands&lt;/h1&gt;
&lt;p&gt;Ansible &lt;strong&gt;ad-hoc commands&lt;/strong&gt; are quick, one-line commands executed from the
control node using the &lt;code&gt;ansible&lt;/code&gt; command-line tool.&lt;/p&gt;
&lt;p&gt;They are useful for performing a &lt;strong&gt;single task&lt;/strong&gt; across one or more managed
hosts without writing a reusable Ansible playbook.&lt;/p&gt;
&lt;p&gt;Ad-hoc commands are particularly useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Testing connectivity to managed hosts&lt;/li&gt;
&lt;li&gt;Gathering system information&lt;/li&gt;
&lt;li&gt;Managing users and groups&lt;/li&gt;
&lt;li&gt;Managing files and directories&lt;/li&gt;
&lt;li&gt;Installing or removing packages&lt;/li&gt;
&lt;li&gt;Starting, stopping, or restarting services&lt;/li&gt;
&lt;li&gt;Executing commands on multiple hosts&lt;/li&gt;
&lt;li&gt;Performing quick administrative tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="1-basic-syntax"&gt;1. Basic Syntax&lt;/h2&gt;
&lt;p&gt;The general syntax of an Ansible ad-hoc command is:&lt;/p&gt;</description></item><item><title>Infrastructure Automation &amp; Ansible | Local Linux Lab Environment for Ansible</title><link>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-000-introduction/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://aadarshakhadka.com.np/practice-log/infrastructure/pl-000-introduction/</guid><description>&lt;h3 id="infrastructure-automation"&gt;Infrastructure Automation&lt;/h3&gt;
&lt;p&gt;Infrastructure Automation is the programmatic lifecycle management of computing environments using code. It replaces manual, error-prone terminal commands with repeatable workflows to provision, configure, and secure servers, networks, and services.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Instead of manually logging into 20 servers to update firewall rules, tweak sshd_config, or deploy patches, an infrastructure automation tool applies these changes concurrently across the entire fleet in seconds—guaranteeing 100% consistency, eliminating configuration drift, and ensuring full idempotency (where running the automation 10 times yields the exact same safe, stable state).&lt;/p&gt;</description></item></channel></rss>