Ansible практика – урок №12: Как использовать модуль shell.

Предыдущий урок: Ansible практика – урок №11: Шаблоны и их применение.

В Ansible существует огромное множество модулей. Какие-то созданы непосредственно командой Ansible, какие то произведены сообществом. На многие стандартные задачи можно найти готовый модуль Ansible.

Когда пригодится модуль shell?

Если под вашу задачу нет отдельного модуля, то вам, скорее всего, поможет модуль shell. Он позволяет запускать команды в терминале управляемого хоста.

Любую нестандартную задачу можно разделить на серию команд, или вынести в отдельный скрипт и запустить с помощью модуля shell.

Как использовать модуль shell

В этом уроке мы с помощью htpasswd создадим файл с парой пользователь/пароль. А в следующем уроке используем его для Basic Auth.

Шаг 1. Редактируем роль

Добавим в роль nginx новую таску. В результате, файл roles/nginx/tasks/main.yml будет иметь следующий вид:

---
- name: "Role: NGINX | Block: Installation"
  tags:
    - installation
    - nginx
  block:
    - name: "Install NGINX on CentOS"
      ansible.builtin.dnf:
        name: nginx
        state: latest
      when: ansible_distribution == "CentOS"

    - name: "Install NGINX on Ubuntu"
      ansible.builtin.apt:
        name: nginx
        state: latest
      when: ansible_distribution == "Ubuntu"

- name: "Ensure NGINX is started and enabled"
  ansible.builtin.service:
    name: nginx
    state: started
    enabled: true
  tags:
    - start
    - nginx

- name: "Role: NGINX | Block: Configuration"
  notify: restart_nginx
  tags:
    - nginx
  block:
    - name: "Deploy nginx.conf from template"
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        mode: '0644'
        owner: root
        group: root

    - name: "Set user/password for Basic Auth"
      ansible.builtin.shell: htpasswd -cb /usr/share/nginx/.htpasswd ba_user secret_password
      when: basic_auth is defined and basic_auth is true

Мы используем модуль ansible.builtin.shell (документация).

С его помощью мы исполняем команду htpasswd на управляемой ноде. Задаем пользователя (ba_user) и пароль(secret_password) и записываем их в файл (/usr/share/nginx/.htpasswd). В дальнейшем мы будем обращаться к данному файлу.

Таск будет выполнен только в том случае, если переменная basic_auth задана и верна.

Шаг 2. Проверяем плейбук

Запустим плейбук и проверим результат:

[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags nginx --skip-tags installation,start

PLAY [all] ******************************************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [Managed-Node-2]
ok: [Managed-Node-3]
ok: [Managed-Node-1]

TASK [nginx : Deploy nginx.conf from template] ******************************************************************************************************************************************************
ok: [Managed-Node-1]
ok: [Managed-Node-2]
ok: [Managed-Node-3]

TASK [nginx : Set user/password for Basic Auth] *****************************************************************************************************************************************************
skipping: [Managed-Node-2]
skipping: [Managed-Node-3]
changed: [Managed-Node-1]

RUNNING HANDLER [nginx : restart_nginx] *************************************************************************************************************************************************************
changed: [Managed-Node-1]

PLAY RECAP ******************************************************************************************************************************************************************************************
Managed-Node-1             : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Managed-Node-2             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
Managed-Node-3             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

[root@Control-Node ansible]#

Ansible отработал без проблем, но задача Set user/password for Basic Auth исполнена только для Managed-Node-1, так как только для нее переменная basic_auth имеет значение true.

Проверим, что файл создан и имеет содержание:

[root@Managed-Node-1 ~]# cat /usr/share/nginx/.htpasswd
ba_user:$apr1$jQXhByRy$wPBT/w3.bX9Sf1eAwN7Nd/
[root@Managed-Node-1 ~]#

Обратите внимание, что пароль хранится в хешированном виде.

Итоги:

Мы научились использовать модуль shell, с помощью которого можно производить какие угодно манипуляции с серверами. Данный модуль – универсальное средство. Но если есть отдельный модуль под вашу задачу, лучше использовать его, это проще и удобнее.

Следующий урок: Ansible практика – урок №13 Использование условия if в шаблонах.