Укажите пароль 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 поддерживает эту опцию с 1.3.


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

где "пользователь" - имя пользователя.