使用Ansible

时间:2017-11-03 17:52:43

标签: shell ansible special-characters

我尝试使用ansible_ssh_pass选项运行ansible playbook以连接到目标服务器。

ansible-playbook test-playbook.yml -i hosts -u daniel --extra-vars "{"ansible_ssh_pass":"u5!vuL!<35Lf?<>n'x"}"

问题是密码有特殊字符。 我试着用它来保存它。

"password\'s"
"password"
"\"password\""

知道如何保存密码?

3 个答案:

答案 0 :(得分:0)

我知道对于ansible-vault,您可以在文件中指定密码,我假设在这种情况下这也可以,但我不是正面的。

ansible-playbook test-playbook.yml -i hosts -u daniel --extra-vars ansible_ssh_pass=/path/to/file.txt

答案 1 :(得分:0)

如果你删除单引号特殊字符,你可以围绕其余部分做单引号,它应该有效:

ansible-playbook test-playbook.yml -i hosts -u daniel -e ansible_ssh_pass='u5!vuL!<35Lf?<>nx'

答案 2 :(得分:0)

可能有点晚了,但针对您的具体问题的确切解决方案是:

ansible-playbook test-playbook.yml -i hosts -u daniel --extra-vars ansible_ssh_pass=$'"u5!vuL!<35Lf?<>n\'x"'

shell专门处理$'<string>'并逃避内部的单引号(参见反斜杠)

最外层的双引号是必要的,这样jinja2模板引擎就不会在ansible中混淆。

话虽如此,至少有两个原因运行这样的命令是一个非常糟糕的主意:

  • 不安全。任何有权访问计算机上的列表流程或shell历史记录的人都可以看到密码。
  • 它不灵活。命令行中提供的Ansible额外变量具有最高优先级。如果您使用不同的ssh密码在库存中添加其他主机,则无法区分这两个密码。

对于第一个问题,并且如果您确定只有一台计算机(或者在任何地方都使用相同的密码),您可以使用vars_prompt以交互方式请求密码(例如http://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html

解决这两个问题的最佳方法是使用保险库加密将密码添加到特定主机的广告资源中。然后,当您调用该剧本时,可以交互方式提供整体保管库密码(--ask-vault-pass)或通过安全保护的保管库密码文件(--vault-password-file =)。