使用 vault 的临时 ansible 命令

使用 vault 的临时 ansible 命令

(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 }}"

一切都运行正常。

剩下要做的就是赞同我的回答。

相关内容