GNU/Linux >> Znalost Linux >  >> Linux

RHCE Ansible Series #2:Spouštění ad-hoc příkazů

V prvním díle série Ansible jste se seznámili s Ansible a naučili se jej instalovat.

V tomto tutoriálu se naučíte, jak spravovat statický inventář v Ansible. Pochopíte také různá nastavení konfigurace Ansible.

Kromě toho prozkoumáte několik modulů Ansible a budete moci spouštět příkazy Ansible Ad-Hoc.

Než to všechno uvidíte, rád bych poděkoval všem členům LHB Pro. Tato série Ansible je možná s jejich podporou. Pokud ještě nejste profesionálním členem, zvažte prosím přihlášení k odběru.

Vytvoření uživatele Ansible

I když v Ansible můžete ke spouštění Ad-Hoc příkazů a příruček použít uživatele root, rozhodně se to nedoporučuje a není to považováno za nejlepší postup kvůli bezpečnostním rizikům, která mohou vzniknout povolením ssh přístupu uživatele root.

Z tohoto důvodu se doporučuje vytvořit vyhrazeného uživatele Ansible s právy sudo (ke všem příkazům) na všech hostitelích (řízení a spravovaní hostitelé).

Pamatujte, že Ansible používá SSH a Python k provádění všech špinavých prací v zákulisí, takže zde jsou čtyři kroky, které byste museli po instalaci Ansible provést:

  1. Vytvořte nového uživatele na všech hostitelích.
  2. Udělte oprávnění sudo novému uživateli na všech uzlech.
  3. Vygenerujte klíče SSH pro nového uživatele v řídicím uzlu.
  4. Zkopírujte veřejný klíč SSH do spravovaných uzlů.

Začněme tedy bez dalších okolků vytvořením nového uživatele s názvem elliot na všech hostitelích:

