# Ansible

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

# Установка

**На 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>

# Запуск и элементы управления ansible скриптами

<div class="align-center" id="bkmrk-%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2">**Запуск одного действия**</div><div id="bkmrk-ansible-%5Bhost%2Fgroup%2F">ansible [host/group/all] [action parameters]</div><div id="bkmrk-%D0%94%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D1%8F%C2%A0">**Действия** </div><div id="bkmrk--a-%22shell-command%22-s">-a "shell command" shell command</div><div id="bkmrk--m-exec_name-install">-m exec_name installed module</div><div id="bkmrk--i-%3Cfilename%3E-invent">-i &lt;filename&gt; inventory file</div><div id="bkmrk---become-%D0%B2%D1%81%D0%B5-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B0%D0%BD%D0%B4">--become все команды + sudo</div><div id="bkmrk---become-user-user1-">--become-user user1 обязательно с become, переключается на выбранного пользователя</div><div id="bkmrk--f-1-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE">-f 1 использование одного потока. По умолчанию процессы параллельно для всех хостов. </div><div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%3A">**Пример:**</div>```bash
ansible multi -a "hostname"
```

**Запуск через ansible playbook**

<div id="bkmrk-%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9-%D1%81%D0%BE%D1%85%D1%80">Список действий сохраняется в файле *.yml (playbook)</div>```bash
ansible-playbook filename.yml
```

<div id="bkmrk-%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-playbook-%D1%84">**Структура playbook файла**</div>```yaml
---
- hosts: [host ip | host group | all]
    remote_user: []
    become: true
    tasks:
      - [task 1]
      - [task n]
---
- hosts: [host ip | host group | all]
    remote_user: []
    become: true
    tasks:
      - [task 1]
      - [task n]
```

**Параметры задачи**

gather\_facts: False Проводить сбор данных по умолчанию  
ignore\_errors: True Прекращать или нет работу при ошибке

**Переменные из модулей**

```yaml
---
- name: Check if host is up and running
  hosts: all
  become: false
  gather_facts: false

  tasks:
    - name: Ping the remote server
      ping:
      register: result
      until: result is succeeded
      retries: 3
      delay: 10

    - name: Get system uptime
      command: uptime
      when: result is succeeded
      register: uptime_result

    - name: Show system uptime
      debug:
        var: uptime_result.stdout
      when: result is succeeded
```

10: полученное значение из модуля ping сохраняется в переменной result

11: данное задание выполняется до тех пор, пока result не будет succeeded, но с ограничением кол-ва попыток (12) и задержкой между попытками (13)

17: задание 15 выполняется если result succeeded

18: полученное значение заносится в переменную uptime\_result

21: вывод значения uptime\_result

**Условия (handlers)**

```yaml
when: ansible_os_family == "Debian"
```

**Получить список фактов:**

```yaml
- name: Show facts available on the system
  ansible.builtin.debug:
  var: ansible_facts
```

В папке /etc/ansible/facts.d/\*.fact файлы с локальными фактами о машине. Обращение к фактам в yaml:

```yaml
ansible_local.<fact file name>.<fact group inside file>.<varname>
```

Создание новой переменной:

```yaml
set_fact:<valname>=<...>
```

**Циклы (loops)**

Цикл с объявленной переменной:

```yaml
 - name: use apt to install multiple apps
   apt:
     name: '{{ app }}'
     state: latest
     update_cache: yes
     vars:
       app:
         - htop
         - mc
         - nload
     become: yes
```

Цикл с необъявленной переменной:

```yaml
- name: use apt to install multiple apps
  apt:
    name: '{{ item }}'
    state: latest
    update_cache: yes
    loop:
      - htop
      - mc
      - nload
    become: yes
```

Цикл с переменной-словарем

```yaml
- name: install python packages
  pip: name={{item.name}} version={{item.version}}
  become: True
  with_items:
    - {name=mezzanine, version=1.2.1}
	- {name=guincorn, version=3.2.9}
```

**Проверка ошибок выполнения**

Проверяет условия и останавливает выполнение при нарушении

```yaml
- name: Проверка значения переменной
  assert:
    that:
      - my_variable == "expected_value"
```

<details id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%B8%D0%B7-%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0"><summary>Примеры из документации:</summary>

```yaml
- name: A single condition can be supplied as string instead of list
  ansible.builtin.assert:
    that: "ansible_os_family != 'RedHat'"

- name: Use yaml multiline strings to ease escaping
  ansible.builtin.assert:
    that:
      - "'foo' in some_command_result.stdout"
      - number_of_the_counting == 3
      - >
        "reject" not in some_command_result.stderr

