(Adinusa) Automation With Ansible
Di course Adinusa Automation with Ansible (gratis) saya memperoleh banyak ilmu tentang bagaimana cara mengotomatisasi pengelolaan server dan konfigurasi sistem menggunakan Ansible. Saya belajar membuat playbook, mengatur inventory, serta menerapkan otomatisasi untuk instalasi, pembaruan, dan manajemen layanan di banyak server secara efisien.
Modul 3
menjelaskan gimana caranya download paket iso dari adinusa BTA-Server.ova dan saya menyarankan pakai VirtualBox versi 7.1.12 dikarenakan stabil dan tidak ada error ktka menjalankan paket iso dri adinusa.
-----------------------------------
pastikan ktka kita memulai lab adinusa ketik
- servera login:student
- pw:Adinusa2023
dan
- student@servera:~$nusactl login
- student@servera:~$nusactl start anadm-003-1 (menyesuaikan lab)
dan ktka sdh selesai
- student@servera:~$nusactl grade anadm-003-1
- student@servera:~$nusactl finish anadm-003-1
Modul 4
Berikut penyelesaian lab 4.1 Ad-hoc command
- ansible all -m command -a "hostname"
- ansible pod-[username]-managed1 -m setup
- ansible localhost -m command -a 'id'
- ansible pod-[username]-managed1 --become -u student \
- -m copy -a "content='Executed by Ansible\n' dest=/etc/motd"
- ansible pod-[username]-managed1 -u student \
- -m command -a 'cat /etc/motd'
verifikasi:
- ssh pod-[username]-managed1
(setelah login akan otomatis tampil)
...
Executed by Ansible
Berikut penyelesaian lab 4.2 Ad-hoc command
- student@pod-[username]-controller ~$ mkdir ~/managing-inventory
- student@pod-[username]-controller ~$ cd ~/managing-inventory
- student@pod-[username]-controller :~/managing-inventory$ vim inventory
pod-username-controller
[Bogor]
pod-username-managed1
[Jakarta]
pod-username-managed2
[WebServers]
pod-username-managed[1:2]
[Testing]
pod-username-managed1
[Development]
pod-username-managed2
[Indonesia:children]
Jakarta
Bogor
cek daftar semua hosts:
- student@pod-username-controller:~/managing-inventory$ ansible all -i inventory --list-hosts
cek hosts yang tidak tergabung dalam grup:
- student@pod-username-controller:~/managing-inventory$ ansible ungrouped -i inventory --list-hosts
cek hosts spesifik:
- student@pod-username-controller:~/managing-inventory$ ansible pod-username-managed1 -i inventory --list-hosts
cek hosts dalam grup development:
- student@pod-username-controller:~/managing-inventory$ ansible Development -i inventory --list-hosts
cek hosts dalam grup testing:
- student@pod-username-controller:~/managing-inventory$ ansible Testing -i inventory --list-hosts
cek hosts dalam grup indonesia:
- student@pod-username-controller:~/managing-inventory$ ansible Indonesia -i inventory --list-hosts
Berikut penyelesaian lab 4.3 Ad-hoc command
- mkdir -p deploy-review
- cd deploy-review
- vim ansible.cfg
[defaults]
inventory = ./inventory
remote_user = student
host_key_checking = False
- vim inventory
[servers]
pod-[username]-managed1
pod-[username]-managed2
jalankan ansible dengan ad-hoc command:
ansible servers -m command -a 'id'
ansible servers -m copy \
> -a "content='This server is managed by Ansible. \n' dest=/etc/motd" --become
ansible servers -m command -a 'cat /etc/motd'
verifikasi:
- ssh pod-[username]-managed1 "whoami; cat /etc/motd"
- ssh pod-[username]-managed2 "whoami; cat /etc/motd"
Berikut penyelesaian lab 4.4 Ad-hoc command
- mkdir -p playbook-basic/files
- cd playbook-basic
- vim ansible.cfg
[defaults]
inventory = ./inventory
remote_user = student
- vim inventory
[web]
pod-[username]-managed1
- echo "This is a test page." > files/index.html
- vim site.yml
---
- name: Install and start Apache 2
hosts: web
become: true
tasks:
- name: apache2 package is present
apt: name=apache2 state=present
- name: correct index.html is present
copy:
src: ./files/index.html
dest: /var/www/html/index.html
- name: Apache 2 is started
service:
name: apache2
state: started
enabled: true
- ansible-playbook site.yml
verifikasi webserver:
- curl pod-[username]-managed1
Berikut penyelesaian lab 4.5 Ad-hoc command
- mkdir data-variables/
- cd data-variables/
- vim ansible.cfg
[defaults]
inventory = ./inventory
remote_user = student
host_key_checking = False
- vim inventory
[webserver]
pod-username-managed2
- vim playbook.yml
---
- name: Install and Ensure the Apache2 service started
hosts: webserver
become: true
vars:
web_pkg: apache2
web_service: apache2
python_pkg: python3-urllib3
tasks:
- name: Required packages are installed and up to date
apt:
update_cache: yes
force_apt_get: yes
name:
- "{{web_pkg}}"
- "{{python_pkg}}"
state: latest
- name: The {{web_service}} service is started and enabled
service:
name: "{{web_service}}"
enabled: true
state: started
- name: Web content is in place
copy:
content: "Hello World! ansible is fun."
dest: /var/www/html/index.html
- name: Verify the web server is accessible
hosts: localhost
tasks:
- name: Testing web server
uri:
url: http://pod-username-managed2
status_code: 200
return_content: yes
register: Result
- name: Print Ouput web server
debug:
var: Result.content
jalankan playbook:
- ansible-playbook --syntax-check playbook.yml
- ansible-playbook playbook.yml
verifikasi webserver:
- curl pod-username-managed2
Berikut penyelesaian lab 4.6 Ad-hoc command
- mkdir jinja2-template
- cd ~/jinja2-template
- vim inventory
[webservers]
pod-username-managed1
- vim site.yml
---
- name: install and start apache2
hosts: webservers
become: true
tasks:
- name: ensure apache2 package is present
apt:
name: apache2
state: present
update_cache: yes
force_apt_get: yes
- name: restart apache2 service
service: name=apache2 state=restarted enabled=yes
- name: copy index.html
template: src=<username>.html.j2 dest=/var/www/html/<username>.html
- vim <username>.html.j2
Hello World!
This is <username> site.
- ansible-playbook -i inventory site.yml
verifikasi:
- curl pod-username-managed1/<username>.html
Berikut penyelesaian Quiz 1 Ad-hoc command
- mkdir quiz-1
- cd quiz-1
- vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = False
remote_user = student
private_key_file = /home/student/.ssh/ansible
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
- vim inventory
pod-username-managed2 ansible_host=pod-username-managed2
- vim quiz-1_playbook.yml
---
- name: Quiz Playbook
hosts: pod-username-managed2
remote_user: student
become: yes
tasks:
- name: Install latest versions of apache2, mariadb-server, php, and php-mysql packages
apt:
name:
- apache2
- mariadb-server
- php
- php-mysql
state: latest
update_cache: yes
- name: Ensure apache2 service is enabled and running
service:
name: apache2
state: started
enabled: yes
- name: Ensure mariadb service is enabled and running
service:
name: mariadb
state: started
enabled: yes
- name: Generate web content for testing
copy:
content: "Adinusa quiz Playbook - username"
dest: /var/www/html/index.php
- name: Test web service from control node
hosts: localhost
become: no
tasks:
- name: Test web service running on pod-username-managed2
uri:
url: http://pod-username-managed2/index.php
method: GET
status_code: 200
register: webpage_result
- name: Display success message
debug:
msg: "Web service test successful! HTTP Status: {{ webpage_result.status }}"
- ansible-playbook quiz-1_playbook.yml
verifikasi:
- ls -la quiz-1/
- ansible pod-username-managed2 -m shell -a "dpkg -l | grep -E 'apache2|mariadb-server|php|php-mysql'"
- ansible pod-username-managed2 -m shell -a "systemctl is-active apache2 mariadb"
- ansible pod-username-managed2 -m shell -a "systemctl is-enabled apache2 mariadb"
- ansible pod-username-managed2 -m shell -a "ls -la /var/www/html/index.php && cat /var/www/html/index.php"
- curl http://pod-username-managed2/index.php
Berikut penyelesaian Quiz 2 Ad-hoc command
- mkdir quiz-2
- cd quiz-2
- vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = False
remote_user = student
private_key_file = /home/student/.ssh/ansible
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
- vim inventory
pod-username-managed2 ansible_host=pod-username-managed2
- quiz-2_variables.yml
---
- name: Playbook dengan Variabel
hosts: pod-username-managed2
remote_user: student
become: yes
vars:
required_Pkg:
- apache2
- python3-urllib3
web_Service: apache2
content_File: "adinusa lab quiz variables - username"
dest_File: /var/www/html/index.html
tasks:
- name: Install paket yang diperlukan
apt:
name: "{{ required_Pkg }}"
state: latest
update_cache: yes
- name: Pastikan service berjalan dan diaktifkan
service:
name: "{{ web_Service }}"
state: started
enabled: yes
- name: Pastikan konten spesifik ada di pod-username-managed2
copy:
content: "{{ content_File }}"
dest: "{{ dest_File }}"
- name: Test web service dari control node
hosts: localhost
become: no
tasks:
- name: Test web service yang berjalan pada pod-username-managed2
uri:
url: http://pod-username-managed2/index.html
method: GET
status_code: 200
register: webpage_result
- name: Tampilkan pesan sukses
debug:
msg: "Test web service berhasil! Status HTTP: {{ webpage_result.status }}"
- ansible-playbook quiz-2_variables.yml
verifikasi:
- ls -la quiz-2/
- ansible pod-username-managed2 -m shell -a "dpkg -l | grep -E 'apache2|python3-urllib3'"
- ansible pod-username-managed2 -m shell -a "systemctl is-active apache2"
- ansible pod-username-managed2 -m shell -a "systemctl is-enabled apache2"
- ansible pod-username-managed2 -m shell -a "ls -la /var/www/html/index.html && cat /var/www/html/index.html"
- curl http://pod-username-managed2/index.html
Berikut penyelesaian Quiz 3 Ad-hoc command
- mkdir ~/quiz-3
- cd ~/quiz-3
- vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = False
remote_user = student
private_key_file = /home/student/.ssh/ansible
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
- vim inventory
[webservers]
pod-username-managed1 ansible_host=pod-username-managed1
pod-username-managed2 ansible_host=pod-username-managed2
- vim nginx.list.j2
deb http://nginx.org/packages/ubuntu/ jammy nginx
deb-src http://nginx.org/packages/ubuntu/ jammy nginx
- vim mariadb.list.j2
deb [arch=amd64,arm64,ppc64el] http://mirror.mariadb.org/repo/10.9/ubuntu/ jammy main
deb-src [arch=amd64,arm64,ppc64el] http://mirror.mariadb.org/repo/10.9/ubuntu/ jammy main
- vim quiz-3_j2template.yml
---
- name: Deploy nginx dan mariadb dengan template Jinja2
hosts: webservers
remote_user: student
become: yes
tasks:
- name: Add repository nginx menggunakan template Jinja2
template:
src: nginx.list.j2
dest: /etc/apt/sources.list.d/nginx.list
owner: root
group: root
mode: 0644
- name: Add repository mariadb 10.9 menggunakan template Jinja2
template:
src: mariadb.list.j2
dest: /etc/apt/sources.list.d/mariadb.list
owner: root
group: root
mode: 0644
- name: Tambah key nginx
apt_key:
url: https://nginx.org/keys/nginx_signing.key
state: present
- name: Tambah key mariadb
apt_key:
url: https://mariadb.org/mariadb_release_signing_key.asc
state: present
- name: Update repository
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install nginx versi spesifik 1.23.1-1~jammy
apt:
name: nginx=1.23.1-1~jammy
state: present
force: yes
- name: Install mariadb-server-10.9 dan mariadb-client-10.9
apt:
name:
- mariadb-server-10.9
- mariadb-client-10.9
state: present
- name: Pastikan service nginx berjalan dan diaktifkan
service:
name: nginx
state: started
enabled: yes
- name: Pastikan service mariadb-server berjalan dan diaktifkan
service:
name: mariadb
state: started
enabled: yes
Jalankan Playbook:
- ansible-playbook quiz-3_j2template.yml
Verifikasi Quiz 3:
(Verifikasi file ada di directory)
- ls -la ~/quiz-3/
(Verifikasi file repository ada di managed nodes)
- ansible webservers -m shell -a "ls -la /etc/apt/sources.list.d/nginx.list"
- ansible webservers -m shell -a "ls -la /etc/apt/sources.list.d/mariadb.list"
(Verifikasi konten file repository)
- ansible webservers -m shell -a "cat /etc/apt/sources.list.d/nginx.list"
- ansible webservers -m shell -a "cat /etc/apt/sources.list.d/mariadb.list"
(Verifikasi packages terinstall dengan versi benar)
- ansible webservers -m shell -a "dpkg -l | grep -E 'nginx|mariadb-server-10.9|mariadb-client-10.9'"
(Verifikasi services running dan enabled)
- ansible webservers -m shell -a "systemctl is-active nginx mariadb"
- ansible webservers -m shell -a "systemctl is-enabled nginx mariadb"
(Verifikasi versi nginx)
- ansible webservers -m shell -a "nginx -v 2>&1"
Modul 5
Berikut penyelesaian lab 5.1 Ad-hoc command
- mkdir role-create
- cd role-create
- vi ansible.cfg
[defaults]
inventory=./inventory
remote_user=student
- vi inventory
[webservers]
pod-username-managed1
pod-username-managed2
- mkdir roles
- cd roles
- ansible-galaxy init myvhost
- rm -rvf myvhost/{defaults,vars,tests}
- cd ..
- mkdir -p roles/myvhost/files/html-1
- mkdir -p roles/myvhost/files/html-2
> roles/myvhost/files/html-1/index.html
echo 'simple index vhost2 : pod-username' > \
> roles/myvhost/files/html-2/index.html
- vi roles/myvhost/tasks/main.yml
- name: Ensure apache2 is installed
apt:
name: apache2
state: latest
- name: Ensure apache2 is started and enabled
service:
name: apache2
state: started
enabled: true
- name: vhost-1 file is installed
template:
src: vhost-1.conf.j2
dest: /etc/apache2/sites-available/vhost-1.conf
owner: root
group: root
mode: 0644
- name: Enable vhost-1
command: a2ensite vhost-1.conf
notify:
- restart apache2
- name: vhost-2 file is installed
template:
src: vhost-2.conf.j2
dest: /etc/apache2/sites-available/vhost-2.conf
owner: root
group: root
mode: 0644
- name: Enable vhost-2
command: a2ensite vhost-2.conf
notify:
- restart apache2
- name: HTML content is installed
copy:
src: html-1/
dest: "/var/www/vhosts/{{ ansible_user }}-1"
- name: HTML content is installed
copy:
src: html-2/
dest: "/var/www/vhosts/{{ ansible_user }}-2"
- vi roles/myvhost/handlers/main.yml
- name: restart apache2
service:
name: apache2
state: restarted
- vi roles/myvhost/templates/vhost-1.conf.j2
<VirtualHost *:80>
ServerAdmin webmaster@vhost-1.{{ ansible_user }}
ServerName vhost-1.{{ ansible_user }}
ErrorLog /var/log/apache2/vhost.{{ ansible_user }}-1-error.log
CustomLog /var/log/apache2/vhost.{{ ansible_user }}-1-common.log common
DocumentRoot /var/www/vhosts/{{ ansible_user }}-1/
<Directory /var/www/vhosts/{{ ansible_user }}-1/>
Options +Indexes +FollowSymlinks +Includes
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
- vi roles/myvhost/templates/vhost-2.conf.j2
<VirtualHost *:80>
ServerAdmin webmaster@vhost-2.{{ ansible_user }}
ServerName vhost-2.{{ ansible_user }}
ErrorLog /var/log/apache2/vhost.{{ ansible_user }}-2-error.log
CustomLog /var/log/apache2/vhost.{{ ansible_user }}-2-common.log common
DocumentRoot /var/www/vhosts/{{ ansible_user }}-2/
<Directory /var/www/vhosts/{{ ansible_user }}-2/>
Options +Indexes +FollowSymlinks +Includes
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
- vi use-vhost-role.yml
- name: Use myvhost role playbook
hosts: webservers
become: true
pre_tasks:
- name: pre_tasks message
debug:
msg: 'Ensure web server configuration.'
roles:
- myvhost
post_tasks:
- name: post_tasks message
debug:
msg: 'Web server is configured.'
ansible-playbook use-vhost-role.yml \
> --syntax-check
ansible-playbook use-vhost-role.yml
- curl -H "Host: vhost-1.student" http://pod-username-managed1
- curl -H "Host: vhost-2.student" http://pod-username-managed1
- curl -H "Host: vhost-1.student" http://pod-username-managed2
- curl -H "Host: vhost-2.student" http://pod-username-managed2
Berikut penyelesaian lab 5.2 Ad-hoc command
- mkdir data-secret
- cd data-secret
- vi ansible.cfg
[defaults]
inventory = ./inventory
- vi inventory
[devservers]
pod-username-managed1
- vi secret.yml
username: ansibleuser1
pw: adinusa88
ansible-vault encrypt secret.yml
New Vault password: adinusa88
Confirm New Vault password: adinusa88
- vi create_users.yml
- name: create user accounts for all our servers
hosts: devservers
become: true
vars_files:
- secret.yml
tasks:
- name: Creating user from secret.yml
user:
name: "{{username}}"
password: "{{pw | password_hash('sha512')}}"
ansible-playbook --syntax-check \
> --ask-vault-pass create_users.yml
- echo 'adinusa88' > vault-pass
- chmod 600 vault-pass
ansible-playbook \
> --vault-password-file=vault-pass create_users.yml
- ssh ansibleuser1@pod-username-managed1
- $ hostname
- $ whoami
Berikut penyelesaian lab 5.3 Ad-hoc command
- mkdir conditional-loop
- cd conditional-loop
- vim ansible.cfg
[defaults]
inventory = ./inventory
- vim inventory
[database_servers]
pod-username-managed2
- vim database_setup.yml
- name: Database Setup play
hosts: database_servers
become: true
vars:
min_ram_size_bytes: 1000000
supported_distros:
- Ubuntu
tasks:
- name: Setup Database tasks on supported hosts w/ Min. RAM
include_tasks: "{{ ansible_distribution }}_database_tasks.yml"
when:
- ansible_distribution in supported_distros
- ansible_memtotal_mb*1024*1024 >= min_ram_size_bytes
- name: Print a message for unsupported Distros
debug:
msg: >
{{ inventory_hostname }} is a
{{ ansible_distribution }}-based host, which is not one
of the supported distributions ({{ supported_distros }})
when: ansible_distribution not in supported_distros
- name: Print a message for systems with insufficient RAM
debug:
msg: >
{{ inventory_hostname }} does not meet the minimum
RAM requirements of {{ min_ram_size_bytes }} bytes.
when: ansible_memtotal_mb*1024*1024 < min_ram_size_bytes
- vim Ubuntu_database_tasks.yml
- name: Set the 'db_service' fact
set_fact:
db_service: mariadb
- name: Ensure database packages are installed
apt:
name:
- mariadb-server
- python3-pymysql
state: present
- name: Ensure the database service is started
service:
name: "{{ db_service }}"
state: started
enabled: true
- name: Create Database Users
include_tasks: database_user_tasks.yml
- vim database_user_tasks.yml
- name: Ensure database permission groups exist
group:
name: "{{ item }}"
state: present
loop: "{{ host_permission_groups }}"
- name: Ensure Database Users exist
user:
name: "{{ item.username }}"
groups: "{{ item.role }}"
append: yes
state: present
loop: "{{ user_list }}"
when: item.role in host_permission_groups
- name: MySQL user
mysql_user:
login_user: root
login_unix_socket: /var/run/mysqld/mysqld.sock
name: "{{ item.username }}"
password: "{{ item.password }}"
priv: '*.*:{{ item.access}}'
state: present
loop: "{{ user_list }}"
when: "item.role in host_permission_groups"
- mkdir group_vars
- vim group_vars/database_servers.yml
host_permission_groups:
- dbadmin
- dbuser
vim group_vars/all.yml
user_list:
- name: <your-full-name> Admin
username: <username>
password: adinusa88
access: ALL
role: dbadmin
- name: <your-full-name> User
username: <username>
password: adinusa88
access: SELECT
role: dbuser
ansible-playbook \
> --syntax-check database_setup.yml
ansible-playbook database_setup.yml
- ssh pod-username-managed2 \
> "sudo mysql -u root -e 'SELECT user FROM user;' mysql"
Berikut penyelesaian lab 4.1 Ad-hoc command
mkdir quiz-4
cd quiz-4
mkdir roles
mkdir -p roles/quiz-roles/{tasks,handlers,files,templates}
mkdir -p roles/quiz-roles/files/html-quiz
cat > inventory << EOF[managed]pod-username-managed1pod-username-managed2EOF
cat > ansible.cfg << EOF[defaults]inventory = inventoryhost_key_checking = Falseremote_user = usernameprivate_key_file = ~/.ssh/id_rsaEOF
cat > roles/quiz-roles/tasks/main.yml << EOF---- name: Install apache2 packageapt:name: apache2state: presentupdate_cache: yes
- name: Ensure apache2 service is started and enabledsystemd:name: apache2state: startedenabled: yes
- name: Deploy apache2 configuration templatetemplate:src: quiz-roles.conf.j2dest: /etc/apache2/sites-available/quiz-roles.confnotify: restart apache2
- name: Enable webserver configurationcommand: a2ensite quiz-roles.confnotify: restart apache2
- name: Copy html files to document rootcopy:src: html-quiz/dest: /var/www/quiz-roles/{{ ansible_hostname }}/directory_mode: yesEOF
cat > roles/quiz-roles/handlers/main.yml << EOF---- name: restart apache2systemd:name: apache2state: restartedEOF
cat > roles/quiz-roles/files/html-quiz/index.html << EOFadinusa lab quiz roles - usernameEOF
cat > roles/quiz-roles/templates/quiz-roles.conf.j2 << EOF<VirtualHost *:80>ServerName quiz-roles.username-adinusaDocumentRoot /var/www/quiz-roles/{{ ansible_hostname }}
<Directory /var/www/quiz-roles/{{ ansible_hostname }}>Options Indexes FollowSymLinksAllowOverride AllRequire all granted</Directory>
ErrorLog \${APACHE_LOG_DIR}/quiz-roles_error.logCustomLog \${APACHE_LOG_DIR}/quiz-roles_access.log combined</VirtualHost>EOF
cat > quiz-4_roles.yml << EOF---- name: Deploy quiz roles web applicationhosts: managedbecome: yesroles:- quiz-rolesEOF
- ansible-playbook quiz-4_roles.yml
- ansible managed -m systemd -a "name=apache2 state=started" -b
- ansible managed -m shell -a "ls -la /var/www/quiz-roles/{{ inventory_hostname }}/index.html" -b
- ansible managed -m uri -a "url=http://localhost return_content=yes" -b
Berikut penyelesaian lab 4.1 Ad-hoc command
- mkdir quiz-5
- cd quiz-5
cat > ansible.cfg << 'EOF'
[defaults]
inventory = inventory
host_key_checking = False
interpreter_python = auto_silent
EOF
cat > inventory << 'EOF'
[managed]
pod-username-managed1
pod-username-managed2
EOF
- echo "adinusa" > quiz-pass
- chmod 600 quiz-pass
cat > quiz-Secret.yml << 'EOF'
---
username: username
passwd: adinusa2023
EOF
ansible-vault encrypt --vault-password-file quiz-pass quiz-Secret.yml
cat > quiz-5_secrets.yml << 'EOF'
---
- name: Create user with encrypted credentials
hosts: managed
become: yes
vars_files:
- quiz-Secret.yml
tasks:
- name: Create user
user:
name: "{{ username }}"
state: present
shell: /bin/bash
create_home: yes
home: "/home/{{ username }}"
- name: Set user password
user:
name: "{{ username }}"
password: "{{ passwd | password_hash('sha512') }}"
update_password: always
EOF
- ansible-playbook --vault-password-file quiz-pass quiz-5_secrets.yml
- ansible-vault view --vault-password-file quiz-pass quiz-Secret.yml
- ansible managed -m ping
- ansible managed -m command -a "id {{ username }}" --vault-password-file quiz-pass
- ansible managed -m command -a "getent shadow {{ username }}" --vault-password-file quiz-pass
Berikut penyelesaian lab 4.1 Ad-hoc command
- mkdir ~/quiz-6
- mkdir ~/quiz-6/group_vars
cat > ~/quiz-6/group_vars/managed1-host-<username>.yml << 'EOF'
list_user_ops_managed1:
- ops1
- ops2
- ops3
- ops4
- ops5
- ops6
- ops7
- ops8
- ops9
- ops10
- ops11
- ops12
- ops13
- ops14
- ops15
- ops16
- ops17
- ops18
- ops19
- ops20
- ops21
- ops22
- ops23
- ops24
- ops25
- ops26
- ops27
- ops28
- ops29
- ops30
- ops31
- ops32
- ops33
- ops34
- ops35
- ops36
- ops37
- ops38
- ops39
- ops40
- ops41
- ops42
- ops43
- ops44
- ops45
- ops46
- ops47
- ops48
- ops49
- ops50
list_user_dev_managed1:
- dev1
- dev2
- dev3
- dev4
- dev5
- dev6
- dev7
- dev8
- dev9
- dev10
- dev11
- dev12
- dev13
- dev14
- dev15
- dev16
- dev17
- dev18
- dev19
- dev20
- dev21
- dev22
- dev23
- dev24
- dev25
- dev26
- dev27
- dev28
- dev29
- dev30
- dev31
- dev32
- dev33
- dev34
- dev35
- dev36
- dev37
- dev38
- dev39
- dev40
- dev41
- dev42
- dev43
- dev44
- dev45
- dev46
- dev47
- dev48
- dev49
- dev50
EOF
cat > ~/quiz-6/group_vars/managed2-host-<username>.yml << 'EOF'
list_user_ops_managed2:
- ops51
- ops52
- ops53
- ops54
- ops55
- ops56
- ops57
- ops58
- ops59
- ops60
- ops61
- ops62
- ops63
- ops64
- ops65
- ops66
- ops67
- ops68
- ops69
- ops70
- ops71
- ops72
- ops73
- ops74
- ops75
- ops76
- ops77
- ops78
- ops79
- ops80
- ops81
- ops82
- ops83
- ops84
- ops85
- ops86
- ops87
- ops88
- ops89
- ops90
- ops91
- ops92
- ops93
- ops94
- ops95
- ops96
- ops97
- ops98
- ops99
- ops100
list_user_dev_managed2:
- dev51
- dev52
- dev53
- dev54
- dev55
- dev56
- dev57
- dev58
- dev59
- dev60
- dev61
- dev62
- dev63
- dev64
- dev65
- dev66
- dev67
- dev68
- dev69
- dev70
- dev71
- dev72
- dev73
- dev74
- dev75
- dev76
- dev77
- dev78
- dev79
- dev80
- dev81
- dev82
- dev83
- dev84
- dev85
- dev86
- dev87
- dev88
- dev89
- dev90
- dev91
- dev92
- dev93
- dev94
- dev95
- dev96
- dev97
- dev98
- dev99
- dev100
EOF
cat > ~/quiz-6/inventory << EOF
[managed1-host-<username>]
[managed2-host-<username>]
EOF
cat > ~/quiz-6/secret.yml << 'EOF'
pass: adinusa88
EOF
- echo "belajaransible" > ~/quiz-6/vault-pass
- chmod 600 ~/quiz-6/vault-pass
- cd ~/quiz-6
- ansible-vault encrypt secret.yml --vault-password-file vault-pass
cat > ~/quiz-6/quiz-6_loop.yml << 'EOF'
---
- name: Create users on managed1-host
hosts: managed1-host-<username>
vars_files:
- secret.yml
tasks:
- name: Create ops users on managed1
user:
name: "{{ item }}"
password: "{{ pass | password_hash('sha512') }}"
state: present
loop: "{{ list_user_ops_managed1 }}"
- name: Create dev users on managed1
user:
name: "{{ item }}"
password: "{{ pass | password_hash('sha512') }}"
state: present
loop: "{{ list_user_dev_managed1 }}"
- name: Create users on managed2-host
hosts: managed2-host-<username>
vars_files:
- secret.yml
tasks:
- name: Create ops users on managed2
user:
name: "{{ item }}"
password: "{{ pass | password_hash('sha512') }}"
state: present
loop: "{{ list_user_ops_managed2 }}"
- name: Create dev users on managed2
user:
name: "{{ item }}"
password: "{{ pass | password_hash('sha512') }}"
state: present
loop: "{{ list_user_dev_managed2 }}"
EOF
cat > ~/quiz-6/ansible.cfg << 'EOF'
[defaults]
inventory = inventory
host_key_checking = False
vault_password_file = vault-pass
EOF
- wc -l group_vars/managed1-host-<username>.yml
- wc -l group_vars/managed2-host-<username>.yml
- ansible-vault view secret.yml --vault-password-file vault-pass
- ansible-playbook quiz-6_loop.yml --vault-password-file vault-pass
Modul 6
Berikut penyelesaian lab 6.1 Ad-hoc command
- mkdir managing-task-failure
- cd managing-task-failure/
- vim ansible.cfg
[defaults]
inventory=inventory
remote_user=student
[privilege_escalation]
become=True
become_ask_pass=false
- vim inventory
[managed]
pod-<username>-managed1
- vim task-failure.yml
---
- name: Lab Task Failure
hosts: managed
vars:
web_pkg: apache
db_pkg: mariadb-server
db_svc: mariadb
tasks:
- name: Install {{ web_pkg }} package
apt:
name: "{{ web_pkg }}"
state: present
- name: Install {{ db_pkg }} package
apt:
name: "{{ db_pkg }}"
state: present
tasks:
- name: Install {{ web_pkg }} package
apt:
name: "{{ web_pkg }}"
state: present
ignore_errors: yes
tasks:
- name: Set up webserver
block:
- name: Install {{ web_pkg }} package
apt:
name: "{{ web_pkg }}"
state: present
rescue:
- name: Install {{ db_pkg }} package
apt:
name: "{{ db_pkg }}"
state: present
always:
- name: Start {{ db_svc }} service
service:
name: "{{ db_svc }}"
state: started
vars:
web_pkg: apache2
db_pkg: mariadb-server
db_svc: mariadb
tasks:
- name: execute command
command: hostnamectl
register: Result
- name: print command
debug:
var: Result.stdout_lines
- name: execute command
command: hostnamectl
register: Result
changed_when: false
- name: Set up webserver
block:
- name: Install {{ web_pkg }} package
apt:
name: "{{ web_pkg }}"
state: present
failed_when: web_pkg == "apache2"
- ansible-playbook task-failure.yml
Berikut penyelesaian lab 6.2 Ad-hoc command
- mkdir managing-handlers
- cd managing-handlers/
- vim ansible.cfg
[defaults]
inventory=inventory
remote_user=student
[privilege_escalation]
become=True
become_ask_pass=False
- vim inventory
[managed]
pod-<username>-managed1
- vim installing_mariaDB.yml
- name: Install mariaDB server
hosts: managed
vars:
required_pkgs:
- mariadb-server
- python3-pymysql
db_user: <username>
db_pw: adinusa
db_socket: /var/run/mysqld/mysqld.sock
tasks:
- name: "{{ required_pkgs }} packages are installed"
apt:
name: "{{ required_pkgs }}"
state: present
notify: restart service mariadb
- name: task that force handlers to run imediately
meta: flush_handlers
- name: set mariaDB user and password
mysql_user:
login_unix_socket: "{{ db_socket }}"
login_host: localhost
login_user: root
login_password: ''
name: "{{ db_user }}"
password: "{{ db_pw }}"
priv: "*.*:ALL,GRANT"
state: present
host: localhost
no_log: yes
notify: restart service mariadb
- name: add a data for database
copy:
src: ./dump.sql
dest: /tmp/dump.sql
notify:
- "create database"
- restart service mariadb
- name: task that force handlers to run imediately
meta: flush_handlers
- name: check if DB exists
shell: mysql --host=localhost --user={{ db_user }} --password={{ db_pw }} -e 'SHOW DATABASES;'
register: dbstatus
- name: show list existed databases
debug:
var: dbstatus.stdout_lines
handlers:
- name: restart service mariadb
service:
name: mariadb
state: restarted
enabled: yes
- name: create a new database
mysql_db:
name: testdb
state: present
login_unix_socket: "{{ db_socket }}"
login_user: "{{ db_user }}"
login_password: "{{ db_pw }}"
listen: "create database"
- name: insert a data into database
mysql_db:
name: testdb
state: import
target: /tmp/dump.sql
login_unix_socket: "{{ db_socket }}"
login_user: "{{ db_user }}"
login_password: "{{ db_pw }}"
listen: "create database"
- ansible-playbook --syntax-check installing_mariaDB.yml
- vim dump.sql
CREATE TABLE IF NOT EXISTS test (
message varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO test(message) VALUES('Adinusa - managing-handlers');
INSERT INTO test(message) VALUES('username');
INSERT INTO test(message) VALUES('Ansible is fun');
- ansible-playbook installing_mariaDB.yml
- mysql --host=localhost --user=<username> --password=adinusa -e 'SHOW DATABASES;'
Berikut penyelesaian lab 4.1 Ad-hoc command
- ansible --version
- sudo apt update
- sudo apt install ansible -y
- mkdir challenge-1
- cd challenge-1
- vim inventory
[managed1]
10.10.10.12 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/your-key.pem
- touch laravel.yaml
---
- name: Deploy Laravel Ecommerce Application
hosts: managed1
become: yes
vars:
app_dir: /var/www/laravel-ecommerce
mysql_root_password: "rootpassword123"
mysql_db_name: laravel_ecommerce
mysql_db_user: laravel_user
mysql_db_password: "laravelpassword123"
app_url: "10.10.10.12"
tasks:
- name: Update package cache
apt:
update_cache: yes
- name: Install required packages
apt:
name:
- php8.0
- php8.0-mysql
- php8.0-xml
- php8.0-curl
- php8.0-bcmath
- php8.0-mbstring
- php8.0-zip
- php8.0-gd
- php8.0-common
- php8.0-fpm
- npm
- git
- apache2
- mysql-server
- libapache2-mod-php8.0
state: present
- name: Install Composer
get_url:
url: https://getcomposer.org/installer
dest: /tmp/composer-setup.php
become: yes
- name: Run Composer installation
command: php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
become: yes
- name: Set permissions untuk Composer
file:
path: /usr/local/bin/composer
mode: '0755'
become: yes
- name: Clone repository Laravel
git:
repo: https://github.com/kunal254/laravel-8-ecommerce.git
dest: "{{ app_dir }}"
force: yes
- name: Install dependencies Laravel dengan Composer
composer:
command: install
working_dir: "{{ app_dir }}"
- name: Install dependencies npm
command: npm install
args:
chdir: "{{ app_dir }}"
- name: Build assets dengan npm
command: npm run dev
args:
chdir: "{{ app_dir }}"
- name: Copy file .env example
copy:
src: "{{ app_dir }}/.env.example"
dest: "{{ app_dir }}/.env"
remote_src: yes
- name: Generate key aplikasi Laravel
command: php artisan key:generate
args:
chdir: "{{ app_dir }}"
- name: Start dan enable service MySQL
systemd:
name: mysql
state: started
enabled: yes
- name: Setup database MySQL
mysql_db:
name: "{{ mysql_db_name }}"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Buat user database
mysql_user:
name: "{{ mysql_db_user }}"
password: "{{ mysql_db_password }}"
priv: "{{ mysql_db_name }}.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Update konfigurasi .env untuk database
lineinfile:
path: "{{ app_dir }}/.env"
regexp: "^{{ item.key }}="
line: "{{ item.key }}={{ item.value }}"
with_items:
- { key: "DB_DATABASE", value: "{{ mysql_db_name }}" }
- { key: "DB_USERNAME", value: "{{ mysql_db_user }}" }
- { key: "DB_PASSWORD", value: "{{ mysql_db_password }}" }
- { key: "APP_URL", value: "http://{{ app_url }}" }
- name: Jalankan migrasi database
command: php artisan migrate --force
args:
chdir: "{{ app_dir }}"
- name: Jalankan seeder database
command: php artisan db:seed --force
args:
chdir: "{{ app_dir }}"
- name: Set permissions untuk storage dan bootstrap cache
file:
path: "{{ item }}"
mode: '0777'
state: directory
recurse: yes
with_items:
- "{{ app_dir }}/storage"
- "{{ app_dir }}/bootstrap/cache"
- name: Setup virtual host Apache
copy:
dest: /etc/apache2/sites-available/laravel.conf
content: |
<VirtualHost *:80>
ServerName {{ app_url }}
DocumentRoot {{ app_dir }}/public
<Directory {{ app_dir }}/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/laravel_error.log
CustomLog ${APACHE_LOG_DIR}/laravel_access.log combined
</VirtualHost>
- name: Enable mod rewrite Apache
command: a2enmod rewrite
- name: Disable site default Apache
command: a2dissite 000-default.conf
- name: Enable site Laravel
command: a2ensite laravel.conf
- name: Restart service Apache
systemd:
name: apache2
state: restarted
enabled: yes
- name: Set ownership untuk direktori aplikasi
file:
path: "{{ app_dir }}"
owner: www-data
group: www-data
recurse: yes
- name: Tampilkan informasi login
hosts: localhost
tasks:
- name: Tampilkan credentials login
debug:
msg:
- "Deployment Laravel selesai!"
- "URL: http://{{ app_url }}"
- "Email: admin@gmail.com"
- "Password: admin123"
- vim vars.yaml
app_dir: /var/www/laravel-ecommerce
mysql_root_password: "rootpassword123"
mysql_db_name: laravel_ecommerce
mysql_db_user: laravel_user
mysql_db_password: "laravelpassword123"
app_url: "10.10.10.12"
- ansible -i inventory.ini managed1 -m ping
- ansible -i inventory.ini managed1 -a "whoami"
- ansible-playbook -i inventory.ini laravel.yaml
- curl -I http://10.10.10.12
- ansible -i inventory.ini managed1 -a "mysql -u laravel_user -p laravelpassword123 laravel_ecommerce -e 'SHOW TABLES;'"
Test login
Buka http://10.10.10.12/login dan gunakan:
- Email: admin@gmail.com
- Password: admin123


Comments
Post a Comment