Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Если вы прочтете руководство Ansible для модуля user
, оно направит вас в Ansible-examples github repo для получения подробной информации о том, как использовать password
.
Там вы увидите, что ваш пароль должен быть хэширован.
- hosts: all
user: root
vars:
# created with:
# python -c 'import crypt; print crypt.crypt("This is my Password", "$1$SomeSalt$")'
password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
tasks:
- user: name=tset password={{password}}
Если ваша playbook или текстовая строка имеет ваш пароль как есть, обычный текст, это означает, что ваш хэш пароля, записанный в теневом файле shadow , неверен. Это означает, что когда вы пытаетесь аутентифицироваться с помощью пароля, его хэш никогда не будет соответствовать.
Кроме того, см. Раздел «Часто задаваемые вопросы» относительно некоторых нюансов параметра пароля и правильного его использования.
попробуйте это
vars_prompt:
- name: "user_password"
prompt: "Enter a password for the user"
private: yes
encrypt: "md5_crypt" #need to have python-passlib installed in local machine before we can use it
confirm: yes
salt_size: 7
- name: "add new user" user: name="{{user_name}}" comment="{{description_user}}" password="{{user_password}}" home="{{home_dir}}" shell="/bin/bash"
Это простой способ:
---
- name: Create user
user: name=user shell=/bin/bash home=/srv/user groups=admin,sudo generate_ssh_key=yes ssh_key_bits=2048
- name: Set password to user
shell: echo user:plain_text_password | sudo chpasswd
no_log: True
Определение задачи для пользовательского модуля должно отличаться в последней версии Ansible.
tasks:
- user: name=test password={{ password }} state=present
Как создать зашифрованный пароль для перехода к password
var в задачу Ansible user
(из комментария @Brendan Wood):
openssl passwd -salt 'some_plain_salt' -1 'some_plain_pass'
Результат будет выглядеть так:
$1$some_pla$lmVKJwdV3Baf.o.F0OOy71
Пример задачи user
:
- name: Create user
user: name="my_user" password="$1$some_pla$lmVKJwdV3Baf.o.F0OOy71"
UPD: crypt с использованием SHA-512 см. здесь здесь и здесь :
$ python -c "import crypt, getpass, pwd; print crypt.crypt('password', '\$6\$saltsalt\$')"
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
$ ruby -e 'puts "password".crypt("$6$saltsalt$")'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/
Ответ Mxx правильный, но метод python crypt.crypt()
небезопасен, когда задействованы разные операционные системы (связанные с алгоритмом хеширования glibc, используемым в вашей системе.)
Например, это не будет работайте, если вы генерируете свой хэш из MacOS и запускаете playbook на linux. В этом случае вы можете использовать passlib (pip install passlib
для установки локально).
from passlib.hash import md5_crypt
python -c 'import crypt; print md5_crypt.encrypt("This is my Password,salt="SomeSalt")'
'$1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.'
Вот как это сработало для меня
- hosts: main
vars:
# created with:
# python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('<password>')"
# above command requires the PassLib library: sudo pip install passlib
- password: '$6$rounds=100000$H/83rErWaObIruDw$DEX.DgAuZuuF.wOyCjGHnVqIetVt3qRDnTUvLJHBFKdYr29uVYbfXJeHg.IacaEQ08WaHo9xCsJQgfgZjqGZI0'
tasks:
- user: name=spree password={{password}} groups=sudo,www-data shell=/bin/bash append=yes
sudo: yes
Я хочу предложить еще одно решение:
- 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 пьесы должны быть идемпотентными. Вы должны думать о них не как последовательность действий в императивном стиле, а как желаемое состояние, декларативный стиль. В результате вы сможете запустить его несколько раз и получить тот же результат, то же самое состояние сервера.
Все это звучит здорово, но есть некоторые нюансы. Одним из них является управление пользователями. «Желаемое состояние» означает, что каждый раз, когда вы запускаете игру, которая создает пользователя, он будет обновлен, чтобы точно соответствовать этому состоянию. Под «обновлением» я подразумеваю, что его пароль также будет изменен. Но, скорее всего, это не то, что вам нужно. Как правило, вам нужно создать пользователя, установить и закончить его пароль только один раз, дальнейшие прогоны воспроизведения не должны обновлять его пароль.
К счастью, Ansible имеет атрибут update_password
в модуле user
, который решает эту проблему. Смешивая это с зарегистрированными переменными , вы также можете истек его пароль только тогда, когда пользователь фактически обновлен.
Обратите внимание, что если вы меняете оболочку пользователя вручную (предположим, вам не нравится оболочка, которую злодейский администратор заставил играть), пользователь будет обновлен, поэтому его пароль будет истек.
Также обратите внимание, как вы можете легко использовать начальные пароли обычного текста в играх. Нет необходимости кодировать их где-то еще и вставлять хэши, вы можете использовать фильтр Jinja2 для этого. Однако это может быть недостатком безопасности, если кто-то случайно заходит в систему, прежде чем вы это сделаете.
"{{ '{{vaulted_password}}' | password_hash('sha512') }}"
, похоже, не работает ...
– dokaspar
12 April 2018 в 12:11
{{ vaulted_password | password_hash('sha512') }}
, где vaulted_password
является ключом к значению в хранилище?
– madhead
12 April 2018 в 17:08
Цель роли в этом ответе - генерировать случайный пароль для new_user_name и немедленно истек пароль. Имя new_user_name необходимо для изменения пароля при первом входе в систему.
create_user.yml:
---
# create_user playbook
- hosts: your_host_group
become: True
user: ansible
roles:
- create_user
role / create_user / tasks / main.yml:
---
# Generate random password for new_user_name and the new_user_name
# is required to change his/her password on first logon.
- name: Generate password for new user
shell: makepasswd --chars=20
register: user_password
- name: Generate encrypted password
shell: mkpasswd --method=SHA-512 {{ user_password.stdout }}
register: encrypted_user_password
- name: Create user account
user: name={{ new_user_name }}
password={{ encrypted_user_password.stdout }}
state=present
append=yes
shell="/bin/bash"
update_password=always
when: new_user_name is defined and new_user_name in uids
register: user_created
- name: Force user to change password
shell: chage -d 0 {{ new_user_name }}
when: user_created.changed
- name: User created
debug: msg="Password for {{ new_user_name }} is {{ user_password.stdout }}"
when: user_created.changed
Если вы хотите создать нового пользователя:
ansible-playbook -i hosts.ini create_user.yml --extra-vars "new_user_name=kelvin"
Вы можете использовать скрытое хранилище для использования секретных ключей в проигрывателе. Определите свой пароль в yml.
ex. pass: secret или
user:
pass: secret
name: fake
зашифровать ваш файл секретов с помощью:
ansible-vault encrypt /path/to/credential.yml
ansible запросит пароль для его шифрования. (я объясню, как использовать этот проход)
И тогда вы можете использовать свои переменные там, где хотите.
Использование ключа Vault:
через передающий аргумент при запуске playbook.
--ask-vault-pass: secret
или вы можете сохранить в файл, например password.txt, и спрятать где-нибудь. (полезно для пользователей CI)
--vault-password-file=/path/to/file.txt
В вашем случае: включить vars yml и использовать переменные.
- include_vars: /path/credential.yml
- name: Add deployment user
action: user name={{user.name}} password={{user.pass}}
password={{user.pass}}
будет расширяться, чтобы включить фактический пароль, в то время как он может ожидать хэш.
– texnic
5 October 2017 в 22:05
Если вы хотите выполнить это как команду Ansible ad-hoc, вы можете сделать следующее:
$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""
Выход из команды:
192.168.1.10 | SUCCESS => {
"append": false,
"changed": true,
"comment": "Joe User",
"group": 999,
"home": "/home/joe_user",
"move_home": false,
"name": "joe_user",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"uid": 999
}
password={{upassword|password_hash('sha512', upassword_salt)}}
. Это позволяет поместить соль в хранилище переменных переменных , как вы, вероятно, с upassword
тоже, сохраняя оба из tasks.yml.
– user85461
14 February 2016 в 23:35
update_password: on_create
в пользовательский модуль к этому ответу, чтобы предотвратить истечение срока действия паролей для уже созданных пользователей.
– madhead
24 April 2016 в 14:34
Объединив несколько решений сверху, я создал книгу, которая автоматически генерирует правильные хэши паролей на основе паролей открытого текста, хранящихся в зашифрованном локальном файле с сохраненным хранилищем:
---
- hosts: [your hosts]
tasks:
- include_vars: [path to your encrypted vault file]
- local_action: "command openssl passwd -salt '{{password_salt}}' -1 '{{password}}'"
register: password_hash
- user: >
name=[your username]
state=present
password="{{password_hash.stdout}}"
Запустите эту команду, используя «- -ask-vault-pass ", чтобы расшифровать ваш файл хранилища (см. справку-хранилище для информации о том, как управлять зашифрованным хранилищем).
openssl passwd -salt <salt> -1 <plaintext>
для генерации хэша пароля, а не однострочный Python, который у вас выше. У меня возникли проблемы с получением корректного вывода из Python, возможно, из-за моей собственной некомпетентности, и команда openssl работала лучше. – Brendan Wood 12 December 2013 в 23:17/etc/shadow
после установки пароля вручную, используяpasswd <user>
. – dokaspar 12 April 2018 в 12:01