У меня есть доступная задача, которая создает нового пользователя в ubuntu 12.04;
- name: Add deployment user
action: user name=deployer password=mypassword
он завершается, как ожидалось, но когда я вхожу в систему как этот пользователь и пытаюсь выполнить sudo с паролем, который я установил, он всегда говорит, что это неверно. Что я делаю не так?
password
не должен быть в виде обычного текста, а скорее предварительно хеширован.Ответы:
Если вы прочитали руководство по
user
модулю Ansible , оно направит вас к репозиторию Ansible-examples на github для получения подробной информации о том, как использоватьpassword
параметр .Там вы увидите, что ваш пароль нужно хешировать.
Если ваш playbook или командная строка ansible содержат ваш пароль как есть в виде обычного текста, это означает, что ваш хэш пароля, записанный в теневом файле, неверен. Это означает, что когда вы пытаетесь аутентифицироваться со своим паролем, его хэш никогда не совпадет.
Кроме того, смотрите Ansible FAQ , чтобы узнать о некоторых нюансах параметра пароля и о том, как его правильно использовать.
источник
openssl passwd -salt <salt> -1 <plaintext>
для генерации хэша пароля вместо однострочника Python, который у вас есть выше. У меня были проблемы с получением правильного вывода из Python, вероятно, из-за моей собственной некомпетентности, и команда openssl работала лучше./etc/shadow
после установки пароля вручную с помощьюpasswd <user>
.Возможно, я слишком поздно отвечу на это, но недавно я понял, что фильтры jinja2 могут обрабатывать генерацию зашифрованных паролей. В моем
main.yml
я генерирую зашифрованный пароль как:"uusername" и "upassword" передаются как
--extra-vars
в playbook, и обратите внимание, что я использовал здесь фильтр jinja2, чтобы зашифровать переданный пароль.Я добавил в свой блог ниже учебник, связанный с этим.
источник
password={{upassword|password_hash('sha512', upassword_salt)}}
. Это позволяет вам помещать соль в хранилище переменных , как вы, вероятно,upassword
тоже сделали бы , не допуская их использования в tasks.yml.update_password: on_create
в этот ответ пользовательский модуль, чтобы предотвратить истечение срока действия паролей для уже созданных пользователей.pip install passlib
. Тогда , чтобы иметь возможность использовать встроенные хранилище зашифрована строки я должен был переформатировать со следующим дополнением:password: {{ upassword | string | password_hash('sha512') }}
. Это позволяет избежать сообщения об ошибкеsecret must be unicode or bytes, not ansible.parsing.yaml.objects.AnsibleVaultEncryptedUnicode
Хочу предложить еще одно решение:
Почему лучше? Как уже было здесь отмечено, игры с Ansible должны быть идемпотентными. Вы должны думать о них не как о последовательности действий в императивном стиле, а как о желаемом состоянии, декларативном стиле. В результате вы должны иметь возможность запускать его несколько раз и получать тот же результат, то же состояние сервера.
Звучит все отлично, но есть нюансы. Один из них - управление пользователями. «Желаемое состояние» означает, что каждый раз, когда вы запускаете игру, в которой создается пользователь, он будет обновляться, чтобы соответствовать именно этому состоянию. Под "обновленным" я подразумеваю, что его пароль тоже будет изменен. Но, скорее всего, это не то, что вам нужно. Обычно вам нужно создать пользователя, установить и истечь его пароль только один раз, дальнейшие запуски игры не должны обновлять его пароль.
К счастью,
update_password
вuser
модуле Ansible есть атрибут , решающий эту проблему. Смешивая это с зарегистрированными переменными, вы также можете истечь его пароль только тогда, когда пользователь действительно обновлен.Обратите внимание, что если вы вручную измените оболочку пользователя (предположим, вам не нравится оболочка, которую злой администратор заставил в своей игре), пользователь будет обновлен, поэтому его пароль будет истек.
Также обратите внимание, как вы можете легко использовать начальные пароли в виде обычного текста в играх. Нет необходимости кодировать их где-то еще и вставлять хеши, для этого можно использовать фильтр Jinja2 . Однако это может быть недостатком безопасности, если кто-то случайно войдет в систему до того, как вы это сделаете.
источник
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
не работает ...{{ vaulted_password | password_hash('sha512') }}
, гдеvaulted_password
ключ к значению в хранилище?update_password: on_create
похоже, не работает (есть открытая ошибка с 2017 года), поэтому пароли будут меняться каждый раз, когда происходит изменение состояния пользователя.Модуль Ansible «user» управляет пользователями идемпотентным образом. В сборнике пьес ниже первая задача объявляет состояние = присутствует для пользователя. Обратите внимание, что ' register: newuser ' в первом действии помогает второму действию определить, является ли пользователь новым (newuser.changed == True) или существующим (
newuser.changed==False
), чтобы сгенерировать пароль только один раз.В сборнике Ansible есть:
источник
попробуй вот так
источник
Цель роли в этом ответе - сгенерировать случайный пароль для new_user_name и немедленно истечь срок действия пароля. New_user_name требуется для изменения пароля при его первом входе в систему.
create_user.yml:
роли / create_user / tasks / main.yml:
Если вы хотите создать нового пользователя:
источник
Это простой способ:
источник
Вот как это сработало для меня
источник
Для полноты картины я опубликую специальную команду с использованием ansible, поскольку там тоже есть уловка.
Сначала попробуйте сгенерировать зашифрованный пароль с помощью утилиты mkpasswd, доступной в большинстве систем Linux:
Затем попробуйте команду ansible ad-hock:
Но убедитесь:
--sudo
или получаете ошибку, например (useradd: cannot lock /etc/passwd; try again later
)источник
В последней версии Ansible определение задачи для пользовательского модуля должно быть другим.
источник
Объединив несколько вышеперечисленных решений, я создал playbook, который автоматически генерирует правильные хэши паролей на основе паролей в виде открытого текста, хранящихся в зашифрованном локальном доступном файле хранилища:
Выполните эту команду, используя параметр «--ask-vault-pass», чтобы расшифровать файл хранилища (см. Ansible-vault для получения информации о том, как управлять зашифрованным хранилищем).
источник
Как создать зашифрованный пароль для перехода к
password
var вuser
задачу Ansible (из комментария @Brendan Wood):Результат будет выглядеть так:
Пример
user
задачи:UPD: шифрование с использованием SHA-512 смотрите здесь и здесь :
Python
Perl
Рубин
источник
Вы можете использовать ansible-vault для использования секретных ключей в playbooks. Задайте свой пароль в yml.
напр. пройти: секрет или
зашифруйте свой файл секретов с помощью:
ansible-vault encrypt /path/to/credential.yml
ansible запросит пароль для его шифрования. (я объясню, как использовать этот пропуск)
И тогда вы можете использовать свои переменные где хотите. Никто не может их прочитать без ключа хранилища.
Использование ключа хранилища:
через передачу аргумента при запуске playbook.
или вы можете сохранить в файл, например password.txt, и где-нибудь спрятать. (полезно для пользователей CI)
В вашем случае: включите vars yml и используйте свои переменные.
источник
password={{user.pass}}
будет расширен, чтобы включить фактический пароль, в то время как ansible ожидает там хеша.Генерация случайного пароля для пользователя
сначала необходимо определить переменную пользователя, а затем следовать ниже
задачи:
источник
Ответ Mxx правильный, но
crypt.crypt()
метод python небезопасен, когда задействованы разные операционные системы (связано с хеш-алгоритмом glibc, используемым в вашей системе).Например, это не сработает, если вы сгенерируете свой хеш из MacOS и запустите playbook на Linux. В таком случае вы можете использовать passlib (
pip install passlib
для локальной установки).источник
Ни одно из решений не работало непосредственно на моем Mac, управляющем Ubuntu. Итак, для других, объединяя ответы Mxx и JoelB, вот текущее решение Python 3:
Результат будет
$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
, как в ответе Mxx.Еще лучше использовать SHA512 вместо MD5:
Результат:
источник
Я создал ansible-playbook, который позволяет вам создать учетную запись linux, которая разрешает аутентификацию по паролю.
См. CreateLinuxAccountWithAnsible .
Хешированный пароль генерируется с помощью
mkpasswd
команды. Я предоставил способы установкиmkpasswd
в разных операционных системах.Вот шаги, необходимые для использования моего скрипта:
Замените
<your_user_name>
и<your_password>
внутриrun.sh
желаемым именем пользователя и паролем.Измените информацию о подключении,
inventory
чтобы ansible мог подключиться к машине для создания пользователя.Выполнить,
./run.sh
чтобы выполнить сценарий.источник
Пробовал много утилит, включая mkpasswd, Python и т. Д. Но похоже, что есть некоторая проблема совместимости с Ansible при чтении значений HASH, созданных другими инструментами. Итак, наконец, он работал с самим значением ansible #.
ansible all -i localhost, -m debug -a "msg = {{'yourpasswd' | password_hash ('sha512', 'mysecretsalt')}}»
Пособие -
источник
Если вы хотите выполнить это как специальную команду Ansible, вы можете сделать следующее:
Вывод из приведенной выше команды:
источник
Я знаю, что опаздываю на вечеринку, но есть другое решение, которое я использую. Это может быть удобно для дистрибутивов, у которых нет
--stdin
двоичного файла passwd.Этикетка в
loop_control
отвечает за печать только имени пользователя. Вся playbook или только пользовательские переменные (вы можете использоватьvars_files:
) должны быть зашифрованы с помощью ansible-vault.источник
Мое решение использует поиск и автоматическое создание пароля.
источник
Ну, я совсем опоздал на вечеринку :) Мне нужна была игра, которая создает несколько локальных пользователей со случайными паролями. Это то, что я придумал, использовал несколько примеров сверху и собрал их вместе с некоторыми изменениями.
создать-пользователя-с-паролем.yml
/roles/create-user-with-password/tasks/main.yml
источник