Samouczek Ansible dla początkujących: podręcznik i polecenia

⚡ Inteligentne podsumowanie

Ansible to bezagentowy moduł automatyzacji o otwartym kodzie źródłowym, który konfiguruje serwery przez SSH, uruchamia polecenia ad-hoc i koordynuje złożone wdrożenia za pomocą podręczników YAML, ról i wielokrotnego użytku szablonów w systemach Linux i Linux. Windows infrastruktura.

  • 🧩 Bez agenta Archistruktura: Ansible łączy się z klientami przez SSH i przesyła moduły, dzięki czemu na zarządzanych węzłach nie ma potrzeby instalowania oprogramowania agenta.
  • 📥 Instalacja: Skonfiguruj Ansible na węźle sterującym za pomocą yum i EPEL w systemie CentOS lub RHEL albo za pomocą apt i PPA w systemie Ubuntu lub Debian.
  • Polecenia ad-hoc: Uruchamiaj zadania jednorazowe, takie jak: ping, kopiuj lub yum w obrębie inwentarza przy użyciu składni modułu ansible -m.
  • 📜 Poradniki: Opisz pożądany stan w podręcznikach YAML, które grupują scenariusze, zadania i moduły w celu spójnej konfiguracji wielu serwerów.
  • 🧱 Role i szablony: Podziel duże podręczniki na wielokrotnego użytku role utworzone za pomocą ansible-galaxy i renderuj pliki konfiguracyjne za pomocą szablonów Jinja2.
  • 🔁 Osoby prowadzące i fakty: Obsługuj wyzwalacze za pomocą powiadomień o zmianach i używaj zmiennych gather_facts do warunkowej, powtarzalnej automatyzacji.
  • 🎯 Studium przypadku: Pojedynczy podręcznik p4.yml może uruchamiać role selinux, httpd i resolver na wszystkich hostach, przy czym każda z nich jest kontrolowana przez znacznik.

Samouczek Ansible dla początkujących obejmujący instalację, polecenia ad-hoc, podręczniki, role i szablony

Ansible to jedno z najpowszechniej stosowanych narzędzi automatyzacji typu open source w nowoczesnych DevOps, ceniony za bezagentową konstrukcję i proste, czytelne pliki konfiguracyjne. Ten samouczek Ansible dla początkujących wyjaśnia, czym jest Ansible, jak go zainstalować oraz jak korzystać z poleceń ad-hoc, podręczników, ról i szablonów, za pomocą praktycznych przykładów.

Co to jest Ansible?

Wiarygodne to narzędzie o otwartym kodzie źródłowym do automatyzacji i koordynacji, służące do dostarczania oprogramowania, zarządzania konfiguracją i wdrażania. Konfiguruje systemy typu Unix i Windows systemy, zapewniając infrastrukturę jako kod za pośrednictwem własnego języka deklaratywnego. Ansible jest często porównywany z narzędziami opartymi na agentach, takimi jak Marionetka.

Ansible cieszy się popularnością ze względu na prostą instalację, łatwą łączność z klientami i bezagentową konstrukcję. Łączy się z klientami przez SSH, więc po stronie klienta nie jest wymagany żaden specjalny agent. Ansible przesyła moduły do ​​każdego klienta, moduły są uruchamiane lokalnie, a ich dane wyjściowe są zwracane do serwera Ansible.

Ponieważ Ansible opiera się na protokole SSH, łączy się z klientami za pomocą kluczy SSH, co upraszcza cały proces. Dane klientów, takie jak nazwy hostów, adresy IP i porty SSH, są przechowywane w plikach zwanych plikami inwentaryzacyjnymi. Po utworzeniu i wypełnieniu pliku inwentaryzacyjnego, Ansible może z niego korzystać.

Dlaczego warto używać Ansible?

Oto kilka ważnych korzyści wynikających ze stosowania Ansible:

  • Jedną z najważniejszych zalet Ansible jest to, że może z niego korzystać każdy, bezpłatnie.
  • Do instalacji i użytkowania programu nie są wymagane specjalne umiejętności administratora systemu, a oficjalna dokumentacja jest bardzo obszerna.
  • Modułowa obsługa wtyczek, modułów, inwentarzy i podręczników sprawia, że ​​Ansible jest doskonałym narzędziem do organizowania dużych środowisk.
  • Ansible jest lekki i spójny, nie ma ograniczeń co do systemu operacyjnego ani sprzętu.
  • Jest bardzo bezpieczny dzięki swojej bezagentowej konstrukcji i wykorzystaniu funkcji bezpieczeństwa OpenSSH.
  • Ansible charakteryzuje się łatwą nauką obsługi, obszerną dokumentacją oraz łatwą do opanowania strukturą i konfiguracją.

