# Установка и настройка

# Установка

**На Debian-подобных системах:**

```bash
apt-get install ansible
```

**Настройка управляемых хостов**

На каждом хосте:

1. Если sudo нет, то ```bash
    apt install sudo
    ```
2. Если создается новый пользователь, то ```bash
    sudo useradd -G sudo -s /bin/bash ansibleuser
    ```
3. Если существующий пользователь, то добавить в группу sudo: ```
    usermod -aG sudo sergey
    ```
4. Разрешить пользователю повышать привилегии без ввода пароля. Создать файл ```bash
    sudo nano /etc/sudoers.d/ansibleuser
    ```
5. И добавить текст ```
    ansibleuser ALL=(ALL) NOPASSWD:ALL
    ```

Теперь можно использовать в скриптах become: true

**Настройка сервера**

```bash
ssh-keygen
ssh-copy-id username@remote_host
```

1. Создать ключ доступа
2. Скопировать на каждый управляемый хост, используя логин на хост. Удобнее, если для задач управления на всех хостах сделать одинаковый логин.

В настройке каждого хоста нужно использовать соответствующий логин, для которого настроен ключ доступа.

# Настройка ansible

<div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0-%D1%84%D0%B0%D0%B9"><div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0-%D1%84%D0%B0%D0%B9-1">**Приоритет поиска файла настроек**</div>1. ANSIBLE\_CONFIG (environment variable if set)
2. ansible.cfg (in the current directory)
3. ~/.ansible.cfg (in the home directory)
4. /etc/ansible/ansible.cfg (default)

</div><div id="bkmrk-%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BA">**Генерация настроек**</div><div id="bkmrk-%C2%A0"> </div>```bash
ansible-config init --disabled > ansible.cfg
```

<div id="bkmrk-%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BA-%24"></div><div id="bkmrk-%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BA-%D1%81">С плагинами</div>```bash
ansible-config init --disabled -t all > ansible.cfg
```

<div id="bkmrk-%23-%D0%B8-%3B-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B8.-%D0%9D">\# и ; комментарии. Но ; обычно используется для комментария значения по умолчанию.</div><div id="bkmrk--1"></div><div id="bkmrk-%D0%A4%D0%B0%D0%B9%D0%BB-%D0%B8%D0%BD%D0%B2%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8">**Файл инвентаризации**</div><div id="bkmrk-%7E%2Fhosts-%D1%84%D0%B0%D0%B9%D0%BB-%D0%B8%D0%BD%D0%B2%D0%B5%D0%BD%D1%82%D0%B0">hosts </div><div id="bkmrk-%C2%A0-%C2%A0-%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0">Размещение файла может задаваться переменной окружения $ANSIBLE_HOSTS, либо ключ -i при запуске </div><div id="bkmrk-%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%3A-%D0%BF%D0%B8%D1%88%D0%B5%D1%82%D1%81%D1%8F-%D1%82%D0%B8%D0%BF-">После : пишется тип данных для группы. Например группа [example], [example:vars] это переменные</div><div id="bkmrk-%3Avars-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B4%D0%BB%D1%8F">:vars переменные для группы</div><div id="bkmrk-%3Achildren-%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B-%D0%BF%D0%BE%D1%82">:children группы-потомки</div><div id="bkmrk--3">  
</div><div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80">**Пример**</div>```yaml
[example] группа
www.example.com сервер

# Group 'multi' with all servers
[multi:children]
example

#5 servers in one line [a:z] or [A:Z], or numbers with specific digits, such as [001:250].
[dyngroup]
Node[0:4].lab.edu

# Variables that will be applied to all servers
[multi:vars]
ansible_ssh_user=vagrant
```

<div id="bkmrk-ansible_ssh_user%3Dvag"></div><div id="bkmrk-%D0%A4%D0%B0%D0%B9%D0%BB%D1%8B-%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%B5%D1%80"><div id="bkmrk-%D0%98%D0%BC%D0%B5%D0%BD%D0%B0%3A">**Файлы размещения переменных:**</div><div id="bkmrk-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-">Файлы с переменными групп хранятся в директории “group_vars/имя_группы”;</div><div id="bkmrk-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D1%81-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8--1">Файлы с переменными хостов в директории “hosts_vars/имя_хоста”;</div><div>Формат файла одинаковый, дочерние переменные заменяются на родительские.</div></div>```yaml
---
ansible_user=setup
ansible_private_ssh_key=/home/user/ansible.key
```

Может применяться и плоское определение, и вложенное, тогда в скрипте {{ db.user }}:

```yaml
db: lll
  user: ppp
```

**Динамический реестр:**

Должен поддерживать следующий интерфейс:  
\--host=hostname - реестр выдает список в JSON { "ansible\_ssh\_host": "127.0.0.1", "ansible\_ssh\_port": 2200, "ansible\_ssh\_user": "vagrant"}   
\--list реестр выдает список групп {"staging": \[ "ontaro.ехамрlе.сом", "quebec.ехаmple.сом"\], "vagrant": \[ "vagrant1", "vagrant2", "vagrantЗ"\]}  
 "\_meta" : {"hostvars" : {"vagrant1" : {"ansible\_ssh\_host": "127.0.0.1", "ansible\_ssh\_port": 2222, "ansible\_ssh\_user": "vagrant"}, "vagrant2": {"ansible\_ssh\_host": "127.0.0.1", "ansible\_ssh\_port": 2200, "ansible\_ssh\_user": "vagrant"}}}  
 Если создать папку inventory и добавить в ansible.cfg параметр hostfile = inventory то статический hosts и динамический будут объединены  
 Если включить сбор фактов gather\_facts: True то можно во время выполнения задач группировать хосты (например debian/centos)

Использование динамического реестра (в примере my\_dynamic\_inventory.py должен быть исполняемым скриптом)

```bash
ansible-playbook -i my_dynamic_inventory.py my_playbook.yml
```

В Ссылках есть материал по динамическим реестрам

<div id="bkmrk-%7E%2Fgroup_vars%2Fexample"></div><div id="bkmrk--4"></div><div id="bkmrk--7"></div><div id="bkmrk-%D0%9F%D1%80%D0%B5%D0%B4%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B5">**Предустановленные переменные**</div><div id="bkmrk-%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 25.8562%;"></col><col style="width: 74.1438%;"></col></colgroup><tbody><tr><td class="align-center">Переменная</td><td class="align-center">Использование</td></tr><tr><td>ansible\_user</td><td>пользователь, от имени которого выполняются задачи на хостах данной группы. Значение в файле задач игнорируется.</td></tr><tr><td>ansible\_host</td><td>Сопоставление ip-имени</td></tr><tr><td>ansible\_port</td><td>Порт доступа по ssh</td></tr><tr><td>ansible\_connection</td><td>Может быть ssh, local, docker (запуск команд непосредственно на контейнере)</td></tr><tr><td>ansible\_become</td><td>+ sudo</td></tr><tr><td>ansible\_become\_user</td><td>sudo -&gt; another user</td></tr><tr><td>ansible\_ssh\_private\_key\_file</td><td>адрес ключа</td></tr></tbody></table>

</div><div id="bkmrk-%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%3A">**Ссылки:**</div><div id="bkmrk-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE-c">[Описание основного config файла](https://docs.ansible.com/ansible/latest/reference_appendices/config.html)</div><div id="bkmrk-%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%80%D0%B5%D0%B5%D1%81%D1%82%D1%80">[Динамический реестр](https://habr.com/ru/articles/704518/)</div>