MODUL ANSIBLE
Di setiap host
root@tusirah:~# [Link] /etc/ssh/sshd_config
PermitRootLogin yes
reboot os debian
control node
sudo su -
ssh-keygen
ssh-copy-id root@[Link]
ssh-copy-id root@[Link]
test koneksi server debian
masih sebagai root control node
ssh root@[Link]
ssh root@[Link]
harus bisa login root tanpa password
Node Control
mkdir /etc/ansible
[Link] /etc/ansible/hosts
[servers]
server1 ansible_host=[Link]
server2 ansible_host=[Link]
[all:vars]
ansible_python_interpreter=/usr/bin/python3
ansible-inventory --list -y
all:
children:
servers:
hosts:
server1:
ansible_host: [Link]
ansible_python_interpreter: /usr/bin/python3
server2:
ansible_host: [Link]
ansible_python_interpreter: /usr/bin/python3
ansible all -m ping -u root
server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
root@tusirah:~# ansible all -m command -a "uname -a" -u root
server1 | CHANGED | rc=0 >>
Linux debianfw 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian
6.1.129-1 (2025-03-06) x86_64 GNU/Linux
server2 | CHANGED | rc=0 >>
Linux server2 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian
6.1.129-1 (2025-03-06) x86_64 GNU/Linux
root@tusirah:~# ansible all -m command -a "whoami" -u root
server2 | CHANGED | rc=0 >>
root
server1 | CHANGED | rc=0 >>
root
cat /etc/ansible/hosts > [Link]
[Link] [Link]
[servers]
server1 ansible_host=[Link] ansible_user=root
server2 ansible_host=[Link] ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
[Link] [Link]
- name: My first play
hosts: server1
tasks:
- name: Ping my hosts
[Link]:
- name: Print message
[Link]:
msg: Hello world
- name: Server dua
hosts: server2
tasks:
- name: Ping my hosts
[Link]:
- name: Print message
[Link]:
msg: Hello world
atau group juga bisa
[Link] [Link]
- name: My first play
hosts: servers
tasks:
- name: Ping my hosts
[Link]:
- name: Print message
[Link]:
msg: Hello world
command playbook
ansible-playbook -i [Link] [Link]
PLAY [My first play]
******************************************************************
***********************
TASK [Gathering Facts]
******************************************************************
*********************
ok: [server1]
TASK [Ping my hosts]
******************************************************************
***********************
ok: [server1]
TASK [Print message]
******************************************************************
***********************
ok: [server1] => {
"msg": "Hello world"
}
PLAY [Server dua]
******************************************************************
**************************
TASK [Gathering Facts]
******************************************************************
*********************
ok: [server2]
TASK [Ping my hosts]
******************************************************************
***********************
ok: [server2]
TASK [Print message]
******************************************************************
***********************
ok: [server2] => {
"msg": "Hello world"
}
PLAY RECAP
******************************************************************
*********************************
server1 : ok=3 changed=0 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
server2 : ok=3 changed=0 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
root@tusirah:~# ansible-playbook -i [Link] [Link]
PLAY [My first play]
******************************************************************
***********************
TASK [Gathering Facts]
******************************************************************
*********************
ok: [server2]
ok: [server1]
TASK [Ping my hosts]
******************************************************************
***********************
ok: [server1]
ok: [server2]
TASK [Print message]
******************************************************************
***********************
ok: [server1] => {
"msg": "Hello world"
}
ok: [server2] => {
"msg": "Hello world"
}
PLAY RECAP
******************************************************************
*********************************
server1 : ok=3 changed=0 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
server2 : ok=3 changed=0 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
adduser debian host
[Link] [Link]
- name: Create a user
hosts: server1
become: yes
tasks:
- name: Add user odik
user:
name: odik
shell: /bin/bash
home: /home/odik
root@tusirah:~# ansible-playbook -i [Link] [Link]
PLAY [Create a user]
******************************************************************
***********************
TASK [Gathering Facts]
******************************************************************
*********************
ok: [server1]
TASK [Add user odik]
******************************************************************
***********************
changed: [server1]
PLAY RECAP
******************************************************************
*********************************
server1 : ok=2 changed=1 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
[Link] [Link]
- name: Test Ping and Uname
hosts: all
gather_facts: no
tasks:
- name: Ping target hosts
[Link]:
- name: Get system information
[Link]: uname -a
register: uname_output
- name: Show system information
[Link]:
msg: "{{ uname_output.stdout }}"
root@tusirah:~# ansible-playbook -i [Link] [Link]
PLAY [Test Ping and Uname]
******************************************************************
*****************
TASK [Ping target hosts]
******************************************************************
*******************
ok: [server1]
ok: [server2]
TASK [Get system information]
******************************************************************
**************
changed: [server2]
changed: [server1]
TASK [Show system information]
******************************************************************
*************
ok: [server1] => {
"msg": "Linux debianfw 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC
Debian 6.1.129-1 (2025-03-06) x86_64 GNU/Linu
x"
}
ok: [server2] => {
"msg": "Linux server2 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC
Debian 6.1.129-1 (2025-03-06) x86_64 GNU/Linux
"
}
PLAY RECAP
******************************************************************
*********************************
server1 : ok=3 changed=1 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
server2 : ok=3 changed=1 unreachable=0
failed=0 skipped=0 rescued=0 ignor
ed=0
Rubah Hostname
cat [Link]
[servers]
server1 ansible_host=[Link] ansible_user=root
server2 ansible_host=[Link] ansible_user=root
server3 ansible_host=[Link] ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
[Link] [Link]
- name: Configure Hostname on Multiple Servers
hosts: all
become: yes
vars:
server_hostnames:
- { name: "server1", ip: "[Link]" }
- { name: "server2", ip: "[Link]" }
- { name: "server3", ip: "[Link]" }
tasks:
- name: Set hostname
hostname:
name: "{{ [Link] }}"
loop: "{{ server_hostnames }}"
when: ansible_default_ipv4.address == [Link]
- name: Update /etc/hosts file
lineinfile:
path: /etc/hosts
regexp: '^[Link]'
line: "[Link] {{ [Link] }}"
loop: "{{ server_hostnames }}"
when: ansible_default_ipv4.address == [Link]
- name: Restart hostname service (if required)
command: hostnamectl set-hostname {{ [Link] }}
loop: "{{ server_hostnames }}"
when: ansible_default_ipv4.address == [Link] and
ansible_distribution in ["Ubuntu", "Debian"]
ansible-playbook -i [Link] [Link]
PLAY [Configure Hostname on Multiple Servers]
****************************************************************
TASK [Gathering Facts]
******************************************************************
*********************
ok: [server1]
ok: [server3]
ok: [server2]
TASK [Set hostname]
******************************************************************
************************
skipping: [server2] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server3] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server3] => (item={'name': 'server2', 'ip':
'[Link]'})
ok: [server2] => (item={'name': 'server2', 'ip': '[Link]'})
skipping: [server2] => (item={'name': 'server3', 'ip':
'[Link]'})
changed: [server3] => (item={'name': 'server3', 'ip':
'[Link]'})
changed: [server1] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server1] => (item={'name': 'server2', 'ip':
'[Link]'})
skipping: [server1] => (item={'name': 'server3', 'ip':
'[Link]'})
TASK [Update /etc/hosts file]
******************************************************************
**************
skipping: [server2] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server3] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server3] => (item={'name': 'server2', 'ip':
'[Link]'})
changed: [server2] => (item={'name': 'server2', 'ip':
'[Link]'})
skipping: [server2] => (item={'name': 'server3', 'ip':
'[Link]'})
changed: [server3] => (item={'name': 'server3', 'ip':
'[Link]'})
changed: [server1] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server1] => (item={'name': 'server2', 'ip':
'[Link]'})
skipping: [server1] => (item={'name': 'server3', 'ip':
'[Link]'})
TASK [Restart hostname service (if required)]
****************************************************************
skipping: [server2] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server3] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server3] => (item={'name': 'server2', 'ip':
'[Link]'})
changed: [server3] => (item={'name': 'server3', 'ip':
'[Link]'})
changed: [server1] => (item={'name': 'server1', 'ip':
'[Link]'})
skipping: [server1] => (item={'name': 'server2', 'ip':
'[Link]'})
skipping: [server1] => (item={'name': 'server3', 'ip':
'[Link]'})
changed: [server2] => (item={'name': 'server2', 'ip':
'[Link]'})
skipping: [server2] => (item={'name': 'server3', 'ip':
'[Link]'})
PLAY RECAP
******************************************************************
*********************************
server1 : ok=4 changed=3 unreachable=0
failed=0 skipped=0 rescued=0 ignored=0
server2 : ok=4 changed=2 unreachable=0
failed=0 skipped=0 rescued=0 ignored=0
server3 : ok=4 changed=3 unreachable=0
failed=0 skipped=0 rescued=0 ignored=0
USER Import dan CSV
cat [Link]
username,password,shell,groups
utik,pass123,/bin/bash,sudo
doni,pass123,/bin/bash,developer
roni,pass123,/bin/bash,sales
rudi,pass123,/bin/bash,sales
[Link] [Link]
---
- name: Import users from CSV and create accounts
hosts: all
become: yes
tasks:
- name: Copy CSV file to remote servers
[Link]:
src: "/home/budi/workflow/hosts/[Link]"
dest: "/tmp/[Link]"
mode: '0644'
- name: Read CSV file from remote server
[Link].read_csv:
path: "/tmp/[Link]"
register: users_list
- name: Ensure required groups exist
[Link]:
name: "{{ item }}"
state: present
loop:
- sudo
- sales
- developer
- name: Create users from CSV data
[Link]:
name: "{{ [Link] }}"
password: "{{ [Link] | password_hash('sha512') }}"
shell: "{{ [Link] }}"
groups: "{{ [Link] }}"
append: yes
loop: "{{ users_list.list }}"
ansible-playbook -i [Link] [Link]
PLAY [Import users from CSV and create accounts]
******************************************************************
******************************************************************
*******
TASK [Gathering Facts]
******************************************************************
******************************************************************
*********************************
ok: [server2]
ok: [server1]
ok: [server3]
TASK [Copy CSV file to remote servers]
******************************************************************
******************************************************************
*****************
ok: [server1]
ok: [server3]
ok: [server2]
TASK [Read CSV file from remote server]
******************************************************************
******************************************************************
****************
ok: [server3]
ok: [server1]
ok: [server2]
TASK [Ensure required groups exist]
******************************************************************
******************************************************************
********************
ok: [server3] => (item=sudo)
ok: [server2] => (item=sudo)
ok: [server1] => (item=sudo)
changed: [server3] => (item=sales)
changed: [server2] => (item=sales)
changed: [server1] => (item=sales)
changed: [server2] => (item=developer)
changed: [server3] => (item=developer)
changed: [server1] => (item=developer)
TASK [Create users from CSV data]
******************************************************************
******************************************************************
**********************
changed: [server1] => (item={'username': 'utik', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sudo'})
changed: [server2] => (item={'username': 'utik', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sudo'})
changed: [server3] => (item={'username': 'utik', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sudo'})
changed: [server2] => (item={'username': 'doni', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'developer'})
changed: [server1] => (item={'username': 'doni', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'developer'})
changed: [server3] => (item={'username': 'doni', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'developer'})
changed: [server2] => (item={'username': 'roni', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sales'})
changed: [server3] => (item={'username': 'roni', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sales'})
changed: [server1] => (item={'username': 'roni', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sales'})
changed: [server2] => (item={'username': 'rudi', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sales'})
changed: [server3] => (item={'username': 'rudi', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sales'})
changed: [server1] => (item={'username': 'rudi', 'password':
'pass123', 'shell': '/bin/bash', 'groups': 'sales'})
PLAY RECAP
******************************************************************
******************************************************************
*********************************************
server1 : ok=5 changed=2 unreachable=0
failed=0 skipped=0 rescued=0 ignored=0
server2 : ok=5 changed=2 unreachable=0
failed=0 skipped=0 rescued=0 ignored=0
server3 : ok=5 changed=2 unreachable=0
failed=0 skipped=0 rescued=0 ignored=0
Untuk DNS Bind9
budi@tusirah:~/workflow/hosts$ tree ansible-bind9/
ansible-bind9/
├── [Link]
├── [Link]
└── roles
└── bind9
├── handlers
│ └── [Link]
├── tasks
│ └── [Link]
└── templates
├── [Link].j2
└── [Link].j2
cd ansible-bind9
vim [Link]
[bind9_servers]
dns_server1 ansible_host=[Link] ansible_user=root
dns_server2 ansible_host=[Link] ansible_user=root
vim [Link]
- name: Deploy BIND9 DNS Server
hosts: bind9_servers
become: yes
roles:
- bind9
vim roles/bind9/tasks/[Link]
- name: Install BIND9
apt:
name: bind9
state: present
update_cache: yes
- name: Copy [Link]
template:
src: [Link].j2
dest: /etc/bind/[Link]
notify: Restart BIND9
- name: Copy zone file for [Link]
template:
src: [Link].j2
dest: /etc/bind/[Link]
notify: Restart BIND9
- name: Ensure BIND9 is running and enabled
service:
name: bind9
state: started
enabled: yes
vim roles/bind9/templates/[Link].j2
zone "[Link]" {
type master;
file "/etc/bind/[Link]";
};
vim roles/bind9/templates/[Link].j2
$TTL 86400
@ IN SOA [Link]. [Link]. (
2024032001 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
; Nameservers
@ IN NS [Link].
; A records
ns IN A [Link]
ns2 IN A [Link]
www IN A [Link]
www IN A [Link]
mail IN A [Link]
; MX records
@ IN MX 10 [Link].
vim roles/bind9/handlers/[Link]
- name: Restart BIND9
service:
name: bind9
state: restarted
pwd
/home/budi/workflow/hosts/ansible-bind9
ansible all -i [Link] -m ping
dns_server2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
dns_server1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
ansible-playbook -i [Link] [Link]
ansible all -i [Link] -m command -a "systemctl status bind
[Link]"
Client DNS
budi@tusirah:~/workflow/hosts$ mkdir client-dns
budi@tusirah:~/workflow/hosts$ tree client-dns/
client-dns/
├── [Link]
├── [Link]
└── templates
└── [Link].j2
cd client-dns
mkdir templates
vim [Link]
[servers]
server1 ansible_host=[Link] ansible_user=root
server2 ansible_host=[Link] ansible_user=root
server3 ansible_host=[Link] ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
vim templates/[Link].j2
# Managed by Ansible
nameserver [Link]
nameserver [Link]
vim [Link]
- name: Update [Link] using template
hosts: all
become: yes
tasks:
- name: Deploy [Link] template
template:
src: [Link].j2
dest: /etc/[Link]
owner: root
group: root
mode: '0644'
budi@tusirah:~/workflow/hosts/client-dns$ ansible all -i
[Link] -m ping
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ansible-playbook -i [Link] [Link]
ansible all -i [Link] -m command -a "nslookup
[Link]"
server1 | CHANGED | rc=0 >>
Server: [Link]
Address: [Link]#53
Name: [Link]
Address: [Link]
Name: [Link]
Address: [Link]
server2 | CHANGED | rc=0 >>
Server: [Link]
Address: [Link]#53
Name: [Link]
Address: [Link]
Name: [Link]
Address: [Link]
server3 | CHANGED | rc=0 >>
Server: [Link]
Address: [Link]#53
Name: [Link]
Address: [Link]
Name: [Link]
Address: [Link]
Ansible Deploy Nginx
mkdir ansible-nginx
cd ansible-nginx
vim [Link]
[webservers]
web1 ansible_host=[Link] ansible_user=root
web2 ansible_host=[Link] ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
vim [Link]
- name: Deploy Nginx with Custom Config and Index Page
hosts: webservers
become: yes
tasks:
- name: Install Nginx
[Link]:
name: nginx
state: present
update_cache: yes
- name: Deploy Nginx Configuration
[Link]:
src: [Link].j2
dest: /etc/nginx/sites-available/default
notify: Restart Nginx
- name: Ensure default site is enabled
[Link]:
src: /etc/nginx/sites-available/default
dest: /etc/nginx/sites-enabled/default
state: link
notify: Restart Nginx
- name: Deploy Index Page
[Link]:
src: [Link].j2
dest: /var/www/html/[Link]
handlers:
- name: Restart Nginx
[Link]:
name: nginx
state: restarted
mkdir templates
vim [Link].j2
server {
listen 80;
server_name _;
root /var/www/html;
index [Link];
location / {
try_files $uri $uri/ =404;
}
}
vim [Link].j2
<html>
<head><title>Hello</title></head>
<body>
<h1>Hello from {{ ansible_hostname }}!</h1>
</body>
</html>
cd /home/budi/workflow/hosts/ansible-nginx/
ansible all -i [Link] -m ping
web1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
web2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ansible-playbook -i [Link] [Link]