Te mocne strony, zwłaszcza w zestawieniu z innymi alternatywy dla Ansible, pomóż wyjaśnić jego szybkie wdrożenie. Przed instalacją warto zrozumieć, jak rozwijał się projekt.

Historia Ansible’a

Oto najważniejsze wydarzenia w historii Ansible:

  • Projekt Ansible rozpoczął się w lutym 2012 roku. Jego twórcą był Michael DeHaan, twórca Cobblera i Func (Fedora Unified Network Controller).
  • Początkowo nazywana AnsibleWorks Inc. firma finansująca Ansible została przejęta przez RedHat w 2015 r., a następnie wraz z RedHatem przeszła pod IBM parasol.
  • Obecnie Ansible jest dostępny w dystrybucjach takich jak Fedora Linux, RHEL, CentOS i Oracle Linux.

Ważne terminy używane w Ansible

Poniższe terminy pojawiają się w tym samouczku dotyczącym Ansible i warto je poznać przed rozpoczęciem:

Serwer Ansible

Maszyna, na której zainstalowano Ansible i z której uruchamiane są wszystkie zadania i podręczniki.

Moduł

Moduł to polecenie lub zestaw podobnych poleceń Ansible, przeznaczony do wykonania po stronie klienta.

Zadanie

Zadanie to sekcja składająca się z pojedynczej procedury do wykonania.

Rola

Sposób organizacji zadań i powiązanych z nimi plików, dzięki czemu można je później wywołać w podręczniku.

Fakt

Informacje pobrane ze zmiennych globalnych systemu klienta poprzez operację gather_facts.

Magazyn

Plik zawierający dane o serwerach klienckich Ansible. W dalszych przykładach jest on definiowany jako plik hosts.

Graj

Realizacja podręcznika.

Treser

Zadanie wywoływane tylko wtedy, gdy obecny jest powiadamiacz.

Powiadamiający

Sekcja przypisana do zadania, która wywołuje procedurę obsługi, jeśli dane wyjściowe ulegną zmianie.

etykieta

Nazwa nadana zadaniu, której można później użyć do uruchomienia konkretnego zadania lub grupy zadań.

Instalacja Ansible w systemie Linux

Po rozważeniu opcji i podjęciu decyzji o wdrożeniu Ansible, kolejnym krokiem jest jego instalacja w systemie. Poniższy krótki przewodnik obejmuje instalację na najpopularniejszych platformach. Linux dystrybucje.

Zainstaluj Ansible na systemach Centos/RedHat

Krok 1) Zainstaluj repozytorium EPEL.

[root@ansible-server ~]# sudo yum install epel-release

Krok 2) Zainstaluj pakiet Ansible.

[root@ansible-server ~]# sudo  yum install -y ansible

Zainstaluj Ansible na systemach Centos/RedHat

Zainstaluj anible na Ubuntu/Systemy Debian

Krok 1) Wykonaj aktualizację pakietów.

$ sudo apt update

Krok 2) Zainstaluj pakiet software-properties-common.

$ sudo apt install software-properties-common

Krok 3) Zainstaluj archiwum pakietu osobistego Ansible.

$ sudo apt-add-repository ppa:ansible/ansible

Krok 4) Zainstaluj Ansible.

$ sudo apt update
$ sudo apt install ansible

Polecenia doraźne Ansible

Jednym z najprostszych sposobów korzystania z Ansible są polecenia ad-hoc. Są one przydatne, gdy chcesz wydać polecenie na pojedynczym serwerze lub grupie serwerów. Polecenia ad-hoc nie są zapisywane do późniejszego wykorzystania, ale stanowią szybki sposób na interakcję z wybranymi serwerami.

Na potrzeby tego samouczka dotyczącego Ansible skonfigurowano prosty plik hosts dla dwóch serwerów, zawierający host1 i host2.

Możesz potwierdzić, że hosty są dostępne z serwera Ansible, wydając polecenie ping polecenie na wszystkich hostach.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Polecenia doraźne Ansible

