从Ansible Playbook创建用户密码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Ansible Playbook创建用户密码相关的知识,希望对你有一定的参考价值。
我相信这里有人可以解决我的问题。我在我的Ansible主机文件中定义的主机上创建用户。但是当用户希望登录时,root用户需要定义用户密码。我需要自动创建用户密码。
要使用playbook创建用户密码,我们无法以明文形式指定密码,我们只能通过提供哈希来实现:
- name: Add Users + Assign to Group
user:
name: "{{ item }}"
password: $6$ul4TACYvHI.kmGUK$j32lU8fNbX.eW0DZOqnnDlP8i0...
要创建哈希,第一步是通过以root用户身份登录到目标服务器来定义密码,然后使用python-crypt创建哈希。一旦运行命令,终端将提供哈希,我将其粘贴到剧本中。 (在下面的例子中,密码是“ansible”)
python -c 'import crypt; print crypt.crypt("ansible")'
当我对目标服务器运行playbook时,我可以使用python-crypt以我用python-crypt定义的密码创建该剧本的用户(在这种情况下,我使用密码“ansible”登录为user2)
login as: user2
user1@10.65.8.50's password: "ansible"
[user1@hostname ~]$
这意味着我必须在我创建用户的服务器的终端中创建哈希,然后将该哈希复制并粘贴到剧本中。如果我有一台服务器但没有太多麻烦但是如果我在100台服务器上运行playbook,那么我需要以root用户身份登录到100台服务器然后创建100个哈希值,然后在剧本中定义所有这些哈希值,这不是非常自动化的!
所以需要的是能够从playbook执行python-crypt,grep创建的hash,然后把它放在playbook中。你有什么想法怎么做?甚至没有特别在Ansible,我不指望你们为我写剧本。也许考虑如何在您选择的工具中执行此操作,例如PowerShell。一旦我了解了这个过程,我就可以把它翻译成一本剧本。
任何帮助深表感谢!
这是一个很好的答案,我没有对此进行测试,但我一直在考虑以自动方式使用ansible-vault
的方法,以便我可以在不事先定义密码的情况下部署应用程序,同时保留加密记录的密码一旦创建。
下面的剧本显示了一种方式:
- 在远程主机上生成密码,
- 在远程主机上使用该密码,
- 在本地(控制)系统上存储该密码的加密副本。
再次,这是未经测试的,并且它可能由于某些我无法预料的原因而无法工作,但我认为它应该能够像这样工作(仅显示相关任务):
ansible.cfg
vault_password_file = /path/to/vault_password_file
playbook.yml
---
- hosts: example_com
gather_facts: true
become: true
vars:
password_var_name: "example_com_db_password"
vault_vars_file: "example_com_vault.yml"
tasks:
- name: Find out if we have already set a password.
command: "grep "'password' => ''," settings.php"
args:
chdir: "/path/to/settings"
register: password_in_file
- name: Create a password and use ansible-vault to write it.
block:
- name: Create a new password.
command: "apg -a1 -m32 -n1"
register: new_vault_password
no_log: true
- name: Encrypt the new password.
command: "ansible-vault encrypt "{{ new_vault_password.stdout }}""
register: new_vault_password_encrypted
no_log: true
- name: Write the encrypted password to our local ansible-vault file.
lineinfile:
path: "{{ playbook_dir }}/{{ vault_file }}"
line: "{{ password_var_name }}: {{ new_vault_password_encrypted.stdout }}"
insertafter: "EOF"
when: password_in_file.stdout = 0
delegate_to: localhost
- name: Write the unencrypted password into our remote settings file.
lineinfile:
path: "/path/to/settings/settings.php"
line: " 'password' => '{{ new_password.stdout }}',"
regexp: "^ 'password' => '',$"
no_log: true
所以tldr就是这样的:
- 我们有一个Ansible配置文件
ansible.cfg
。 - 该文件包含我们的
ansible-vault
密码文件的路径。 - 我们有一个动态Ansible变量的本地未加密文件。
- 我们检查是否需要继续创建新密码等。
- 如果是这样,我们创建一个密码。
- 然后我们加密它。
- 然后我们将未加密的密码写入设置文件。
- 然后我们将加密的密码写入我们的本地未加密变量文件。
以上是关于从Ansible Playbook创建用户密码的主要内容,如果未能解决你的问题,请参考以下文章
Ansible playbook 批量修改服务器密码 先普通后root用户