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