Wyjaśnienie:

  1. Status polecenia, w tym przypadku SUKCES
  2. Host, na którym uruchomiono polecenie
  3. Polecenie wydane za pomocą parametru -m w tym przypadku ping
  4. Za pomocą parametru -i możesz wskazać plik hosts.

Jeśli zajdzie taka potrzeba, to samo polecenie można również wydać na pojedynczym hoście.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Polecenia doraźne Ansible

Wyjaśnienie:

  1. Parametr Limit może być używany do wydawania poleceń tylko na określonych hostach w pliku hosta
  2. Nazwa hosta zdefiniowana w pliku inwentarza

Jeśli potrzebujesz szybko skopiować plik do wielu lokalizacji, skorzystaj z modułu kopiowania, który opiera się na protokole SCP. Polecenie i jego wynik wyglądają następująco:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Polecenia doraźne Ansible

Wyjaśnienie:

  1. Zdefiniowano moduł kopiowania
  2. Argumentami modułu są w tym przypadku bezwzględna ścieżka źródłowa i bezwzględna ścieżka docelowa.
  3. Wyjście polecenia Ansible odzwierciedlające powodzenie polecenia copy i inne szczegóły, takie jak sumy kontrolne sha1 lub md5 do sprawdzania integralności pliku i metadane, takie jak właściciel, rozmiar lub uprawnienia. Łatwo jest zainstalować pakiet na wielu serwerach. Ansible ma kilka modułów, które współpracują z używanymi instalatorami, takimi jak yum, apt, dnf itp.

W poniższym przykładzie zainstalujesz pakiet z modułem yum na dwóch hostach CentOS.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version                Repository       Size\n========================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n========================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Polecenia doraźne Ansible

Wyjaśnienie:

  1. W tym przykładzie użyto modułu Yum
  2. Definiuje argumenty modułu i w tym przypadku to Ty wybierasz nazwę pakietu i jego stan. Jeśli na przykład nie ma stanu, paczka zostanie przeszukana i jeśli zostanie znaleziona, usunięta
  3. Pokolorowane na żółto zobaczysz wynik polecenia ansible ze zmienionym stanem, co w tym przypadku oznacza, że ​​pakiet został znaleziony i zainstalowany.
  4. Status polecenia instalacji yum wydanego przez ansible. W tym przypadku został zainstalowany pakiet ncdu.x86_64 0:1.14-1.el7.

Oczywiście wszystkie opcje instalatora yum można wykorzystać w Ansible, łącznie z aktualizacją, instalacją, najnowszą wersją i usunięciem.

W poniższym przykładzie wydano to samo polecenie w celu usunięcia wcześniej zainstalowanego pakietu ncdu.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package         Arch              Version               Repository        Size\n========================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n========================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Polecenia doraźne Ansible

Wyjaśnienie:

  1. Dane wyjściowe polecenia yum pokazują, że pakiet został usunięty.

Kolejną istotną funkcją Ansible jest możliwość gromadzenia danych o systemie. Gromadzi on informacje o sprzęcie, oprogramowaniu i wersji, a następnie zapisuje każdą wartość w zmiennej, którą można później ponownie wykorzystać.

Gdy potrzebujesz szczegółowych informacji o systemach, które Ansible będzie modyfikować, moduł konfiguracji zbiera te fakty ze zmiennych systemowych.

Polecenia doraźne Ansible

Podręczniki Ansible

Podręczniki Ansible Są sposobem na wysyłanie poleceń do systemów zdalnych za pomocą skryptów. Playbooki konfigurują złożone środowiska systemowe i zwiększają elastyczność poprzez uruchomienie jednego skryptu w jednym lub kilku systemach. Działają bardziej jak język konfiguracji niż język programowania.

Polecenia playbooka korzystają z formatu YAML, więc składnia jest ograniczona, ale wcięcia muszą być przestrzegane. Jak sama nazwa wskazuje, playbook to zbiór zagrań. Za jego pomocą można przypisać określone role do niektórych hostów, a inne do innych, organizując wiele serwerów w jednym pliku.

Zanim przejdziemy do przykładów podręczników, warto zdefiniować zadanie. Zadania stanowią interfejs do modułów Ansible dla ról i podręczników.

Teraz rozważmy podręcznik Ansible, w którym jedna rozgrywka zawiera wiele zadań, jak pokazano poniżej:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Podręczniki Ansible

