GNU/Linux >> Znalost Linux >  >> Linux

Jak jsem použil Ansible k automatizaci aktualizací doma

Doma vlastním některá IT zařízení, která běží 24/7. Aby byly aktuální a aktualizace se instalovaly automaticky, přenechávám úlohu Ansible. V případě, že jste s Ansible úplně noví, dobrý úvod najdete v:

  • Začínáme s Ansible
  • Demystifikace Ansible pro správce systému Linux
  • Stručný průvodce pro správce systému Ansible pro Linux

Moje domácí síť zahrnuje následující zařízení:

  • Dvě Raspberry Pi se systémem Raspbian OS
  • Můj hostitel KVM se systémem Debian 10 Buster
  • Dva hostitelé RHEL 8
  • Zařízení Synology DS213air
  • Čtyři hostitelé RHEL v izolované síti

Hostitel označený červeným čtverečkem je můj kontrolní uzel Ansible. Jeho úkolem je aktualizovat mé prostředí Linuxu. Vybral jsem si to, protože tento hostitel může dosáhnout všech ostatních hostitelů v prostředí. Jiní hostitelé, například hostitelé Red Hat Enterprise Linux 7 (RHEL)-Ansible, se mohou dostat pouze k hostitelům v izolované síti.

[ Také by se vám mohlo líbit: Jak vytvořit Ansible Playbook ]

Předpoklady

Na všech mých hostitelích existuje uživatelský účet, který může používat sudo spouštět příkazy s oprávněními root. Pro pohodlí jsem vytvořil pár klíčů SSH a distribuoval veřejný klíč SSH hostitelům, které bych chtěl aktualizovat pomocí Ansible. Pokud potřebujete pomoc s generováním klíčů SSH, podívejte se na Používání ssh-keygen a sdílení pro autentizaci založenou na klíčích v Linuxu od Tylera Carrigana.

Chcete-li použít hostitele RHEL8-Squid jako Ansible Control Node budu muset povolit repo, které poskytuje Ansible, a nainstalovat jej:

$ sudo subscription-manager repos --enable=ansible-2.9-for-rhel-8-x86_64-rpms
$ sudo dnf -y install ansible

Další distribuce naleznete v oficiální dokumentaci.

Výchozí konfigurační soubor Ansible se nachází na /etc/ansible/ansible.cfg . Protože je tento soubor dodáván a ovládán balíčkem RPM, rád bych vytvořil vlastní konfigurační soubor na ~/.ansible.cfg pouhým zkopírováním původního a jeho úpravou. Provedl jsem jen několik změn:

$ egrep -v "^$|^#|^\[" ~/.ansible.cfg
inventory      = ~/ansible/hosts
private_key_file = /home/user/.ssh/ansible_id_rsa

Jak můžete vidět, vytvořil jsem ansible adresář v mém HOME adresář pro uložení souboru mého hostitelského inventáře. Také jsem specifikoval cestu k soukromému klíči SSH, který by měl Ansible použít pro připojení k uzlům v síti.

S touto konfigurací je veškerá magie ovládána z mého HOME adresář a k provedení následující úlohy nebudu potřebovat žádná oprávnění root na mém řídicím uzlu Ansible.

Vytvořte soubor statického inventáře

V tomto případě používám soubor statického inventáře tak, že své hostitele vložím s jejich FQDN do ~/ansible/hosts soubor.

[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

Jak vidíte, seskupil jsem hostitele ve své síti podle správce balíčků, které používají. To se hodí při vytváření příručky k jejich aktualizaci. Skupina [speciální] obsahuje můj Ansible Control Node samotný a můj KVM hypervisor, kde běží můj Ansible Control Node.

Další informace o inventáři Ansible naleznete v části:Jak vytvořit inventář.

Zkontrolujte připojení

Než vytvořím playbook, který aktualizuje mé hostitele, zkontroluji, zda můj Ansible Control Node RHEL8-Squid se mohu připojit ke všem mým hostitelům pomocí následujícího ad-hoc příkazu:

$ 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"
}

Výchozí časový limit pro připojení Ansible je 10 sekund. Protože moje Synology Diskstation je většinu času v pohotovostním režimu, používám volbu -T určit časový limit 30 sekund, aby měl nějaký čas na probuzení.

Varování mě v tuto chvíli neobtěžují, takže přejdu k vytvoření playbooku.

V případě, že byste se chtěli dozvědět více o ad-hoc příkazech, přečtěte si Úvod do ad-hoc příkazů v oficiálních dokumentech.

Příručka

Můj sešit obsahuje tři hry. Při každém hraní je spuštěn úkol na hostitelích patřících do určité skupiny v mém inventáři kromě [speciální] . V tomto jednoduchém příkladu se každá hra připojí ke skupině hostitelů, aktualizuje je a poté je restartuje v případě, že byly nainstalovány aktualizace.

Abych zjistil, zda byly aktualizace nainstalovány, registruji proměnné, které ukládají návratové hodnoty úloh, kde jsem je zaregistroval. Používám je ke kontrole, zda se stav úlohy nezměnil. Pokud ano, systém se restartuje. Zde je příručka:

---
- 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

Jak jste si možná všimli, Diskstation nebyl restartován. Je to proto, že budou aktualizovány pouze nástroje uživatelského prostoru a není třeba restartovat. Pokud je pro Diskstation k dispozici nová verze operačního systému , aktualizuji ho ručně, protože pro něj zatím není modul Ansible. Je to podobný příběh s hostiteli tower-pc.lan a rhel8-squid.lan . Záměrně jsem je z této příručky vynechal. Můj Ansible Control Node a můj KVM hypervisor jsou pro mě natolik důležité, že je budu aktualizovat ručně.

Zde je pohled na první spuštění příručky:

$ 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   

Jak můžete vidět, moje stroje RHEL byly již aktuální. Není co aktualizovat ani odstraňovat, a proto není potřeba restartovat počítač. Na druhou stranu můj Raspberry Pis měl aktualizace k dispozici a byly nainstalovány. Obě zařízení byla poté restartována. Diskstation má svůj stav změněn , také. Ale mějte na paměti, že je to proto, že používám command modul, který vrátí změněno pokaždé, když běží, bez ohledu na to, zda se něco na vašem uzlu změnilo.

[ Bezplatný průvodce od společnosti Red Hat:5 kroků k automatizaci vašeho podnikání. ] 

Sbalit

V tomto článku jsem vám ukázal snadný, ale nepříliš sofistikovaný příklad toho, jak udržuji svá linuxová zařízení doma aktuální pomocí automatizace Ansible. Ukáže vám, jak používat skupiny z vašeho inventáře v různých hrách vaší playbooku pomocí některých modulů Ansible a jednoduchého příkazu.


Linux
  1. Jak vytvořit Ansible Playbook

  2. Jak přidat více hostitelů v phpMyAdmin

  3. Jak se má strace používat?

  1. Jak nainstalovat Ansible na Oracle Linux 8

  2. jak vytvořit Ansible playbook pro získání verzí OS vzdálených hostitelů?

  3. Jak mohu automatizovat vymazání a resetování domovského adresáře uživatele systému Linux na výchozí?

  1. Jak vytvořit soubor v Ansible

  2. Jak používat proměnné v Ansible Playbook

  3. Jak používat Ansible ke konfiguraci Vim