Linux 从Ansible Playbook创建用户密码

Linux 从Ansible Playbook创建用户密码,linux,powershell,automation,ansible,configuration-management,Linux,Powershell,Automation,Ansible,Configuration Management,我相信这里有人能解决我的问题。我正在Ansible hosts文件中定义的主机上创建用户。但是当用户希望登录时,root用户需要定义用户密码。我需要自动创建用户密码 要使用playbook创建用户密码,我们不能以明文形式指定密码,我们只能通过提供散列来实现: - name: Add Users + Assign to Group user: name: "{{ item }}" password: $6$ul4TACYvHI.kmGUK$j32lU8fNbX.eW

我相信这里有人能解决我的问题。我正在Ansible hosts文件中定义的主机上创建用户。但是当用户希望登录时,root用户需要定义用户密码。我需要自动创建用户密码

要使用playbook创建用户密码,我们不能以明文形式指定密码,我们只能通过提供散列来实现:

 - name: Add Users + Assign to Group
   user:
      name: "{{ item }}"
      password: $6$ul4TACYvHI.kmGUK$j32lU8fNbX.eW0DZOqnnDlP8i0...
要创建散列,第一步是通过以root用户身份登录到目标服务器来定义密码,然后使用python crypt创建散列。一旦运行该命令,终端将提供散列,我将其粘贴到剧本中。(在下面的示例中,密码为“ansible”)

当我在目标服务器上运行playbook时,我可以以playbook创建的用户的身份登录,密码是我使用python crypt定义的(在本例中,我以user2的身份登录,密码是“ansible”)

这意味着我必须在创建用户的服务器终端中创建散列,然后将该散列复制并粘贴到playbook中。如果我有一台服务器,不会有太多麻烦,但是如果我在100台服务器上运行playbook,那么我需要以root身份登录100台服务器,创建100个哈希,然后在playbook中定义所有这些哈希,这不是非常自动化的

所以需要的是能够从剧本中执行pythoncrypt,grep创建的散列,然后将其放入剧本中。你对怎么做有什么想法吗?甚至在Ansible中都没有,我不希望你们为我写剧本。也许可以考虑一下,在您选择的工具(例如PowerShell)中,您将如何做到这一点。一旦我了解了这个过程,我就可以把它翻译成剧本


非常感谢您的帮助

这是一个遥不可及的答案,我还没有对此进行测试,但我一直在考虑以自动化方式使用
ansible vault
,这样我就可以部署应用程序,而无需事先定义密码,同时在创建密码后保留密码的加密记录

下面的剧本显示了一种可能的方法:

  • 在远程主机上生成密码
  • 在远程主机上使用该密码
  • 在本地(控制)系统上存储该密码的加密副本
同样,这是未经测试的,可能由于一些我没有预料到的原因而无法工作,但我实际上认为它应该能够像这样工作(仅显示相关任务):

ansible.cfg playbook.yml 因此,这方面的tldr是:

  • 我们有一个Ansible配置文件
    Ansible.cfg
  • 该文件包含我们的
    ansible vault
    密码文件的路径
  • 我们有一个本地未加密文件,用于动态可解析变量
  • 我们检查是否需要继续创建新密码等
  • 如果是这样,我们创建一个密码
  • 然后我们加密它
  • 然后我们将未加密的密码写入设置文件
  • 然后,我们将加密密码写入本地未加密的变量文件


在变量(如FAP)中设置密码,将其添加到脚本中以创建用户:

  - name: "Encrypt password for target system"
    command: "python -c 'import crypt; print crypt.crypt(\"{{ FAP }}\")'"
    register: EFAP
  - name: "Add user USER1"
    user: name="USER1" state="present" password="{{ EFAP.stdout }}"

我用一个复杂的密码对此进行了测试,效果很好

您可以使用ansible password模块在文本文件上生成密码,然后读取该文件以在用户上使用哈希。我知道这不是最好的解决办法,但你可以从中找到答案。看一看:谢谢@Kelson Silva,如果我诚实的话,我在查看ansible文档时错过了这个。我会尝试一下,但正如你所说,可能不是理想的解决方案。嗯,在仔细研究后,我不确定这到底是如何解决我的问题的(不是抱怨你的建议@Kelson Silva,我感谢你的意见),这很可能是解决方案,但我想我对如何将其有效地纳入我的剧本中有一个误解。密码是预先定义的还是你也希望将其自动化?这里有一些逻辑@bhotel,我将努力尽快测试并让你知道结果
login as: user2

user1@10.65.8.50's password: "ansible"


[user1@hostname ~]$
vault_password_file = /path/to/vault_password_file
---
- 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
  - name: "Encrypt password for target system"
    command: "python -c 'import crypt; print crypt.crypt(\"{{ FAP }}\")'"
    register: EFAP
  - name: "Add user USER1"
    user: name="USER1" state="present" password="{{ EFAP.stdout }}"