W powyższym podręczniku hosty group1 w pliku hosts są przeznaczone do instalacji pakietu lldpad za pomocą modułu yum. Usługa lldpad utworzona po instalacji jest następnie uruchamiana za pomocą modułu service, który w większości współpracuje z zespołem systemd.

Wyjaśnienie:

  1. Grupa hostów, na których będzie działać podręcznik
  2. Moduł Yum jest używany w tym zadaniu do instalacji lldpad
  3. Moduł serwisowy służy do sprawdzania, czy usługa działa po instalacji

Każdy podręcznik Ansible działa z plikiem inwentaryzacji. Plik inwentaryzacji zawiera listę serwerów podzielonych na grupy, co zapewnia lepszą kontrolę nad szczegółami, takimi jak adres IP i port SSH dla każdego hosta.

Plik inwentarza dla tego przykładowego podręcznika wygląda następująco. Istnieją dwie grupy, grupa1 i grupa2, każda zawierająca odpowiednio host1 i host2.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Podręczniki Ansible

Wyjaśnienie:

  1. Nazwa grupy
  2. Nazwa hosta z adresem IP i portem ssh, w tym przypadku domyślnym, 22.

Kolejny przykład podręcznika Ansible zawiera dwie instancje dla dwóch grup hostów. Dla pierwszej grupy, group1, SELinux jest włączony, a po jego włączeniu na ekranie hosta pojawia się komunikat.

W przypadku drugiej grupy pakiet httpd jest instalowany tylko wtedy, gdy ansible_os_family to RedHat, a ansible_system_vendor to HP.

ansible_os_family i ansible_system_vendor to zmienne gromadzone za pomocą opcji gather_facts, które można wykorzystać jak w tym przykładzie warunkowym.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Podręczniki Ansible

Wyjaśnienie:

  1. Przykład klauzuli When. W tym przypadku, gdy typem systemu operacyjnego jest Debian. Zmienna ansible_os_family jest zbierana za pomocą funkcji zbierania faktów.
  2. Dane wyjściowe zadania są rejestrowane do wykorzystania w przyszłości pod nazwą Enable_selinux
  3. Inny przykład klauzuli when. W tym przypadku wiadomość zostanie wyświetlona dla użytkownika hosta, jeśli SELinux był rzeczywiście włączony wcześniej.
  4. Inny przykład klauzuli When składającej się z dwóch reguł

Oprócz zadań istnieją również zadania specjalne, zwane handlerami. Handler musi mieć unikalną nazwę w całym podręczniku. Handlery działają jak zwykłe zadania, ale można je powiadomić za pomocą notyfikacji.

Jeśli podczas uruchomienia playbooka nie zostanie powiadomiony moduł obsługi, nie zostanie on uruchomiony. Jeśli jednak więcej niż jedno zadanie powiadomi moduł obsługi, zostanie on uruchomiony tylko raz po zakończeniu wszystkich zadań.

W poniższym przykładzie konkretne zadanie ma sekcję powiadomień, która wywołuje inne zadanie. Jeśli dane wyjściowe pierwszego zadania ulegną zmianie, wywoływane jest zadanie obsługi. Typowym przykładem jest zmiana pliku konfiguracyjnego, a następnie ponowne uruchomienie usługi, której to dotyczy.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

W tym przypadku, jeśli pierwsze zadanie „sshd config file modify port” ulegnie zmianie, co oznacza, że ​​port nie będzie już miał wartości 28675, port zostanie zmodyfikowany, a zadanie powiadomi program obsługi o tej samej nazwie, który ponownie uruchomi usługę sshd.

Podręczniki Ansible

Wyjaśnienie:

  1. Przykład powiadamiającego
  2. Przykład handlera

Role Ansibla

Podczas pracy z dużymi playbookami łatwiej jest podzielić zadania na role. Role ułatwiają również ponowne wykorzystanie pracy w przyszłości. Rola to zbiór zadań, które można przenosić z jednego playbooka do drugiego i uruchamiać niezależnie, ale tylko za pośrednictwem pliku playbooka.

Role są przechowywane w oddzielnych katalogach i podlegają określonej strukturze katalogów.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

Plik YAML w katalogu defaults zawiera domyślne zmienne używane w podręczniku. Katalog handlers przechowuje handlery, a katalog meta zawiera informacje o autorze i zależnościach ról. Katalog tasks zawiera główny plik YAML dla roli.

