Укажите пароль sudo для Ansible
Как указать пароль sudo для Ansible неинтерактивным способом?
Я запускаю Ansible playbook следующим образом:
ansible-playbook playbook.yml -i inventory.ini --user=username --ask-sudo-pass
но я хочу запустить его так:
ansible-playbook playbook.yml -i inventory.ini --user=username
--sudo-pass=12345
есть ли способ? Я хочу максимально автоматизировать развертывание проекта.
17 ответов
вы можете передать переменную в командной строке через --extra-vars "name=value"
. Переменная пароля Sudo -ansible_sudo_pass
. Таким образом ваша команда будет выглядеть так:
ansible-playbook playbook.yml -i inventory.ini --user=username \
--extra-vars "ansible_sudo_pass=yourPassword"
обновление 2017: Ansible 2.2.1.0 теперь использует var ansible_become_pass
. И то и другое, кажется, работает.
документы сильно рекомендуется не устанавливать пароль sudo в открытом тексте, а вместо этого использовать --ask-sudo-pass
в командной строке при запуске ansible-playbook
обновление 2016:
Ansible 2.0 (не 100%, когда) отмечен --ask-sudo-pass
как deprecated. документы теперь рекомендую использовать --ask-become-pass
вместо этого, а также замена использования sudo
во всех ваших playbooks с become
.
вероятно, лучший способ сделать это-предполагая, что вы не можете использовать решение NOPASSWD, предоставленное scottod, - использовать решение Мирчи Вутковича в сочетании с Ansible vault.
например, у вас может быть план что-то вроде этого:
- hosts: all
vars_files:
- secret
tasks:
- name: Do something as sudo
service: name=nginx state=restarted
sudo: yes
здесь мы включаем файл под названием secret
который будет содержать наш пароль sudo.
мы будем использовать ansible-vault для создания зашифрованной версии этого файл:
ansible-vault create secret
это попросит вас ввести пароль, а затем откройте редактор по умолчанию для редактирования файла. Вы можете положить свой ansible_sudo_pass
здесь.
например: secret
:
ansible_sudo_pass: mysudopassword
сохранить и выйти, теперь у вас есть зашифрованный secret
файл, который Ansible может расшифровать при запуске playbook. Примечание: Вы можете редактировать файл с помощью ansible-vault edit secret
(и введите пароль, который вы использовали при создании файла)
последняя часть головоломки является обеспечить Ansible с --vault-password-file
, который он будет использовать для расшифровки .
создайте файл с именем vault.txt
и в том, что поставил пароль, который вы использовали при создании . Пароль должен быть строкой, хранящейся как одна строка в файле.
из Ansible Docs:
.. убедитесь, что разрешения на файл таковы, что никто другой не может получить доступ к вашему ключу и не добавлять ключ к источнику контроль
наконец: теперь вы можете запустить свой playbook с чем-то вроде
ansible-playbook playbook.yml -u someuser -i hosts --sudo --vault-password-file=vault.txt
выше предполагается следующий макет каталога:
.
|_ playbook.yml
|_ secret
|_ hosts
|_ vault.txt
вы можете прочитать больше о Ansible Vault здесь:https://docs.ansible.com/playbooks_vault.html
глядя на код (runner/__init__.py
), Я думаю, вы, вероятно, можете установить его в ваш файл inventory :
[whatever]
some-host ansible_sudo_pass='foobar'
кажется, в ansible.cfg
файл конфигурации тоже, но не реализован прямо сейчас (constants.py
).
Я не думаю, что ansible позволит вам указать пароль в флагах, как вы хотите сделать. Возможно, где-то в конфигурациях это можно установить, но это сделало бы использование ansible менее безопасным в целом и не рекомендуется.
одна вещь, которую вы можете сделать, это создать пользователя на целевой машине и предоставить им права sudo без пароля для всех команд или ограниченного списка команд.
Если вы запустите sudo visudo
и введите строку, как показано ниже, затем пользователь "privilegedUser" не должен вводить пароль, когда они запускают что-то вроде sudo service xxxx start
:
%privilegedUser ALL= NOPASSWD: /usr/bin/service
вы можете установить пароль для группы или для всех серверов сразу:
[all:vars]
ansible_sudo_pass=default_sudo_password_for_all_hosts
[group1:vars]
ansible_sudo_pass=default_sudo_password_for_group1
на sudo пароль хранится как переменная с именем ansible_sudo_pass
.
Вы можете установить эту переменную несколькими способами:
на хост, в вашем инвентаре hosts файл (inventory/<inventoryname>/hosts
)
[server]
10.0.0.0 ansible_sudo_pass=foobar
в группе, в вашем файле инвентаризации групп (inventory/<inventoryname>/groups
)
[server:vars]
ansible_sudo_pass=foobar
в группе, в группе vars (group_vars/<groupname>/ansible.yml
)
ansible_sudo_pass: "foobar"
в группе, зашифрованные (ansible-vault create group_vars/<groupname>/ansible.yml
)
ansible_sudo_pass: "foobar"
я рвал на себе волосы над этим, теперь я нашел решение, которое делает то, что я хочу:
1 зашифрованный файл на хост, содержащий пароль sudo
/ etc / ansible / hosts:
[all:vars]
ansible_ssh_connection=ssh ansible_ssh_user=myuser ansible_ssh_private_key_file=~/.ssh/id_rsa
[some_service_group]
node-0
node-1
затем вы создаете для каждого хоста зашифрованный var-файл, например:
ansible-vault create /etc/ansible/host_vars/node-0
С содержанием
ansible_sudo_pass: "my_sudo_pass_for_host_node-0"
как вы организуете пароль хранилища (введите через --ask-vault-pass) или cfg до вас
основываясь на этом i подозреваю, что вы можете просто зашифровать весь файл hosts...
можно использовать ansible vault который будет кодировать ваш пароль в зашифрованном хранилище. После этого вы можете использовать переменную из vault в playbooks.
некоторая документация по Ansible vault:
http://docs.ansible.com/playbooks_vault.html
мы используем его как хранилище для каждой среды. Для редактирования vault у нас есть команда:ansible-vault edit inventories/production/group_vars/all/vault
Если вы хотите вызвать переменную vault, вы должны использовать ansible-playbook с параметрами например:ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Да мы храним пароль хранилища в локальном каталоге в виде обычного текста, но это не более опасно, чем хранить пароль root для каждой системы. Пароль Root находится внутри файла vault или вы можете иметь его как файл sudoers для вашего пользователя / группы.
Я рекомендую использовать файл sudoers на сервере. Вот пример для группы admin:%admin ALL=(ALL) NOPASSWD:ALL
Если вам удобно хранить пароли в текстовых файлах, другой вариант-использовать файл JSON с параметром --extra-vars (обязательно исключите файл из системы управления версиями):
ansible-playbook --extra-vars "@private_vars.json" playbook.yml
Ansible vault был предложен пару раз здесь, но я предпочитаю git-crypt для шифрования конфиденциальных файлов в моих playbooks. Если вы используете Git, чтобы сохранить свой анзибль сценарии, это несложно. Проблема, которую я обнаружил с Ansible vault, заключается в том, что я неизбежно сталкиваюсь с зашифрованными копиями файла, с которым я хочу работать, и должен расшифровать его, прежде чем я смогу работать. git-crypt
предлагает более приятный рабочий процесс ММО.
используя это, вы можете поместить свои пароли в var в свой playbook и пометить свой playbook как зашифрованный файл в .gitattributes
такой:
my_playbook.yml filter=git-crypt diff=git-crypt
ваш playbook будет прозрачно зашифрован на Github. Затем вам просто нужно либо установить ключ шифрования на хост, который вы используете для запуска ansible, либо следовать инструкции по документации для его настройки gpg
.
есть хороший вопрос и ответ на пересылку gpg
ключи, как ваш ssh-agent
перенаправляет ключи SSH здесь: https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent.
просто позвоните в свой playbook с --extra-vars "become_pass=Password"
become_pass=('ansible_become_password','ansible_become_pass')
можно использовать sshpass
утилиты как ниже
$ sshpass -p "your pass" ansible pattern -m module -a args \
-i inventory --ask-sudo-pass
вы можете написать пароль sudo для своего playbook в файле hosts следующим образом:
[host-group-name]
host-name:port ansible_sudo_pass='*your-sudo-password*'
мы также можем использовать EXPECT BLOCK В ansible для spawn bash и настроить его в соответствии с вашими потребностями
- name: Run expect to INSTALL TA
shell: |
set timeout 100
spawn /bin/sh -i
expect -re "$ "
send "sudo yum remove -y xyz\n"
expect "$ "
send "sudo yum localinstall -y {{ rpm_remotehost_path_for_xyz }}\n"
expect "~]$ "
send "\n"
exit 0
args:
executable: /usr/bin/expect
очень просто, и только добавить в файл переменной:
пример:
$ vim group_vars/all
и добавить это:
Ansible_connection: ssh
Ansible_ssh_user: rafael
Ansible_ssh_pass: password123
Ansible_become_pass: password123
это сработало для меня... Создан файл / etc / sudoers.D / 90-init-файл пользователей с NOPASSWD
echo "user ALL=(ALL) NOPASSWD:ALL" > 90-init-users
где "пользователь" - имя пользователя.