Di rumah, saya memiliki beberapa perangkat IT yang bekerja 24/7. Agar mereka tetap terbarui dan menginstal pembaruan secara otomatis, saya menyerahkan pekerjaan itu kepada Ansible. Jika Anda benar-benar baru mengenal Ansible, Anda akan menemukan pengantar yang bagus di:
- Memulai Ansible
- Demistifikasi Memungkinkan untuk sysadmin Linux
- Panduan memulai cepat untuk Ansible untuk sysadmin Linux
Jaringan rumah saya mencakup perangkat berikut:
- Dua Raspberry Pi menjalankan OS Raspbian
- Host KVM saya menjalankan Debian 10 Buster
- Dua host RHEL 8
- A Synology DS213air
- Empat host RHEL di jaringan terisolasi
Host yang ditandai dengan kotak merah adalah Ansible Control Node saya. Tugasnya adalah memperbarui lingkungan Linux saya. Saya memilihnya karena host ini dapat menjangkau semua host lain di lingkungan. Host lain, misalnya, host Red Hat Enterprise Linux 7 (RHEL)-Ansible, hanya dapat menjangkau host di dalam jaringan yang terisolasi.
[ Anda mungkin juga menyukai: Cara membuat Playbook yang Mungkin ]
Prasyarat
Di semua host saya, ada akun pengguna yang dapat menggunakan sudo
untuk menjalankan perintah dengan hak akses root. Untuk kenyamanan, saya membuat pasangan kunci SSH dan mendistribusikan kunci publik SSH ke host yang ingin saya perbarui menggunakan Ansible. Jika Anda memerlukan bantuan untuk membuat kunci SSH, lihat Menggunakan ssh-keygen dan berbagi untuk autentikasi berbasis kunci di Linux oleh Tyler Carrigan.
Untuk menggunakan host RHEL8-Squid sebagai Ansible Control Node, saya harus mengaktifkan repo yang menyediakan Ansible dan menginstalnya:
$ sudo subscription-manager repos --enable=ansible-2.9-for-rhel-8-x86_64-rpms
$ sudo dnf -y install ansible
Untuk distribusi lainnya, silakan lihat dokumentasi resmi.
File konfigurasi default Ansible dapat ditemukan di /etc/ansible/ansible.cfg
. Karena file ini dikirim dan dikendalikan oleh paket RPM, saya ingin membuat file konfigurasi khusus di ~/.ansible.cfg
dengan hanya menyalin yang asli dan mengeditnya. Saya hanya membuat beberapa perubahan:
$ egrep -v "^$|^#|^\[" ~/.ansible.cfg
inventory = ~/ansible/hosts
private_key_file = /home/user/.ssh/ansible_id_rsa
Seperti yang Anda lihat, saya telah membuat ansible
direktori di HOME
saya direktori untuk menyimpan file inventaris host saya. Saya juga telah menentukan jalur ke kunci pribadi SSH yang harus digunakan Ansible untuk terhubung ke node di jaringan.
Dengan konfigurasi ini, semua keajaiban dikendalikan dari HOME
saya direktori, dan saya tidak memerlukan hak akses root pada Ansible Control Node saya untuk menyelesaikan pekerjaan berikut.
Buat file inventaris statis
Dalam kasus penggunaan ini, saya menggunakan file inventaris statis dengan memasukkan host saya dengan FQDN-nya ke dalam ~/ansible/hosts
berkas.
[special]
localhost
tower-pc.lan
[yum]
rhel7-ansible.private1
rhel7-t1.private1
rhel8-t1.private1
rpm-repo-r8.private1
podhost-r8-1.lan
[apt]
raspi-sht21.lan
pi-hole.lan
[ipkg]
diskstation.lan
Seperti yang Anda lihat, saya mengelompokkan host di jaringan saya berdasarkan manajer paket yang mereka gunakan. Ini berguna saat membuat buku pedoman untuk memperbaruinya. Grup [khusus] berisi Ansible Control Node saya sendiri dan hypervisor KVM saya, tempat Ansible Control Node saya berjalan.
Untuk informasi lebih lanjut tentang inventaris Ansible, lihat:Cara membuat inventaris Anda.
Periksa konektivitas
Sebelum saya membuat buku pedoman yang memperbarui host saya, saya memeriksa apakah Ansible Control Node saya RHEL8-Squid dapat terhubung ke semua host saya dengan menggunakan perintah ad-hoc berikut:
$ ansible all -m ping -T 30
rhel7-t1.private1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
rhel7-ansible.private1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
rpm-repo-r8.private1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
rhel8-t1.private1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
podhost-r8-1.lan | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
[WARNING]: Platform linux on host tower-pc.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
tower-pc.lan | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[WARNING]: sftp transfer mechanism failed on [diskstation.lan]. Use
ANSIBLE_DEBUG=1 to see detailed information
[WARNING]: Platform linux on host diskstation.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
diskstation.lan | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[WARNING]: Platform linux on host pi-hole.lan is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/referen
ce_appendices/interpreter_discovery.html for more information.
pi-hole.lan | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[WARNING]: Platform linux on host raspi-sht21.lan is using the discovered
Python interpreter at /usr/bin/python, but future installation of another
Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/
reference_appendices/interpreter_discovery.html for more information.
raspi-sht21.lan | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Batas waktu default untuk koneksi Ansible adalah 10 detik. Karena Synology Diskstation my saya dalam mode siaga sebagian besar waktu, saya menggunakan opsi -T
untuk menentukan batas waktu 30 detik untuk memberinya waktu untuk bangun.
Peringatan tidak mengganggu saya saat ini, jadi saya melanjutkan untuk membuat buku pedoman.
Jika Anda ingin tahu lebih banyak tentang perintah ad-hoc, baca Pengenalan perintah ad-hoc di dokumen resmi.
Buku pedoman
Buku pedoman saya berisi tiga drama. Setiap permainan menjalankan tugas di host yang termasuk dalam grup tertentu di inventaris saya kecuali [khusus] . Dalam contoh sederhana ini, setiap permainan terhubung ke sekelompok host, memperbaruinya, dan mem-boot ulangnya setelahnya jika pembaruan telah diinstal.
Untuk menentukan apakah pembaruan telah diinstal, saya mendaftarkan variabel yang menyimpan nilai kembalian dari tugas tempat saya mendaftarkannya. Saya menggunakan ini untuk memeriksa apakah status tugas diubah. Jika ya, sistem akan di-boot ulang. Berikut pedomannya:
---
- hosts: yum
tasks:
- name: Update all installed packages using YUM module
yum:
name: '*'
state: latest
update_cache: yes
update_only: yes
register: yum_update_status
- name: Remove packates not needed anymore
yum:
autoremove: yes
- name: Reboot when packages were updated
reboot:
when: yum_update_status.changed
- hosts: apt
tasks:
- name: Update all installed packages using APT module
apt:
name: '*'
state: latest
update_cache: yes
only_upgrade: yes
register: apt_update_status
- name: Remove packages not needed anymore
apt:
autoremove: yes
- name: Reboot when packages were updated
reboot:
post_reboot_delay: 60
when: apt_update_status.changed
- hosts: ipkg
tasks:
- name: Update the Packages installed on Diskstation
command: /opt/bin/ipkg update && /opt/bin/ipkg upgrade
Seperti yang mungkin Anda perhatikan, Diskstation tidak di-reboot. Itu karena hanya alat userspace yang akan diperbarui, dan tidak perlu reboot. Jika versi OS baru tersedia untuk Diskstation , Saya akan memperbaruinya secara manual karena belum ada modul Ansible untuk itu. Ini adalah cerita yang mirip dengan host tower-pc.lan dan rhel8-squid.lan . Saya sengaja meninggalkan mereka dari buku pedoman ini. Ansible Control Node dan hypervisor KVM saya cukup penting bagi saya sehingga saya akan memperbaruinya secara manual.
Berikut tampilan playbook pertama yang dijalankan:
$ ansible-playbook -T 30 -b --ask-become-pass pkg_update.yml
BECOME password:
PLAY [yum] **************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [podhost-r8-1.lan]
ok: [rhel7-t1.private1]
ok: [rhel8-t1.private1]
ok: [rpm-repo-r8.private1]
ok: [rhel7-ansible.private1]
TASK [Update all installed packages using YUM module] *******************************************************************************************
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]
TASK [Remove packates not needed anymore] *******************************************************************************************************
ok: [rhel7-t1.private1]
ok: [rhel7-ansible.private1]
ok: [rhel8-t1.private1]
ok: [podhost-r8-1.lan]
ok: [rpm-repo-r8.private1]
TASK [Reboot when packages were updated] ********************************************************************************************************
skipping: [rhel7-ansible.private1]
skipping: [rhel7-t1.private1]
skipping: [rhel8-t1.private1]
skipping: [rpm-repo-r8.private1]
skipping: [podhost-r8-1.lan]
PLAY [apt] **************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]
TASK [Update all installed packages using APT module] *******************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]
TASK [Remove packages not needed anymore] *******************************************************************************************************
ok: [pi-hole.lan]
ok: [raspi-sht21.lan]
TASK [Reboot when packages were updated] ********************************************************************************************************
changed: [pi-hole.lan]
changed: [raspi-sht21.lan]
PLAY [ipkg] *************************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************************
ok: [diskstation.lan]
TASK [Update the Packages installed on Diskstation] *********************************************************************************************
changed: [diskstation.lan]
PLAY RECAP **************************************************************************************************************************************
diskstation.lan : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
pi-hole.lan : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
podhost-r8-1.lan : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
raspi-sht21.lan : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
rhel7-ansible.private1 : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
rhel7-t1.private1 : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
rhel8-t1.private1 : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
rpm-repo-r8.private1 : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Seperti yang Anda lihat, mesin RHEL saya sudah mutakhir. Tidak ada yang perlu diperbarui atau dihapus, dan karena itu tidak diperlukan reboot. Raspberry Pis saya, di sisi lain, memiliki pembaruan yang tersedia dan diinstal. Kedua perangkat di-boot ulang sesudahnya. Diskstation telah statusnya berubah , juga. Namun perlu diketahui ini karena saya menggunakan command
modul, yang mengembalikan berubah setiap kali dijalankan, terlepas dari apakah sesuatu di node Anda berubah.
[ Panduan gratis dari Red Hat:5 langkah untuk mengotomatisasi bisnis Anda. ]
Menutup
Dalam artikel ini, saya menunjukkan kepada Anda contoh yang mudah tetapi tidak terlalu canggih tentang bagaimana saya menjaga perangkat Linux saya di rumah tetap mutakhir menggunakan otomatisasi Ansible. Ini menunjukkan kepada Anda cara menggunakan grup dari inventaris Anda dalam berbagai permainan buku pedoman Anda menggunakan beberapa modul Ansible dan perintah sederhana.