Katalog testów zawiera przykładowy podręcznik YAML i przykładowy plik inwentarza. Jest on wykorzystywany głównie do testowania przed utworzeniem faktycznej roli.

Katalog vars zawiera plik YAML, w którym zdefiniowane są wszystkie zmienne używane przez rolę. Katalogi templates i files zawierają szablony i pliki używane przez zadania w ramach roli.

Aby utworzyć drzewo katalogów dla roli, użyj następującego polecenia, podając nazwę roli jako ostatni parametr:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible dobrze współpracuje również z szablonami i wykorzystuje język szablonów Jinja2.

Poniższy przykład pokazuje, jak wygląda podstawowy szablon Jinja2 i jak go wykorzystać w roli.

W czasie wykonywania programu, w zależności na przykład od tego, w którym centrum danych znajduje się Twój serwer, możesz wybrać jeden z kilku serwerów nazw, z których każdy odpowiada jednemu centrum danych, korzystając ze zmiennej resolver_ip_addresses.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

W tym przykładzie katalog podręcznika definiuje kilka zmiennych, w tym resolver_ip_addresses, o różnych wartościach w zależności od centrum danych.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver

Role Ansibla

Wyjaśnienie:

  1. Nazwa szablonu, który ma zostać użyty. Szablon znajduje się w katalogu szablonów w ścieżce roli
  2. Ścieżka docelowa nazwy pliku, który ma zostać zastąpiony szablonem, po stronie klienta.
  3. Uprawnienia pliku docelowego

Zadania roli mogą również mieć pole tagu z przypisaną nazwą. Więcej niż jedno zadanie może współdzielić ten sam tag, a podczas uruchamiania playbooka można określić tag, aby wykonywane były tylko zadania oznaczone tagiem.

Studium przypadku Ansible

W tej sekcji analizujemy studium przypadku podstawowego podręcznika Ansible, który pełni trzy role. Celem jest przedstawienie praktycznego przykładu omówionych dotychczas koncepcji. Niektóre wcześniejsze przykłady z tego samouczka zostały zaadaptowane i ponownie wykorzystane w tym podręczniku.

Poniżej znajduje się struktura katalogów podręcznika. Używany plik YAML to p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

Playbook ma trzy role. Rola resolvera ustawia konkretny serwer nazw na serwerach, kopiując plik do katalogu docelowego /etc/resolv.conf. Rola httpd instaluje pakiet httpd z modułem yum, a trzecia rola włącza SELinux i powiadamia zalogowanego użytkownika o konieczności ponownego uruchomienia systemu. Każda rola została utworzona za pomocą polecenia ansible-galaxy.

Rola tłumacza, zadanie main.yml:

Studium przypadku Ansible

Rola Httpd, zadanie main.yml:

Studium przypadku Ansible

Rola Selinuksa, zadanie main.yml:

Studium przypadku Ansible

Poniżej znajduje się playbook p4.yml. Działa on na wszystkich hostach, chyba że w wierszu poleceń określono inaczej, działa jako użytkownik root na porcie 22 (SSH), zbiera dane przed uruchomieniem ról i uruchamia wszystkie trzy role. Każdą rolę można uruchomić niezależnie, określając jej tag w wierszu poleceń ansible-playbook za pomocą parametru –t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

Następnie możesz uruchomić playbook p4.yml na obu hostach i zinterpretować dane wyjściowe. To samo polecenie można uruchomić z parametrem –check w celu przeprowadzenia próby oraz z parametrem -k, gdy chcesz użyć uwierzytelniania hasłem.

Studium przypadku Ansible

Wyjaśnienie:

  1. Polecenie Ansible-playbook uruchamiające plik p4.yml
  2. Playbook pomija rolę SELinux, ponieważ jest już włączona.
  3. Ansible odkrył, że pakiet httpd jest już zainstalowany, więc zwraca komunikat OK.
  4. Ustawiono narzędzie do rozpoznawania nazw, a status narzędzia do rozpoznawania ról uległ zmianie.

Ściągawka dotycząca poleceń Ansible

Zainstaluj repozytorium EPEL w systemach Centos/RHEL

[root@ansible-server ~]# sudo yum install epel-release

Zainstaluj pakiet ansible w systemach Centos/RHEL

