Хочу предложить еще одно решение:
- name: Create madhead user
user:
name: madhead
password: "{{ 'password' | password_hash('sha512') }}"
shell: /bin/zsh
update_password: on_create
register: madhead
- name: Force madhead to change password
shell: chage -d 0 madhead
when: madhead.changed
Почему лучше? Как уже было здесь отмечено, игры с Ansible должны быть идемпотентными. Вы должны думать о них не как о последовательности действий в императивном стиле, а как о желаемом состоянии, декларативном стиле. В результате вы должны иметь возможность запускать его несколько раз и получать тот же результат, то же состояние сервера.
Звучит все отлично, но есть нюансы. Один из них - управление пользователями. «Желаемое состояние» означает, что каждый раз, когда вы запускаете игру, в которой создается пользователь, он будет обновляться, чтобы соответствовать именно этому состоянию. Под "обновленным" я подразумеваю, что его пароль тоже будет изменен. Но, скорее всего, это не то, что вам нужно. Обычно вам нужно создать пользователя, установить и истечь его пароль только один раз, дальнейшие запуски игры не должны обновлять его пароль.
К счастью, update_password
в user
модуле Ansible есть атрибут , решающий эту проблему. Смешивая это с зарегистрированными переменными, вы также можете истечь его пароль только тогда, когда пользователь действительно обновлен.
Обратите внимание, что если вы вручную измените оболочку пользователя (предположим, вам не нравится оболочка, которую злой администратор заставил в своей игре), пользователь будет обновлен, поэтому его пароль будет истек.
Также обратите внимание, как вы можете легко использовать начальные пароли в виде обычного текста в играх. Нет необходимости кодировать их где-то еще и вставлять хеши, для этого можно использовать фильтр Jinja2 . Однако это может быть недостатком безопасности, если кто-то случайно войдет в систему до того, как вы это сделаете.
password
не должен быть в виде обычного текста, а скорее предварительно хеширован.