Blame
8da74f | Mayekkuzu | 2024-11-12 18:46:59 | 1 | # Ansible |
5219a9 | Mayekkuzu | 2024-11-12 18:47:47 | 2 | ![](/IaC/Ansible/ansible_main.jpg) |
8da74f | Mayekkuzu | 2024-11-12 18:46:59 | 3 | |
4 | **Ansible** (Ансибл) - система управления конфигурациями. Написана и работает на Python. Позволяет настраивать удаленные машины на базе nix и windows (сомнительно но окей) используя скрипты с конфигурациями. Если уж совсем без айтишной душноты, то описав конфигурацию один раз, можно раскатить, к примеру, некий сервис на 10, 20 или тысячу тачек всего одним скриптом (плейбуком). Функционал настолько гибкий, что позволяет в зависимости от подключения к тачке, брать данные из конкретной машины (модуль setup) и подставлять данные в конфигурационные файлы. Так же в зависимости от версии Linux можно устанавливать отдельный набор программ для установки и учитывать специфику различных дистрибутивов. Самый простой пример - в RHEL/CentOS пакет apache2 там представлен как пакет httpd, а в Debian - просто apache2. Этот момент можно учесть и скрипт автоматически выберет нужную вилку для действий. Вобщем очень мощный инструмент, его функционал сложно описать в одном абзаце. | |||
5 | ||||
6 | Основополагающим фактором отличия от аналогов типа Chef - нет потребности в агенте который будет обрабатывать операции с системой. Нужен только SSH. | |||
7 | ||||
8 | ## Основные понятия | |||
9 | ||||
10 | Простые примеры для понимания: | |||
11 | ||||
12 | ### Inventory | |||
13 | Список хостов и параметров подключения к ним. Так же инвентарь можно обьединять в группы хостов, что может быть удобно, в случае если часть хостов относится к одному сервису, а часть - к другому. Если инвентарь отсутствует, то Ansible обращается к /etc/ansible/hosts. Если нет и его - /etc/hosts. Может быть представлен в виде ini-файла (простой вариант) и yaml (более гибкий). Это простой пример, поскольку не включает в себя дополнительные и возможно необходимые параметры вроде порта SSH, указания ключа/пароля и т.п. | |||
14 | Пример inventory.ini: | |||
15 | ```ini | |||
16 | [web] | |||
17 | 192.168.1.50 | |||
18 | 192.168.1.51 | |||
19 | web-server.ru | |||
20 | ||||
21 | [db] | |||
22 | 192.168.1.51 | |||
23 | db-server.local | |||
24 | ``` | |||
25 | Он же но в формате yaml | |||
26 | ```yaml | |||
27 | web: | |||
28 | hosts: | |||
29 | 192.168.1.50: | |||
30 | 192.168.1.51: | |||
31 | web-server.ru: | |||
32 | db: | |||
33 | hosts: | |||
34 | 192.168.1.51: | |||
35 | db-server.local: | |||
36 | ``` | |||
37 | ||||
38 | ### Playbook | |||
39 | Задачи которые выполняются на удаленных машинах. Запускается, как правило, с указанием группы хостов или хоста на котором будут производиться операции. | |||
40 | Пример playbook.yaml | |||
41 | ```yaml | |||
42 | - hosts: web | |||
43 | ||||
44 | - name: Create File | |||
45 | file: | |||
46 | path: "/var/www/web-server.ru/index.php" | |||
47 | state: touch | |||
48 | owner: www-data | |||
49 | group: www-data | |||
50 | mode: 0644 | |||
51 | ``` | |||
52 | Задача создаст фаил по пути указанном в path и назначит права/владельца на созданный php-фаил. Этот плейбук будет применен к группе хостов web | |||
53 | ||||
54 | ### Roles | |||
55 | Организация задач по автоматизации. Имеет свою структуру в папке плейбука и позволяет отдельно выделять задачи для упрощения администрирования парка машин | |||
56 | Пример структуры | |||
57 | ``` | |||
58 | roles/ | |||
59 | common/ # Папка с ролью | |||
60 | tasks/ # | |||
61 | main.yml # Фаил с задачей роли | |||
62 | handlers/ # | |||
63 | main.yml # Фаил с задачей handler (описано ниже) | |||
64 | templates/ # Папка с шаблонами | |||
65 | nginx.conf.j2 # Шаблон конфига nginx с синтаксисом jinja2 (описано ниже) | |||
66 | files/ # | |||
67 | bar.txt # Файлы для копирования на удаленную машину | |||
68 | foo.sh # К примеру конфиги, скрипты или бинарные файлы | |||
69 | vars/ # | |||
70 | main.yml # Фаил с обьявлением переменных для этой роли | |||
71 | defaults/ # | |||
72 | main.yml # Переменные с более низким приоритетом для этой роли | |||
73 | meta/ # | |||
74 | main.yml # Зависимости для этой роли | |||
75 | library/ # Библиотеки для этой роли | |||
76 | module_utils/ # Модули для этой роли (module_utils) | |||
77 | # По аналогии корневая папка с ролями ниже | |||
78 | somerole/ # С такой же структурой как и выше | |||
79 | role2/ # "" | |||
80 | role3/ # "" | |||
81 | ``` | |||
82 | ||||
83 | ### Handlers | |||
84 | Задачи которые выполняются только если их вызвать директивой notify. К примеру есть некое условие (Перезапуск веб сервера), при котором произойдет некое действие (перезапуск сервиса nginx и mysql). | |||
85 | ```yaml | |||
86 | tasks: | |||
87 | - name: Restart WebServices | |||
88 | command: echo "this task will restart the web services" | |||
89 | notify: "restart web services" | |||
90 | ||||
91 | handlers: | |||
92 | - name: Restart mariadb | |||
93 | service: | |||
94 | name: mariadb | |||
95 | state: restarted | |||
96 | listen: "restart web services" | |||
97 | ||||
98 | - name: Restart nginx | |||
99 | service: | |||
100 | name: nginx | |||
101 | state: restarted | |||
102 | listen: "restart web services" | |||
103 | ``` | |||
104 | ||||
105 | ### Templates | |||
106 | Шаблоны которые заполняются из переменных. Например модуль который запрашивает множество переменных с каждой машины (Ansible Facts) может быть использован в шаблоне файла с расширением j2. К примеру в файле index.html можно после отработки скрипта автоматически изменить содержимое. Например подставим значение имени хоста: | |||
107 | ```html | |||
108 | <!DOCTYPE html> | |||
109 | <html lang="en"> | |||
110 | <head> | |||
111 | <meta charset="UTF-8"> | |||
112 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||
113 | <meta http-equiv="X-UA-Compatible" content="ie=edge"> | |||
114 | <title>My Website</title> | |||
115 | <link rel="stylesheet" href="./style.css"> | |||
116 | <link rel="icon" href="./favicon.ico" type="image/x-icon"> | |||
117 | </head> | |||
118 | <body> | |||
119 | <main> | |||
120 | <h1>My name is {{ ansible_facts['hostname'] }}</h1> | |||
121 | </main> | |||
122 | </body> | |||
123 | </html> | |||
124 | ``` | |||
125 | ### Переменные | |||
126 | Переменные они и в Африке переменные. Можно задать самому, можно дергать Ansible Facts. Можно использовать сторонние модули. В случае использования роли, например, можно задавать переменные в vars/main.yaml в таком виде: | |||
127 | ```yaml | |||
128 | --- | |||
129 | root_dir: /var/www/html | |||
130 | web_dir: "{{ root_dir }}/web" | |||
131 | web_adminpanel_dir: "{{ root_dir }}/admin" | |||
132 | ``` | |||
133 | Затем в playbook передаем тот фаил с переменной: | |||
134 | ```yaml | |||
135 | vars_files: | |||
136 | - "/path/to/var/file" | |||
137 | ``` | |||
138 | ||||
139 | Так же можно напрямую в playbook обозначить директивой vars: | |||
140 | ```yaml | |||
141 | vars: http-set-port: 80 | |||
142 | ``` | |||
143 | ||||
144 | Так же можно переменную передавать ad-hoc методом, например | |||
145 | ```bash | |||
146 | ansible-playbook playbook.yaml -e "http-set-port=80" | |||
147 | ``` |