Site icon 8HOST.COM

Повышение привилегий в плейбуках Ansible

Ansible – это современный инструмент управления конфигурацией. Для связи и выполнения команд на управляемых серверах (нодах) он использует только SSH и Python – то есть вам не нужно устанавливать агентское программное обеспечение на удаленные ноды. В этой серии мануалов вы познакомитесь с основными функциями Ansible, которые можно использовать для написания сценариев автоматизации серверов. В конце серии вы найдете практический пример плейбука для автоматизации настройки удаленного веб-сервера Nginx и развертывания на нем статического HTML-сайта.

Примечание: Этот мануал является частью серии по работе с Ansible. Другие мануалы из этой серии вы найдете по тегу ansible-practice. Весь код можно найти в этом репозитории.

Сейчас важно разобраться, как работает повышение привилегий в Ansible – это позволит вам выполнять задачи с соответствующими разрешениями. По умолчанию задачи запускаются от имени подключающегося пользователя: это может быть либо пользователь root, либо любой обычный пользователь с доступом SSH к удаленным нодам в инвентаре.

Чтобы запустить команду с расширенными привилегиями (например любую команду, требующую доступа к sudo), нужно включить в плей директиву become со значением yes. Эту настройку можно сделать глобальной (тогда она будет действительной для всех задач в этом плее) или индивидуальной (для одной конкретной задачи). В зависимости от того, как ваш пользователь sudo настроен на удаленных нодах, вам также может понадобиться указать его пароль. В следующем примере мы попробуем обновить кеш apt – для этой задачи требуются права root.

Создайте новый файл playbook-07.yml в нашем каталоге ansible-practice:

nano ~/ansible-practice/playbook-07.yml

Затем добавьте в новый плейбук следующие строки:

---
- hosts: all
  become: yes
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes

Сохраните и закройте файл.

Чтобы запустить этот плейбук, нужно включить в команду ansible-playbook параметр -K. Тогда Ansible запросит пароль sudo для указанного пользователя.

ansible-playbook -i inventory playbook-07.yml -u 8host -K

Вы также можете изменить пользователя, на которого хотите переключиться во время выполнения задачи или плея. Для этого установите в директиве begin_user имя необходимого пользователя. Эта директива полезна, когда в вашем плейбуке есть несколько задач, которые полагаются на sudo, но также есть и задачи, которые должны выполняться в сессии обычного пользователя.

В следующем примере мы определим, что все задачи в этом плее по умолчанию будут выполняться через sudo. Это делается на уровне плея, сразу после определения hosts. Первая задача создает файл в /tmp с правами root, так как это значение директивы became_user по умолчанию. Последняя задача, однако, определяет собственную директиву become_user.

В каталоге ansible-practice создайте новый файл playbook-08.yml:

nano ~/ansible-practice/playbook-08.yml

Вставьте в него такое содержимое:

---
- hosts: all
  become: yes
  vars:
    user: "{{ ansible_env.USER }}"
  tasks:
    - name: Create root file
      file:
        path: /tmp/my_file_root
        state: touch

    - name: Create user file
      become_user: "{{ user }}"
      file:
        path: /tmp/my_file_{{ user }}
        state: touch

Сохраните и закройте файл.

Факт ansible_env.USER содержит имя подключающегося пользователя, которое можно определить во время выполнения при запуске команды ansible-playbook с параметром -u. В этом руководстве мы подключаемся как пользователь 8host (укажите имя своего пользователя):

ansible-playbook -i inventory playbook-08.yml -u 8host -K

BECOME password:

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

TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.10]

TASK [Create root file] *********************************************************************************
changed: [203.0.113.10]

TASK [Create user file] *********************************************************************************
changed: [203.0.113.10]

PLAY RECAP **********************************************************************************************
203.0.113.10           : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Когда плейбук завершит работу, вы сможете войти в систему на удаленной ноде (или нодах), чтобы убедиться, что в каталоге /tmp появились два новых файла, каждый со своим владельцем:

ssh 8host@203.0.113.10
-rw-r--r-- 1 root  root 0 Apr 14 13:19 /tmp/my_file_root
-rw-r--r-- 1 8host sudo 0 Apr 14 12:07 /tmp/my_file_8host

За более подробной информацией о повышении привилегий в Ansible обратитесь к официальной документации.