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.

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 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"
}
Wyjaśnienie:
- Status polecenia, w tym przypadku SUKCES
- Host, na którym uruchomiono polecenie
- Polecenie wydane za pomocą parametru -m w tym przypadku ping
- 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"
}
Wyjaśnienie:
- Parametr Limit może być używany do wydawania poleceń tylko na określonych hostach w pliku hosta
- 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
}
Wyjaśnienie:
- Zdefiniowano moduł kopiowania
- Argumentami modułu są w tym przypadku bezwzględna ścieżka źródłowa i bezwzględna ścieżka docelowa.
- 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"
]
}
Wyjaśnienie:
- W tym przykładzie użyto modułu Yum
- 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
- Pokolorowane na żółto zobaczysz wynik polecenia ansible ze zmienionym stanem, co w tym przypadku oznacza, że pakiet został znaleziony i zainstalowany.
- 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"
]
}
Wyjaśnienie:
- 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.
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
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:
- Grupa hostów, na których będzie działać podręcznik
- Moduł Yum jest używany w tym zadaniu do instalacji lldpad
- 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
Wyjaśnienie:
- Nazwa grupy
- 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'
Wyjaśnienie:
- 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.
- Dane wyjściowe zadania są rejestrowane do wykorzystania w przyszłości pod nazwą Enable_selinux
- 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.
- 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.
Wyjaśnienie:
- Przykład powiadamiającego
- 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
Wyjaśnienie:
- Nazwa szablonu, który ma zostać użyty. Szablon znajduje się w katalogu szablonów w ścieżce roli
- Ścieżka docelowa nazwy pliku, który ma zostać zastąpiony szablonem, po stronie klienta.
- 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:
Rola Httpd, zadanie main.yml:
Rola Selinuksa, zadanie main.yml:
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.
Wyjaśnienie:
- Polecenie Ansible-playbook uruchamiające plik p4.yml
- Playbook pomija rolę SELinux, ponieważ jest już włączona.
- Ansible odkrył, że pakiet httpd jest już zainstalowany, więc zwraca komunikat OK.
- 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















