【问题标题】:Ansible passing vault password file to playbookAnsible 将保管库密码文件传递给 playbook
【发布时间】:2020-08-25 00:35:50
【问题描述】:

我在 ansible playbook 中运行 shell 命令,需要密码才能完成。我生成了包含我的加密密码的保险库文件(test_vault.txt)。如何将它传递给我的剧本,以便当剧本运行 shell 任务时,它将从我的保管库密码文件中获取加密密码?我的 ansible 代码如下所示:

- name: run openssl
  shell: openssl rsa -in hostname.enc.key -text -noout

如果我在 Linux 提示符下运行此命令,我得到:

Enter pw for hostname.enc.key: 

然后我在这里输入密码。如何将 test_vault.txt 中的保管库密码传递给 playbook?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    openssl 支持variety of ways 发送密码,但可能最简单的方法是通过-passin env:MY_AWESOME_PASSWORD 然后在environment: 中为您的shell: 设置它

    - name: run openssl
      shell: openssl rsa -passin env:MY_AWESOME_PASSWORD -in hostname.enc.key -text -noout
      environment:
        MY_AWESOME_PASSWORD: hunter2
    

    这确实会带来风险,即机器上有权检查其他进程环境的任何人都能够泄露密码。如果这是您担心的风险,您将需要探索其他一些密码通信方案,它们有自己的威胁模型。

    【讨论】:

    • 谢谢@mdaniel!我只能将加密的密码传递给剧本。看起来“openssl rsa passin”只接受明文密码。
    • 您的问题是关于受保护的密码,所以我假设您已经将密码加密到剧本中;但是openssl 不会说 ansible 的保险库方案,因此在提供给其中一种机制时它必须是明文。您不必使用环境,但您必须在以某种形式将密码提供给 openssl 之前对密码进行解密
    【解决方案2】:

    让我们在文件test_vault.txt 中使用密码encrypted 的变量pw_for_hostname_enc_key。例如

    shell> cat test_vault.txt
    pw_for_hostname_enc_key: 4PepNGRTyzA
    
    shell> ansible-vault encrypt test_vault.txt
    Encryption successful
    
    shell> cat test_vault.txt
    $ANSIBLE_VAULT;1.1;AES256
    35306366336231663239373437646639336432383030373937353065343266346561653039643038
    3931396535613135633735613733346635363761616361650a373133663438383862643733343732
    38356363623138316534343364346535313539653065303739386538626265366532616539653163
    6232363232383965630a323831333162646239303630643837313937356233336664343634313766
    31343536656637373038363936306563363232633432386631663334383030316339326332646162
    3334396364353862613933326131366433363232656432323961
    

    然后测试剧本。见Variable precedence: Where should I put a variable?。例如

    shell> cat pb.yml
    - hosts: localhost
      tasks:
        - include_vars: test_vault.txt
        - debug:
            var: pw_for_hostname_enc_key
    

    给予(删节)

    shell> ansible-playbook pb.yml 
    
    ok: [localhost] => 
      pw_for_hostname_enc_key: 4PepNGRTyzA
    

    如果它正在工作,请在其他任务中使用它。例如

        - name: run openssl
          shell: "openssl rsa -in hostname.enc.key 
                              -passin pass:{{ pw_for_hostname_enc_key }}
                              -text -noout"
    

    下一个选项是仅加密密码。例如

    shell> cat test_vault.txt
    4PepNGRTyzA
    
    shell> ansible-vault encrypt test_vault.txt
    Encryption successful
    
    shell> cat test_vault.txt
    $ANSIBLE_VAULT;1.1;AES256
    65656363363364376130323365303363643662313939346635646630613230656630343239666130
    3563396666663763393132626438336433646661656232660a333239363063383434313237363730
    61633931666630616337636434326536333335353836306230333464383432656664336431343637
    3961316237346430660a656666316333313936386136383732366539373961303466313236343061
    3332
    

    然后测试剧本。 lookup 插件file 自动解密保管库加密的文件。例如,

    - hosts: localhost
      tasks:
        - debug:
            var: pw_for_hostname_enc_key
          vars:
            pw_for_hostname_enc_key: "{{ lookup('file', 'test_vault.txt') }}"
    

    给予(删节)

    shell> ansible-playbook pb.yml
    
    ok: [localhost] => 
      pw_for_hostname_enc_key: 4PepNGRTyzA
    

    如果它正在工作,请在其他任务中使用它。例如

        - name: run openssl
          shell: "openssl rsa -in hostname.enc.key 
                              -passin pass:{{ pw_for_hostname_enc_key }}
                              -text -noout"
          vars:
            pw_for_hostname_enc_key: "{{ lookup('file', 'test_vault.txt') }}"
    

    此解决方案更安全,因为带有密码的变量的范围仅限于单个任务。

    【讨论】:

    • 谢谢@Vladimir!我试过你的解决方案。两者都解密失败。
    • 不客气@coding!确保您提供带有 vault password 的 ansible-playbook。如果您希望对您的问题有特定的答案,请使用当前代码更新您的问题并将其设为 mcve
    • 我的错,我忘了运行 ansible-play 选项'--vault-password-file=test_vault.txt"。让我再试一次。我会报告结果。再次感谢!
    • 没问题。恕我直言,设置环境非常方便且省时。例如,使用您的保管库密码设置ANSIBLE_VAULT_PASSWORD_FILE=/home/admin/.vault_pass.txt
    • 我尝试了“ansible-playbook test.yml —vault-password-file=pw.txt”,但仍然解密失败。如果我解密 pw.txt 并再次运行它,就可以了。所以看起来有点像。它仍然无法获取加密文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多