[root@ansible-server ~]# sudo  yum install -y ansible

Wykonaj aktualizację pakietów w Debianie/Ubuntu systemy

$ sudo apt update

Zainstaluj pakiet software-properties-common na Debianie/Ubuntu systemy

$ sudo apt install software-properties-common

Zainstaluj archiwum pakietów osobistych Ansible na Debianie/Ubuntu systemy

$ sudo apt-add-repository ppa:ansible/ansible

Zainstaluj anible na Debianie/Ubuntu systemy

$ sudo apt update
$ sudo apt install ansible

Problem a ping polecenie na wszystkich serwerach zdefiniowanych w pliku inwentarza o nazwie hosts

[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Problem a ping polecenie tylko na hoście2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Skopiuj plik „testfile” na wszystkie hosty w pliku ekwipunku

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Zainstaluj pakiet ncdu na wszystkich hostach

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Usuń pakiet ncdu na wszystkich hostach

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Zbuduj strukturę katalogów dla roli o nazwie role1.

[root@ansible-server test2]# ansible-galaxy init role1

Podręcznik próbny p4.yml

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Uruchom podręcznik p4.yml z uwierzytelnianiem hasłem dla wszystkich hostów

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

FAQ

Tak. Ansible jest bezagentowy, więc żadne oprogramowanie nie działa na zarządzanych węzłach. Łączy się przez SSH lub WinRM. Windowsi przesyła małe moduły, które są uruchamiane na obiekcie docelowym, a następnie usuwane. Tylko węzeł sterujący potrzebuje Ansible i Python zainstalowany.

Playbooki Ansible są napisane w języku YAML, który jest czytelny dla człowieka i opiera się na wcięciach, a nie nawiasach klamrowych. Szablony korzystają z języka szablonów Jinja2, a fakty i zmienne pozwalają na dostosowanie jednego playbooka do wielu hostów. Do rozpoczęcia nie jest wymagane ogólne doświadczenie programistyczne.

Ansible jest rozwiązaniem bezagentowym i opartym na technologii push, wysyłającym zmiany przez SSH, podczas gdy Marionetka oraz Chef są zazwyczaj oparte na agentach i pull-ach. Ansible używa YAML, podczas gdy Chef Używa Ruby, a Puppet własnego języka DSL. Wiele zespołów wybiera Ansible ze względu na jego łatwą naukę.

Tak. Ansible jest darmowy i ma otwarte oprogramowanie na licencji GNU GPL, utrzymywane przez Red Hat i liczną społeczność. Podstawowy silnik i tysiące modułów są darmowe. Red Hat sprzedaje również Ansible Automation Platform, płatny produkt, który dodaje graficzny interfejs użytkownika, dostęp oparty na rolach i wsparcie.

Tak. Oprócz hostów Linux i Unix, z którymi można się połączyć przez SSH, Ansible zarządza Windows węzły przez WinRM za pomocą dedykowanego Windows modułów. Może instalować pakiety, edytować rejestr, zarządzać usługami i uruchamiać program PowerShell, więc łączy w sobie systemy Linux i Windows Floty są automatyzowane z poziomu jednego węzła sterującego.

Ansible Galaxy to publiczna platforma do udostępniania i pobierania ról i kolekcji społeczności. Polecenie ansible-galaxy tworzy strukturę katalogów roli i instaluje opublikowane role, dzięki czemu można ponownie wykorzystać przetestowane automatyzacje zamiast pisać każdy podręcznik od podstaw.

Asystenci AI mogą tworzyć playbooki YAML na podstawie zapytania w języku potocznym, objaśniać nieznane moduły i proponować poprawki dla nieudanych zadań lub błędów składniowych. Mogą również konwertować skrypty powłoki na zadania idempotentne. Zawsze sprawdzaj wygenerowane playbooki pod kątem poprawności nazw modułów i idempotentności przed ich uruchomieniem.

Tak. Drugi pilot GitHub Automatycznie uzupełnia zadania playbooka, wpisy inwentarza i szablony Jinja2 na podstawie krótkiego komentarza lub nazwy pliku. Traktuj jego wynik jako punkt wyjścia i sprawdź wcięcia, parametry modułów i nazwy zmiennych, ponieważ wygenerowany plik YAML może odwoływać się do nieaktualnej składni lub nieistniejących modułów.

Podsumuj ten post następująco: