Большинство действий в наборах инструкций системы управления конфигурациями Ansible следует выполнять с привилегиями суперпользователя. Давайте разберемся с вариантами ввода sudo
-пароля при выполнении playbook’ов!
Самый простой способ — отключить необходимость ввода пароля при использовании sudo
. Делается это в конфигурационном файле /etc/sudoers
, где нужно добавить (или раскомментировать) строку:
...
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
...
Второй вариант — использовать дополнительные параметры при запуске набора инструкций. Чтобы Ansible в нужный момент попросил ввести sudo
-пароль, в старых версиях (< 1.9) следует использовать параметр -—ask-sudo-pass
(или -K
), а в версии Ansible старше 1.9 параметр --ask-become-pass
, например:
ansible-playbook playbooks/useradd.yml --ask-become-pass
Бывают случаи, когда не подходит ни один из предложенных вариантов — отключать ввод пароля при использовании sudo
небезопасно, а вводить пароль на каждое действие при выполнении набора инструкций неудобно (к тому же, можно ошибиться при ручном вводе).
Я использовал третий вариант — добавил буквально пару строк в инвентарном файле, теперь он выглядит следующим образом:
[all:vars]
ansible_sudo_pass=VeryStrongPassword
[webservers]
web1
web2
web3
[mailservers]
mail1
mail2
mail3
[database]
db1
db2
[others]
stat
mars
venus
earth
Следует отметить, что переменную ansible_sudo_pass
можно переопределять в нескольких местах:
- для каждого отдельного хоста в инвентарном файле
inventory/inventoryname/hosts
; - для группы хостов в инвентарном файле
inventory/inventoryname/groups
(как раз наш случай); - для группы хостов в файле групповых переменных
group_vars/groupname/ansible.yml
; - для группы хостов в файле групповых переменных в зашифрованном виде
ansible-vault create group_vars/groupname/ansible.yml
.
Если хочется еще больше «безопасности» и зашифрованный пароль, то следует использовать ansible-vault
.
Сначала создадим файл, в котором будет храниться пароль для получения привилегий суперпользователя:
ansible-vault create secret
В созданный файл secret
следует добавить строку вида:
ansible_sudo_pass: VeryStrongPassword
И, так как мы все равно не хотим вводить пароль при запуске плейбука (даже пароль ansible-vault
), то создадим файл vault.txt
(не забываем выставить корректные права доступа):
touch vault.txt
В котором в текстовом виде запишем свой пароль от ansible-vault
.
Далее приводим playbook к примерно такому виду:
---
- hosts: all
become: yes
vars_files:
- secret
tasks:
- name: Add user to remote hosts
user: name=admin groups=sudo shell=/bin/bash password=$7$ZIJUvGwr$empMJ4r1JUGcxmjxtTBfTpIdO95JBTJO2/BtD23F2Rfeg2rqN.8t1v3ePPXVl.W7yal2fvrtbJ0T18YwCXmbh0
- name: Add SSH keys to remote hosts
authorized_key: user=admin key="{{ lookup('file', "~/Downloads/key.pub") }}"
Теперь можно запускать выполнение набора инструкций командой:
ansible-playbook playbooks/useradd.yml --vault-password-file=vault.txt