GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya menggunakan Ansible untuk mengotomatiskan pembaruan di rumah

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.


Linux
  1. Cara membuat Playbook yang Mungkin

  2. Bagaimana seharusnya strace digunakan?

  3. bagaimana cara membuat playbook yang memungkinkan untuk mendapatkan versi OS dari host jarak jauh?

  1. Cara Menambahkan Banyak Host di phpMyAdmin

  2. Cara Menginstal Ansible di Oracle Linux 8

  3. Bagaimana saya bisa mengotomatiskan pembersihan dan pengaturan ulang direktori home pengguna Linux ke default?

  1. Cara Membuat File di Ansible

  2. Cara Menggunakan Variabel dalam Ansible Playbook

  3. Cara menggunakan Ansible untuk mengonfigurasi Vim