将在Ansible Vault中保存的值输出到标准输出的一行命令

前言

最近我将Ansible Vault作为各种密码存储位置。如果是可以随意安装应用程序的环境,我会使用KeePass之类的工具,但是Ansible Vault可以通过一个主密码来提取存储在其中的许多密码,起到了一定的作用。

由于每次都要打开ansible-vault edit(或者view)并复制粘贴已经变得有点麻烦了,所以我尝试用一行代码来提取它。

准备好

最佳方法是使用ansible命令从Ansible Vault中提取值并将其输出。

要使用ansible命令使用Ansible Vault,必须在执行ansible命令的目录下创建host_vars目录或group_vars目录。在这里,我们创建host_vars目录。

$ mkdir host_vars

将通过ansible-vault create创建的yaml文件放置在host_vars目录中。
无论是从其他地方搬运过来还是新建文件都可以。
在放置文件时,将xxx替换为主机名,这样在对该主机进行处理时,只需使用键的名称即可访问值。但在本次用途中,只有localhost是处理对象,因此使用任意名称都没有问题。

$ ansible-vault create host_vars/xxx.yml

无论是什么样的钥匙,数量多少都无所谓。

"host1": "password1"
"host2": "password2"

创建一个与之前的xxx相同字符串的清单文件。

$ echo 'xxx' > hosts

创建一个随意命名的文件,该文件只包含在创建ansible-vault时设置的密码。

$ echo 'password' > vault

把这个文件的权限设为400可能会更好。

$ chmod 400 vault

一句话

如果准备得当,在此之前,您可以从Ansible Vault中检索出适当的值并将其输出到标准输出。

$ ansible localhost -i hosts --vault-password-file vault -o -m debug -a 'var=hostvars.xxx.host1' | head -n 1 | sed -r 's/^.+: "(.*)"}$/\1/'

简单来解释一下的话,

    • 値を取り出すだけなので処理するホストはlocalhostで良い。

 

    • –vault-password-fileオプションでAnsible Vaultのパスワードを書いたファイルを指定することでパスワード入力をしないで良いようにしている。

 

    • -oは滅多に使わないオプションだが、出力結果を1行で表示するものである。

 

    • 別のファイルや別のキーから値を取り出す場合はvar=hostvars.xxx.host1のxxx.host1の部分を書き換えれば良い。

 

    • head -n 1しているのは後ろに余計な空白行がくっついているのでそれを削るためである。

 

    sedは出力から値の部分だけ取り出すものである。

使用sshpass工具进行密码验证来进行SSH登录。

请注意,提供大多数模型的最佳翻译是英文。即使我能够使用中文回答,但可能会与您的原始问题略有不同。

sshpass -p $(ansible localhost -i hosts --vault-password-file vault -o -m debug -a 'var=hostvars.xxx.host1' | head -n 1 | sed -r 's/^.+: "(.*)"}$/\1/') ssh user@hostname