Как указать пароль 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**
Есть ли способ? Я хочу максимально автоматизировать развертывание моего проекта.
Ответы:
Вы можете передать переменную в командной строке через
--extra-vars "name=value"
. Переменная пароля Sudo естьansible_sudo_pass
. Итак, ваша команда будет выглядеть так:Обновление 2017 : Ansible 2.2.1.0 теперь использует var
ansible_become_pass
. Либо, кажется, работает.источник
history -c
после выполнения yml..bash_history
.Документы настоятельно рекомендуют не устанавливать пароль sudo в виде открытого текста и использовать вместо этого
--ask-sudo-pass
в командной строке при запускеansible-playbook
Обновление 2016:
Ansible 2.0 (не 100%, когда) помечен
--ask-sudo-pass
как устаревший. Документы теперь рекомендуют использовать--ask-become-pass
вместо этого, а также поменять местами использование воsudo
всех ваших книгах сbecome
.источник
Вероятно, лучший способ сделать это - предполагая, что вы не можете использовать решение NOPASSWD, предоставляемое scottod, - это использовать решение Мирчи Вутковича в сочетании с хранилищем Ansible .
Например, у вас может быть что-то вроде книги:
Здесь мы включаем файл с именем,
secret
который будет содержать наш пароль sudo.Мы будем использовать ansible-vault для создания зашифрованной версии этого файла:
Это попросит вас ввести пароль, а затем откройте редактор по умолчанию для редактирования файла. Вы можете поставить свой
ansible_sudo_pass
здесь.например
secret
:Сохраните и выйдите, теперь у вас есть зашифрованный
secret
файл, который Ansible может расшифровать при запуске вашей книги воспроизведения. Примечание: вы можете отредактировать файл с помощьюansible-vault edit secret
(и ввести пароль, который вы использовали при создании файла)Последняя часть головоломки - предоставить Ansible файл,
--vault-password-file
который он будет использовать для расшифровки вашегоsecret
файла.Создайте файл с именем
vault.txt
и введите пароль, который вы использовали при созданииsecret
файла. Пароль должен быть строкой, хранящейся как одна строка в файле.Из Ansible Docs:
Наконец: теперь вы можете запустить свою книгу с чем-то вроде
Выше предполагается, что следующий макет каталога:
Вы можете прочитать больше о Ansible Vault здесь: https://docs.ansible.com/playbooks_vault.html
источник
ansible-vault create group_vars/all/ansible.yml
и добавьansible_sudo_pass: yourpassword
туда. Не нужно менять книжки или инвентарьfatal: [localhost]: FAILED! => {"changed": false, "failed": true, "module_stderr": "sudo: a password is required\n", "module_stdout": "", "msg": "MODULE FAILURE", "parsed": false}
Глядя на код (
runner/__init__.py
), я думаю, что вы, вероятно, можете установить его в своем файле инвентаризации:Похоже, что в
ansible.cfg
конфигурационном файле есть некоторые условия , но они не реализованы прямо сейчас (constants.py
).источник
host_vars
или,group_vars
а затем зашифровать файл с помощью ansible-vaultЯ не думаю, что ansible позволит вам указать пароль в флагах, как вы хотите. Может быть где-то в конфигах это может быть установлено, но это сделает использование ansible менее безопасным в целом и не рекомендуется.
Одна вещь, которую вы можете сделать, - это создать пользователя на целевом компьютере и предоставить ему привилегии sudo без пароля для всех команд или ограниченного списка команд.
Если вы запустите
sudo visudo
и введете строку, подобную приведенной ниже, то пользователю 'privilegedUser' не нужно будет вводить пароль, когда он запускает что-то вродеsudo service xxxx start
:источник
Пароль Sudo хранится в переменной с именем
ansible_sudo_pass
. Вы можете установить эту переменную несколькими способами:Для каждого хоста в файле инвентаризации хостов (
inventory/<inventoryname>/hosts
)По группе, в вашем файле групп инвентаря (
inventory/<inventoryname>/groups
)По группе, в группе vars (
group_vars/<groupname>/ansible.yml
)За группу, зашифровано (
ansible-vault create group_vars/<groupname>/ansible.yml
)источник
Вы можете установить пароль для группы или для всех серверов одновременно:
источник
Я рвал на себе волосы, и теперь нашел решение, которое делает то, что я хочу:
1 зашифрованный файл на хост, содержащий пароль sudo
/ и т.д. / анзибль / хосты:
затем вы создаете для каждого хоста зашифрованный var-файл примерно так:
с содержанием
как вы организуете пароль хранилища (введите --ask-vault-pass) или cfg зависит от вас
основываясь на этом, я подозреваю, что вы можете просто зашифровать весь файл hosts ...
источник
ansible-playback
. Я должен был использовать,-e @vault/filename.ext
чтобы использовать хранилище с моимansible-playbook
вызовом.Более разумный способ сделать это - сохранить ваш
sudo
пароль в безопасном хранилище, таком как LastPass или KeePass, а затем передать его сansible-playbook
использованием,-e@
но вместо жесткого кодирования содержимого в реальном файле вы можете использовать конструкцию-e@<(...)
для запуска команды в суб-оболочки и перенаправить его вывод (STDOUT) в анонимный файловый дескриптор, эффективно передавая пароль в-e@<(..)
.пример
Выше делается несколько вещей, давайте разберемся с этим.
ansible-playbook -i /tmp/hosts pb.yml
- очевидно запускает playbook через ansible-playbook$(lpass show folder1/item1 --password)"
- запускает интерфейс LastPasslpass
и получает пароль для использованияecho "ansible_sudo_pass: ...password..."
- принимает строку ansible_sudo_pass: и объединяет ее с паролем, предоставленнымlpass
-e@<(..)
- объединяет вышеперечисленное и подключает подоболочку<(...)
как дескриптор файла дляansible-playbook
использования.Дальнейшие улучшения
Если вы не хотите вводить это каждый раз, вы можете просто так делать. Сначала создайте псевдоним в вашем
.bashrc
виде:Теперь вы можете запустить свой playbook следующим образом:
Ссылки
источник
--extra-vars @<(echo ansible_become_pass: $(op get item <item name> | jq --raw-output '.details.sections[0].fields[] | select(.t=="password").v'))
/dev/fd/63
так как пароль находится в дескрипторе временного файла, она не раскрывается.Если вам удобно хранить пароли в текстовых файлах, другой вариант - использовать файл JSON с параметром --extra-vars (обязательно исключите этот файл из системы контроля версий):
Ansible поддерживает эту опцию с версии 1.3 .
источник
Вы можете написать пароль sudo для вашей книги воспроизведения в файле hosts следующим образом:
источник
Несколько раз здесь предлагалось Ansible Vault, но я предпочитаю git-crypt для шифрования конфиденциальных файлов в моих книгах. Если вы используете git, чтобы сохранить свои игровые книги, это совсем несложно. Проблема, с которой я столкнулся в ANSIBLE Vault, заключается в том, что я неизбежно сталкиваюсь с зашифрованными копиями файла, с которым я хочу работать, и мне приходится расшифровывать его, прежде чем я смогу работать.
git-crypt
предлагает более приятный рабочий процесс IMO.Используя это, вы можете поместить свои пароли в переменную в своей книге игр и пометить свою книгу как зашифрованный файл
.gitattributes
следующим образом:Ваша игровая книга будет прозрачно зашифрована на Github. Затем вам просто нужно либо установить ключ шифрования на хосте, который вы используете для запуска ansible, либо следовать инструкциям в документации для его установки
gpg
.Хорошие вопросы и ответы по переадресации
gpg
ключей, таких как вашиssh-agent
переадресованные ключи SSH, здесь: /superuser/161973/how-can-i-forward-a-gpg-key-via-ssh-agent .источник
Вы можете использовать
sshpass
утилиту, как показано ниже,источник
Использование ansible 2.4.1.0 и следующие должны работать:
И просто запустите playbook с этим инвентарем как:
источник
Мой способ автоматизировать это состоял в том, чтобы использовать переменную окружения и получать к ней доступ через
--extra-vars="ansible_become_pass='{{ lookup('env', 'ANSIBLE_BECOME_PASS') }}'"
.Экспортируйте env var, но избегайте истории bash / shell (добавьте пробел или другие методы). Например:
Поиск env var при передаче дополнительной
ansible_become_pass
переменной вansible-playbook
, например:Хорошие альтернативные ответы:
ansible_become_pass
. Это прилично. Однако для параноидальных команд, которым необходимо обмениваться паролями ансайта хранилища и выполнять ансайлы с индивидуальными учетными записями, они могут использовать пароль общего хранилища, чтобы отменить пароль операционной системы друг друга (кража идентификатора). Возможно, вам нужно доверять своей собственной команде?@
@ slm, сгенерированный в дескриптор временного файла и использующий префикс для чтения переменной ansible из дескриптора файла . Избегает истории bash по крайней мере. Не уверен, но мы надеемся, что эхо-оболочка subhell не будет обнаружена в журнале аудита (например, audd).источник
Вы можете использовать ansible Vault, который будет кодировать ваш пароль в зашифрованном хранилище. После этого вы можете использовать переменную из хранилища в playbooks.
Некоторая документация по безопасному хранилищу:
http://docs.ansible.com/playbooks_vault.html
Мы используем его как хранилище для каждой среды. Для редактирования хранилища у нас есть команда как:
ansible-vault edit inventories/production/group_vars/all/vault
Если вы хотите вызвать переменную vault, вы должны использовать ansible-playbook с такими параметрами:
ansible-playbook -s --vault-password-file=~/.ansible_vault.password
Да, мы храним пароль хранилища в локальном каталоге в виде простого текста, но это не более опасно, чем хранить пароль root для каждой системы. Root пароль находится внутри файла хранилища, или вы можете использовать его как файл sudoers для вашего пользователя / группы.
Я рекомендую использовать файл sudoers на сервере. Вот пример для группы администраторов:
%admin ALL=(ALL) NOPASSWD:ALL
источник
Просто позвоните в свою пьесу с
--extra-vars "become_pass=Password"
into_pass = ('ansible_become_password', 'ansible_become_pass')
источник
Через пять лет я вижу, что это все еще очень актуальная тема. Несколько отражающий ответ leucos, который я считаю лучшим в моем случае, используя только доступные инструменты (без какой-либо централизованной аутентификации, токенов или чего-либо еще). Это предполагает, что у вас одинаковое имя пользователя и один и тот же открытый ключ на всех серверах. Если вы этого не сделаете, конечно, вам нужно быть более конкретным и добавить соответствующие переменные рядом с хостами:
Добавить:
Затем:
По крайней мере, таким образом вам не нужно писать больше переменных, которые указывают на пароли.
источник
Выше решение @ toast38coza работало для меня; просто это sudo: да, в Ansible устарела. Вместо этого используйте становитесь и становитесь_пользователем .
источник
Мы также можем использовать EXPECT BLOCK в ansible, чтобы создать bash и настроить его в соответствии с вашими потребностями
источник
Очень просто, и только добавить в файл переменной:
Пример:
И добавьте это:
источник
Просто дополнение, так что никто больше не переживает раздражение, которое я недавно сделал:
AFAIK, лучшее решение - это одно из общих соображений вышеупомянутого toast38coza. Если имеет смысл статически связать ваши файлы паролей и игровую книгу вместе, следуйте его шаблону с помощью
vars_files
(илиinclude_vars
). Если вы хотите сохранить их отдельно, вы можете указать содержимое хранилища в командной строке следующим образом:Это очевидно в ретроспективе, но вот ошибки:
Этот кровавый знак @ . Если вы не включите его, синтаксический анализ завершится неудачно , и ansible-playbook будет работать так, как если бы вы никогда не указывали файл в первую очередь.
Вы должны явно импортировать содержимое хранилища либо с помощью командной строки --extra-vars / -e, либо внутри своего кода YAML.
--ask-vault-pass
Флаг ничего сам по себе (кроме запросит у вас значение , которое может или не может быть использована позже) не делать.Можете ли вы включить ваши "@" и сэкономить час.
источник
Это сработало для меня ... Создан файл /etc/sudoers.d/90-init-users с NOPASSWD
где «user» - ваш идентификатор пользователя.
источник