(Ansible版本是2.5.0,控制机是linux,客户端也是)
我想使用 ansible 的 ad-hoc 模式和一个 vault-encrypted 的 group_vars 文件。group_vars 文件名为 local_vms.yml,如下所示:
1 ---
2 vars:
3 - pass: a_password
4 - ansible_user: grahamn
5 - ansible_ssh_pass: "{{ pass }}"
因此,清单包含一个名为 local_vms 的组并且位于当前目录中,而 local_vms.yml 文件位于名为 group_vars 的子目录中。
我像这样运行:
ansible -m command -a"uname" -ihosts local_vms
变量 ANSIBLE_VAULT_PASSWORD_FILE 被导出为一个安全程度较高(并且不在 git 树中)的文件的路径。
我知道保险库加密文件正在被解密和使用,因为如果我修改 ansible_user 值,它会使用修改后的值(并且由于我没有设置该用户而出现错误)。
对于我已设置 authorised_keys 的主机,该命令运行正常,但对于我故意删除它的主机,该命令运行不正常 - 因此它忽略了 ansible_ssh_pass 的值。
如果我增加详细程度,我会注意到 ssh 命令包含字符串“PasswordAuthentication=no”,因此我会添加适当的选项:
ansible -vvv -i hosts -m command -auname local_vms --ssh-common-args="PasswordAuthentication=yes"
并收到此错误:无法解析主机名passwordauthentication = yes:
顺便说一句,远程 /etc/ssh/sshd_config 和 /etc/ssh/ssh_config 都配置为允许使用密码。ssh root@influx 提示输入密码,并成功登录。
因此,是否可以使用 ad-doc 模式,将用户名和密码设置为保险库中的变量,如果可以,我做错了什么。谢谢。
一点背景知识:我喜欢轻触式的管理方法 - 您应该尝试尽可能少地登录服务器。我想知道使用 ansible 完成所有事情的方法是否可行。最初,命令可能是(如这里)临时的,但后来我们会为我们需要做的一切建立剧本。我讨厌服务器上的手动干预,遗憾的是,puppet 经常处于 noop 状态(无论如何,我更喜欢 ansible)。
更新:
将命令编辑成如下形式:
ansible -m command -a whoami ...
显示即使 group_vars.yml 文件将 ansible_user 设置为 root,它也不会被使用。所以现在我很困惑。我不能将 ansible_user 设置在 group_vars 文件中吗?group_vars 文件应该位于 inventory 文件下的目录中,带有组的名称(如果需要,+.yml)- 目录名称为“group_vars”。
在 ansible 运行上运行 strace 表明它确实打开了 group_vars/local_vms.yml 文件,并且:
$ ansible -i hosts -m command -awhoami local_vms -u root -k
SSH password:
ubuntus01 | SUCCESS | rc=0 >>
root
influx | SUCCESS | rc=0 >>
root
centoss02 | SUCCESS | rc=0 >>
root
grafana | SUCCESS | rc=0 >>
root
如您所见。
我现在想知道我的方法是否错误。我希望能够使用 vault 进行身份验证,同时使用剧本和临时命令 - 这可能吗?
答案1
问题出在我的 group_vars 文件的格式上。文件如下:
1 ---
2
3 pass: areallygoodpassword
4 ansible_user: root
5 ansible_ssh_pass: "{{ pass }}"
一切都运行正常。
剩下要做的就是赞同我的回答。