- name: After version 2.7 both 'msg' and 'fail_msg' can customize failing assertion message
  ansible.builtin.assert:
    that:
      - my_param <= 100
      - my_param >= 0
    fail_msg: "'my_param' must be between 0 and 100"
    success_msg: "'my_param' is between 0 and 100"

- name: Please use 'msg' when ansible version is smaller than 2.7
  ansible.builtin.assert:
    that:
      - my_param <= 100
      - my_param >= 0
    msg: "'my_param' must be between 0 and 100"

- name: Use quiet to avoid verbose output
  ansible.builtin.assert:
    that:
      - my_param <= 100
      - my_param >= 0
    quiet: true
```

</details>

# Модули

# Общая информация

Модули - созданный на python скрипт, упрощающий конкретную задачу.

Модули возвращают значения, название модуля должно быть под name. Есть общие переменные и специфичные для модулей

Справка по модулю

```bash
ansible-doc apt
```

Список модулей

```bash
ansible-doc -l 
```

Пример проверки необходимости перезагрузки

```yaml
- name: check if reboot is required
  become: yes
  become_method: sudo
  shell: "[ -f /var/run/reboot-required ]"
  failed_when: False
  register: reboot_required
  changed_when: reboot_required.rc == 0
  notify: reboot
  
handlers:
- name: reboot
  command: shutdown -r now "Ansible triggered reboot after system updated"
  async: 0
  poll: 0
  ignore_errors: true
```

Ссылки

[Информация на русском языке о модулях](https://runebook.dev/ru/docs/ansible/-index-)

# Системные модули и скрипты

<details id="bkmrk-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B8%2F%D0%B8%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2"><summary>Установка и/или проверка установки apt пакета</summary>

**Название модуля:** apt

**Переменные:**

- name: ntp #имя проверяемого и устанавливаемого модуля
- state: present #состояние после завершения
- update\_cache: yes # обновлять ли кэш

```yaml
- name: Install module
  apt: 
    name: ntp
    state: present
    update_cache: yes
```

</details><details id="bkmrk-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BA%D0%BB%D1%8E%D1%87-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD"><summary>Добавить ключ стороннего репозитория</summary>

```yaml
- name: Add Docker GPG key
  apt_key:
     url: https://download.docker.com/linux/ubuntu/gpg
```

</details><details id="bkmrk-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B8%D0%B9-%D1%80"><summary>Добавить сторонний репозиторий</summary>

```yaml
- name: Add Docker repository
  apt_repository:
    repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
```

</details><details id="bkmrk-%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-apt-%D0%BA%D1%8D%D1%88---n"><summary>Обновить apt кэш</summary>

```yaml
- name: Update apt cache
  apt: update_cache=yes
```

</details>---

<details id="bkmrk-%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C"><summary>Копирование файлов</summary>

Копирование с локального на удаленный

```yaml
- name: Copy from server to client
  copy:
    src: /home/user/file.txt 
    dest: /home/setup/file.txt
    owner: foo
    group: foo
    mode: '0644'
```

Копирование с удаленного на локальный

```yaml
- name: Copy from client to server
  fetch:
    src: /var/log/access.log
    dest: /var/log/fetched
    flat: true удалить структуру родительских папок для файла
```

</details>---

<details id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB"><summary>Создание пользователя и группы</summary>

Создание пользователя

```yaml
- name: Create and/or check presence user
  user:
    name: install
    state: present
    shell: /bin/bash
    group: sudo
    system: yes
    hidden: yes
    ssh_key_file: .ssh/id_rsa
    expires: -1
```

Создание группы

```yaml
- name: Create check group
  group:
    name: clustergroup
    state: present
    gid: 1040
```

</details><details id="bkmrk-%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0%D0%BC%D0%B8"><summary>Управление сервисами (daemon)</summary>

```yaml
- name: Update sysctl
  sysctl:
    name: net.ipv4.ip_forward
    value: 1
    sysctrl_set: yes
    state: present
    reload: yes   
```

```yaml
- name: Set or check service
  service:
    name: ntp
    state: started
    enabled: yes
```

```yaml
- name: Set check daemon starting
  systemd:
    name: ntp
    state: started
    enabled: yes
    masked: no
    daemon_reload: yes
    register: systemd
```

cron:

</details><details id="bkmrk-%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B-%D0%B8-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5"><summary>Скрипты и консольные команды</summary>

```yaml
- name: Raw command
  raw: echo "this was written by a raw Ansible module!!" >> ~/raw.txt
```

```yaml
- name: Executing script
  shell: ./shell_script.sh >> ~/shell.txt
    args:
    chdir: /usr/local/
    creates: ~/shell.txt
    executable: /bin/csh
```

```yaml
- name: Executing python script
  script: ./shell_script.py –some-argumets "42"
    args:
    creates: ~/shell.txt
    executable: python