[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot
[[email protected] ~]# useradd -m elliot

Po nastavení elliotova heslo na všech hostitelích, můžete přejít ke kroku 2; můžete udělit elliot oprávnění sudo ke všem příkazům bez hesla přidáním následující položky do /etc/sudoers soubor:

[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers
[[email protected] ~]# echo "elliot  ALL=(ALL)  NOPASSWD: ALL" >> /etc/sudoers

Nyní se přihlaste jako uživatel elliot na vašem řídicím uzlu a vygenerujte pár ssh-klíč:

[[email protected] ~]$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/elliot/.ssh/id_rsa):       
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/elliot/.ssh/id_rsa.
Your public key has been saved in /home/elliot/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Xf5bKx0kkBCsCQ/7rc6Kv6CxCRTH2XJajbNvpzel+Ik [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|        .oo .    |
|  . ooo  . o     |
| . = *=.o   o    |
|  o =.o+ . o . . |
| . . .. S . . o  |
|.     .. . . . . |
|.. .   oo.o   o o|
|. = o oo++.  . +.|
| + ..++Eoo.   o. |
+----[SHA256]-----+

Nakonec můžete zkopírovat elliotův veřejný klíč ssh všem spravovaným hostitelům pomocí ssh-copy-id příkaz takto:

[[email protected] ~]$ ssh-copy-id node1
[[email protected] ~]$ ssh-copy-id node2
[[email protected] ~]$ ssh-copy-id node3
[[email protected] ~]$ ssh-copy-id node4

Nyní byste měli být schopni připojit ssh do všech spravovaných uzlů, aniž byste byli vyzváni k zadání hesla; budete požádáni pouze o zadání přístupového hesla ssh (pokud jste ho nenechali prázdné, ha-ha).

Vytváření inventáře Ansible

Soubor inventáře Ansible je v podstatě soubor, který obsahuje seznam serverů, skupiny serverů nebo IP adres, které odkazují na hostitele, které chcete spravovat pomocí Ansible (spravované uzly).

Soubor /etc/ansible/hosts je výchozí soubor inventáře. Nyní vám ukážu, jak si v Ansible vytvořit vlastní soubory inventáře.

Vytvoření adresáře projektu

Nechcete si zahrávat s /etc/ansible adresář; vše byste měli uchovávat v /etc/ansible neporušené a v zásadě jej použijte pouze jako referenci při vytváření souborů inventáře, úpravě konfiguračních souborů projektu Ansible atd.

Nyní vytvoříme nový adresář projektu Ansible s názvem /home/elliot s názvem hraje který budete používat k ukládání všech věcí souvisejících s Ansible (playbooky, soubory inventáře, role atd.), které od tohoto okamžiku vytvoříte:

[[email protected] ~]$ mkdir /home/elliot/plays

Všimněte si, že vše, co od tohoto bodu vytvoříte, bude v řídicím uzlu.

Vytvoření souboru inventáře

Změňte na /home/elliot/plays adresář a vytvořte soubor inventáře s názvem myhosts a přidejte všechny názvy hostitelů spravovaných uzlů, takže to nakonec bude vypadat takto:

[[email protected] plays]$ cat myhosts 
node1
node2
node3
node4

Nyní můžete spustit následující příkaz Ansible a vypsat všechny vaši hostitelé v moji hostitelé inventární soubor:

[[email protected] plays]$ ansible all -i myhosts --list-hosts
  hosts (4):
    node1
    node2
    node3
    node4

-i možnost byla použita k určení myhosts inventární soubor. Pokud vynecháte -i Ansible bude hledat hostitele v /etc/ansible/hosts místo toho soubor inventáře.

Mějte na paměti, že zde používám názvy hostitelů a že všechny uzly (vms), které jsem vytvořil v Azure, jsou ve stejné podsíti a nemusím se starat o DNS, protože je zpracovává Azure.

Pokud nemáte funkční server DNS, můžete přidat položky IP adresy / názvu hostitele svých uzlů do /etc/hosts , níže je příklad:

Vytváření hostitelských skupin a podskupin

Spravované hostitele můžete organizovat do skupin a podskupin. Můžete například upravit myhosts soubor k vytvoření dvou skupin test a prod takto:

[[email protected] plays]$ cat myhosts 
[test]
node1
node2

[prod]
node3
node4

Hostitele můžete uvést v produktu skupiny spuštěním následujícího příkazu:

[[email protected] plays]$ ansible prod -i myhosts --list-hosts
  hosts (2):
    node3
    node4

V Ansible jsou dvě výchozí skupiny:

  1. all – obsahuje všechny hostitele v inventáři
  2. neseskupeno – obsahuje všechny hostitele, kteří nejsou členy žádné skupiny (kromě všech).

Přidejme imaginárního hostitele node5 na myhosts inventář, který demonstruje neseskupené skupina:

[[email protected] plays]$ cat myhosts 
node5

[test]
node1
node2

[prod]
node3
node4

Všimněte si, že jsem přidal node5 na úplný začátek (a ne na konec) myhosts jinak by byl považován za člena prod skupina.

Nyní můžete spustit následující příkaz a vypsat všechny neseskupené hostitelé:

[[email protected] plays]$ ansible ungrouped -i myhosts --list-hosts
  hosts (1):
    node5

Můžete také vytvořit skupinu (rodič), která obsahuje podskupiny (děti). Podívejte se na následující příklad:

[[email protected] plays]$ cat myhosts 
[web_dev]
node1

[web_prod]
node2

[db_dev]
node3

[db_prod]
node4

[development:children]
web_dev
db_dev

[production:children]
web_prod
db_prod 

Vývoj skupina obsahuje všechny hostitele, kteří jsou v web_dev plus všichni členové, kteří jsou v db_dev . Podobně i výroba skupina obsahuje všechny hostitele, kteří jsou v web_prod plus všichni členové, kteří jsou v db_prod.

[[email protected] plays]$ ansible development -i myhosts --list-hosts
  hosts (2):
    node1
    node3

[[email protected] plays]$ ansible production -i myhosts --list-hosts
  hosts (2):
    node2
    node4

Konfigurace Ansible

V této části se dozvíte o nejdůležitějších konfiguračních nastaveních Ansible. V průběhu celé série budete v případě potřeby diskutovat o dalších konfiguračních nastaveních.

Soubor /etc/ansible/ansible.cfg je výchozí konfigurační soubor. Nicméně se také doporučuje, abyste si nepletli s /etc/ansible/ansible.cfg a použijte jej pouze jako referenci. Měli byste si vytvořit svůj vlastní konfigurační soubor Ansible v adresáři projektu Ansible.

ansible --verze příkaz vám ukáže, který konfigurační soubor aktuálně používáte:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/elliot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

Jak můžete vidět z výstupu, /etc/ansible/ansible.cfg se aktuálně používá, protože jste si ještě nevytvořili vlastní ansible.cfg soubor v adresáři projektu.

Soubor /etc/ansible/ansible.cfg obsahuje celou řadu různých konfiguračních nastavení a sekcí Ansible:

[[email protected] plays]$ wc -l /etc/ansible/ansible.cfg 
490 /etc/ansible/ansible.cfg

Dvě nejdůležitější sekce, které musíte definovat v konfiguračním souboru Ansible, jsou:

  1. [výchozí]
  2. [privilege_escalation]

V [výchozích] sekce, zde jsou nejdůležitější nastavení, o kterých musíte vědět:

  • inventář – určuje cestu k souboru inventáře.
  • remote_user – určuje uživatele, který se připojí ke spravovaným hostitelům a spustí playbooky.
  • forks - udává počet hostitelů, které může Ansible spravovat/zpracovávat paralelně; výchozí je 5.
  • host_key_checking - určuje, zda chcete zapnout/vypnout kontrolu hostitele klíče SSH; výchozí je True.

V [privilege_escalation] části, můžete nakonfigurovat následující nastavení:

  • stát - specifikovat, kde povolit/zakázat eskalaci oprávnění; výchozí hodnota je False.
  • become_method – specifikovat metodu eskalace oprávnění; výchozí je sudo.
  • become_user – určete uživatele, kterým se stanete prostřednictvím eskalace oprávnění; výchozí je root.
  • become_ask_pass - určete, zda se má nebo nemá ptát na heslo pro eskalaci oprávnění; výchozí hodnota je False.

Mějte na paměti, že žádné z těchto nastavení nemusíte ukládat do paměti. Všechny jsou zdokumentovány v /etc/ansible/ansible.cfg .

Nyní si vytvořte vlastní ansible.cfg konfiguračního souboru v adresáři projektu Ansible /home/elliot/plays a nastavte následující nastavení:

Nyní spusťte ansible --version povel ještě jednou; měli byste vidět, že váš nový konfigurační soubor je nyní platný:

[[email protected] plays]$ ansible --version
ansible 2.9.14
  config file = /home/elliot/plays/ansible.cfg
  configured module search path = ['/home/elliot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

Spouštění ad-hoc příkazů v Ansible

Do této chvíle jste ve skutečnosti pouze instalovali, nastavovali své prostředí a konfigurovali Ansible. Teď začíná ta pravá zábava!

Příkazy Ansible ad-hoc jsou skvělým nástrojem, který můžete použít ke spuštění jedné úlohy na jednom nebo více spravovaných uzlech. Typický ad-hoc příkaz Ansible se řídí obecnou syntaxí:

ansible host_pattern -m module_name -a "module_options"

Nejjednodušší způsob, jak pochopit, jak fungují ad-hoc příkazy Ansible, je jednoduše je spustit! Takže pokračujte a spusťte následující ad-hoc příkaz:

[[email protected] plays]$ ansible node1 -m command -a "uptime"
Enter passphrase for key '/home/elliot/.ssh/id_rsa':
node1 | CHANGED | rc=0 >>
18:53:01 up 5 days, 18:03,  1 user,  load average: 0.00, 0.01, 0.00

Byl jsem vyzván k zadání své přístupové fráze klíče ssh a poté se zobrazila doba provozu node1! Nyní se podívejte na obrázek níže, který vám pomůže porozumět jednotlivým prvkům příkazu ad-hoc, který jste právě spustili:

Už byste to pravděpodobně uhodli; ansible moduly jsou opakovaně použitelné, samostatné skripty, které může používat Ansible API nebo pomocí ansible nebo ansible - příručka programy.

Příkazový modul je jedním z mnoha modulů, které Ansible nabízí. Můžete spustit ansible-doc -l příkaz k zobrazení seznamu všech dostupných modulů Ansible:

[[email protected] plays]$ ansible-doc -l | wc -l
3387

V současné době je k dispozici 3387 modulů Ansible a každým dnem přibývají! Příkazovému modulu Ansible můžete předat libovolný způsob příkazu, který chcete spustit, jako volbu.

Pokud nemáte prázdnou přístupovou frázi klíče ssh (stejně jako já); pak byste museli spustit ssh-agent abyste se vyhnuli zbytečným bolestem hlavy z toho, že budete vyzváni k zadání přístupové fráze pokaždé, když se Ansible pokusí získat přístup k vašim spravovaným uzlům:

[[email protected] plays]$ eval `ssh-agent`
Agent pid 218750
[[email protected] plays]$ ssh-add
Enter passphrase for /home/elliot/.ssh/id_rsa: 
Identity added: /home/elliot/.ssh/id_rsa ([email protected])

Testování připojení

Než se pustíte do vážnějších úkolů, možná budete chtít vyzkoušet, zda se Ansible dokáže připojit ke všem vašim spravovaným uzlům; k tomu můžete použít ping modul a zadejte všechny své spravované hostitele následovně:

[[email protected] plays]$ ansible all -m ping 
node4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
node3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

Jak můžete vidět se všemi ÚSPĚCHY ve výstupu. Všimněte si, že Ansible ping modul nepotřebuje žádné možnosti. Některé moduly Ansible vyžadují volby a některé ne, stejně jako v případě příkazů Linuxu.

Dokumentace modulů Ansible

Kdyby se mě někdo zeptal, co se vám na Ansible nejvíce líbí; Rychle bych řekl, že je to dokumentace. Ansible je tak velmi dobře zdokumentován a je to vše z pohodlí vašeho vlastního terminálu.

Pokud chcete, jak používat konkrétní modul Ansible, můžete spustit ansible-doc následovaný názvem modulu.

Můžete si například prohlédnout popis pingu modul a jak jej používat spuštěním:

[[email protected] plays]$ ansible-doc ping

Tím se otevře ping stránka dokumentace modulu:

Při čtení dokumentace modulů věnujte zvláštní pozornost tomu, zda před nějakou možností není rovnítko (=). V tomto případě je to povinná možnost, kterou musíte zahrnout.

Také, pokud se posunete úplně dolů, můžete vidět několik příkladů, jak spouštět ad-hoc příkazy nebo Ansible playbooky (o kterých budeme diskutovat později).

Příkaz vs. Shell vs. nezpracované moduly

Existují tři moduly Ansible, které si lidé často pletou; toto jsou:

  1. příkaz
  2. shell
  3. syrové

Tyto tři moduly dosahují stejného účelu; spouštějí příkazy na spravovaných uzlech. Existují však klíčové rozdíly, které tyto tři moduly oddělují.

Pomocí příkazu nelze použít potrubí nebo přesměrování modul. Například následující příkaz ad-hoc způsobí chybu:

[[email protected] plays]$ ansible node2 -m command -a "lscpu | head -n 5"
node2 | FAILED | rc=1 >>
lscpu: invalid option -- 'n'
Try 'lscpu --help' for more information.non-zero return code

To proto, že příkaz modul nepodporuje roury ani přesměrování. Pokud chcete použít kanály nebo přesměrování, můžete místo toho použít modul shell. Spusťte stejný příkaz znovu, ale tentokrát použijte shell modul místo toho:

[[email protected] plays]$ ansible node2 -m shell -a "lscpu | head -n 5"
node2 | CHANGED | rc=0 >>
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              1
On-line CPU(s) list: 0

Funguje jako kouzlo! Úspěšně zobrazil prvních pět řádků výstupu příkazu lscpu na node2.

Ansible používá SSH a Python skripty v zákulisí, aby udělal všechna kouzla. Nyní raw modul pouze používá SSH a obchází subsystém modulu Ansible. Tímto způsobem by tento nezpracovaný modul úspěšně fungoval na spravovaném uzlu, i když python není nainstalován (na spravovaném uzlu).

Manipuloval jsem se svými pythonovými binárními soubory na node4 (nedělejte to prosím sami), takže mohu napodobit scénář toho, co se stane, když spustíte shell nebo příkaz modul na uzlu, který nemá nainstalovaný python:

[email protected]:/usr/bin# mkdir hide
[email protected]:/usr/bin# mv python* hide/

Nyní zkontrolujte, co se stane, když spustím Ansible ad-hoc s shell nebo příkaz modul cílení uzel4:

[[email protected] plays]$ ansible node4 -m shell -a "whoami"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
}
[[email protected] plays]$ ansible node4 -m command -a "cat /etc/os-release"
node4 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "module_stderr": "Shared connection to node4 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "The module failed to execute correctly, you probably need to set the interpreter.\nSee stdout/stderr for the exact error",
    "rc": 127
}

Dostávám chyby! Nyní se pokusím dosáhnout stejného úkolu; ale tentokrát použiji raw modul:

[[email protected] plays]$ ansible node4 -m raw -a "cat /etc/os-release"
node4 | CHANGED | rc=0 >>
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Shared connection to node4 closed.

Jak můžete vidět, surový modul byl jediným modulem ze tří modulů, který úspěšně provedl úkol. Nyní se vrátím a opravím nepořádek, který jsem udělal na node4:

[email protected]:/usr/bin/hide# mv * ..

Tuto tabulku jsem vytvořil níže, abych vám pomohl shrnout různé případy použití pro tři moduly:

Popis Příkaz Skořápka Syrové
Spouštět jednoduché příkazy Ano Ano Ano
Spouštět příkazy s přesměrováním Ne Ano Ano
Spouštět příkazy bez Pythonu Ne Ne Ano

V pořádku! Tím se dostáváme na konec druhého výukového programu Ansible.

Zůstaňte naladěni na další tutoriál, kde se naučíte vytvářet a spouštět příručky Ansible. Nezapomeňte se stát členem :)


Linux
  1. RHCE Ansible Series #11:Správa systémů s Ansible

  2. RHCE Ansible Series #10:Role systému RHEL

  3. RHCE Ansible Series #9:Ansible Role

  1. RHCE Ansible Series #8:Šifrování obsahu pomocí Ansible Vault

  2. Jak zmínit zástupný znak v příkazech ansible

  3. Spouštění pro příkazy terminálu smyčky v Jupyteru

  1. RHCE Ansible Series #7:Jinja2 šablony

  2. RHCE Ansible Series #6:Rozhodování v Ansible

  3. RHCE Ansible série #5:Ansible smyčky