```

Для исполнения expect скриптов нужно сначала проверить и установить пакет expect

```yaml
- name: Expect module
  expect:
    command: passwd user1
    responses:
    (?i)password: "Ju5tAn07herP@55w0rd":
```

</details>

# Git и pip

<details id="bkmrk-git---name%3A-clone-up"><summary>Git</summary>

```yaml
- name: Clone update repo
  git:
    repo: https://github.com/ansible/ansible.git
    dest: /usr/local/ansible
    clone: yes
    update: yes 
```

</details><details id="bkmrk-pip-%D0%98%D0%B7-%D0%BE%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-"><summary>Pip</summary>

Из официального репозитория:

```yaml
- name: Install python package
  pip:
     name: numpy
     version: 0.3
```

Из внешнего источника

```yaml
- name: install a python library from a github
  pip:
    name: https://github.com/jakubroztocil/httpie
```

</details>

# Docker

**Необходимые модули:**   
pip install 'docker-py&gt;=1.7.0'  
pip install 'docker-compose&gt;=1.7.0'  
ansible-container позволяет работать с docker без dockerfile

<details id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0-"><summary>Создание контейнера</summary>

```yaml
- name: create a container
  docker_container:
    name: debianlinux
    image: debian:9
    pull: yes
    state: present
```

</details><details id="bkmrk-%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0---"><summary>Запуск контейнера</summary>

```yaml
- name: start a container
  docker_container:
    name: debianlinux
    state: started
    devices:
      - "/dev/sda:/dev/xvda:rwm"
```

</details><details id="bkmrk-%D0%9E%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%B0"><summary>Остановка контейнера</summary>

```yaml
- name: stop a container
  docker_container:
    name: debianlinux
    state: stopped
```

</details><details id="bkmrk-%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0-%D0%B8%D0%B7-%D0%BB"><summary>Удаление образа из локального хранилища</summary>

```yaml
- name: remove a container image
    docker_image:
      name: labimages/ubuntu
      state: absent
      tag: lab16
```

</details><details id="bkmrk-%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-docke"><summary>Авторизация на docker hub</summary>

```yaml
- name: login to DockerHub
  docker_login:
    username: labuser1
    password: "L@bp@55w0rd"
    email: user1@lab.edu
```

</details><details id="bkmrk-%D0%A1%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7-%D0%B8%D0%B7-doc"><summary>Скачать образ из docker hub</summary>

```yaml
- name: pull a container image
    docker_image:
      name: ubuntu:18.04
      pull: yes
```

</details><details id="bkmrk-%D0%A1%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7-%D0%B2-do"><summary>Сохранить образ в docker hub</summary>

```yaml
- name: push a container image to docker hub
  docker_image:
    name: labimages/ubuntu
    repository: labimages/ubuntu
    tag: lab18
    push: yes
```

</details>

# Роли

**Структура роли и добавление в playbook**

1. Создается папка roles, внутри папки с названиями ролей, внутри каждой папки - defaults files handlers meta templates tasks vars
2. в playbook добавляется   
    ```yaml
       roles:
        - имя
    ```

**Назначения папок**

<table border="1" id="bkmrk-%D0%9F%D0%B0%D0%BF%D0%BA%D0%B0-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-def" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 19.5587%;"></col><col style="width: 80.4413%;"></col></colgroup><thead><tr><td class="align-center">Папка</td><td class="align-center">Назначение</td></tr></thead><tbody><tr><td>defaults</td><td>позволяет устанавливать переменные по умолчанию для включенных или зависимых ролей.</td></tr><tr><td>files</td><td>содержит статические файлы и файлы сценариев, которые могут быть скопированы на удалённый сервер или выполнены на нём.</td></tr><tr><td>handlers</td><td>все обработчики, которые ранее были в вашем плейбуке, теперь могут быть добавлены в каталог.</td></tr><tr><td>meta</td><td>для метаданных роли, которые используются для управления зависимостями. Например, вы можете определить список ролей, которые должны быть применены до вызова текущей роли.</td></tr><tr><td>templates</td><td>для шаблонов, которые генерируют файлы на удалённых хостах. </td></tr><tr><td>tasks</td><td>содержит один или несколько файлов с задачами, которые определяются в разделе tasks обычного плейбука Ansible. Эти задачи могут напрямую ссылаться на файлы и шаблоны, содержащиеся в соответствующих каталогах внутри роли, без необходимости указывать полный путь к файлу.</td></tr><tr><td>vars</td><td>переменные для роли могут быть указаны в файлах внутри каталога, а затем ссылаться на них в другом месте роли.</td></tr></tbody></table>

**Ссылки:**

[Пример преобразования одного файла в роль](https://habr.com/ru/companies/slurm/articles/706920/)