我一直在等待ansible 2.3,因为它将引入encrypt_string功能。
不幸的是,我不确定如何阅读加密字符串。
我尝试过 decrypt_string ,解密(文件),查看(文件),但没有任何效果。
cat test.yml
---
test: !vault |
$ANSIBLE_VAULT;1.1;AES256
37366638363362303836383335623066343562666662386233306537333232396637346463376430
3664323265333036663736383837326263376637616466610a383430623562633235616531303861
66313432303063343230613665323930386138613334303839626131373033656463303736366166
6635346135636437360a313031376566303238303835353364313434363163343066363932346165
6136
我所说的错误是ERROR! input is not vault encrypted data for test.yml
如何解密字符串,以便在不需要运行播放的情况下知道它的价值?
答案 0 :(得分:26)
您还可以使用普通ansible
命令执行相应的主机/组/广告资源组合,例如:
$ ansible my_server -m debug -a 'var=my_secret'
my_server | SUCCESS => {
"my_secret": "373861663362363036363361663037373661353137303762"
}
答案 1 :(得分:15)
您可以管道输入,然后告诉ansible-vault
输出到stderr
,然后将stdout
重定向到/dev/null
,因为该工具会打印Decryption successful
。
类似的东西:
echo 'YOUR_SECRET_VALUE' | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null
这是一个例子:
echo '$ANSIBLE_VAULT;1.1;AES256
30636561663762383436386639353737363431353033326634623639666132623738643764366530
6332363635613832396361333634303135663735356134350a383265333537383739353864663136
30393363653361373738656361613435626237643633383261663138653466393332333036353737
3335396631613239380a616531626235346361333737353831376633633264326566623339663463
6235' | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null
我希望他们能够采用更简单的方法来实现这一目标。
编辑:环境变量作为输入:
要对bash
使用printf
而不是echo
示例(密码:123):
export chiphertext='$ANSIBLE_VAULT;1.1;AES256
65333363656231663530393762613031336662613262326666386233643763636339366235626334
3236636366366131383962323463633861653061346538360a386566363337383133613761313566
31623761656437393862643936373564313565663633636366396231653131386364336534626338
3430343561626237660a333562616537623035396539343634656439356439616439376630396438
3730'
printf "%s\n" $chiphertext | ansible-vault decrypt /dev/stdin --output=/dev/stderr > /dev/null
答案 2 :(得分:12)
您是否尝试将加密字符串设置为变量,然后使用-debug
获取其解密输出?
即
在您的剧本中将加密字符串定义为变量test
,然后执行:
-debug: msg="My Secret value is {{test | replace('\n', '')}}"
在你的剧本中然后运行剧本:
ansible-playbook -i localhost YourPlaybook.yml --vault-password-file path/to/your/secret_key_file
`
答案 3 :(得分:11)
由于整个文件库文件与git历史记录不兼容,因此在变量文件中使用保险库字符串是可行的方法,它也使得按名称更清楚地更改变量。
这是一个简单的例子:
我想把fredsSecretString:value放到vars.yml中,(它的值是fastfredfedfourfrankfurters但是嘘,不要让别人知道!)
$ ansible-vault encrypt_string 'fastfredfedfourfrankfurters' -n fredsSecretString >> vars.yml
New Vault password: fred
Confirm New Vault password: fred
$ cat vars.yml
fredsSecretString: !vault |
$ANSIBLE_VAULT;1.1;AES256
36643662303931336362356361373334663632343139383832626130636237333134373034326565
3736626632306265393565653338356138626433333339310a323832663233316666353764373733
30613239313731653932323536303537623362653464376365383963373366336335656635666637
3238313530643164320a336337303734303930303163326235623834383337343363326461653162
33353861663464313866353330376566346636303334353732383564633263373862
要解密值,请将加密后的字符串反馈回ansible-vault 如下:
$ echo '$ANSIBLE_VAULT;1.1;AES256
36643662303931336362356361373334663632343139383832626130636237333134373034326565
3736626632306265393565653338356138626433333339310a323832663233316666353764373733
30613239313731653932323536303537623362653464376365383963373366336335656635666637
3238313530643164320a336337303734303930303163326235623834383337343363326461653162
33353861663464313866353330376566346636303334353732383564633263373862' |
ansible-vault decrypt && echo
Vault password: fred
Decryption successful
fastfredfedfourfrankfurters
$
答案 4 :(得分:2)
虽然使用ansible调试消息或使用ansible cli显示加密字符串值没有问题,但是还有一个解决方案可以方便自动化需求。您可以使用ansible的python库并在您的代码中使用它们(基本上,所有这些都位于ansible.parsing。*)
1)提供保管库密码并生成带有秘密的“保险库”。
# Load vault password and prepare secrets for decryption
loader = DataLoader()
secret = vault.get_file_vault_secret(filename=vault_password_file, loader=loader)
secret.load()
vault_secrets = [('default', secret)]
_vault = vault.VaultLib(vault_secrets)
2)使用AnsibleLoader加载yaml文件:
with codecs.open(input_file, 'r', encoding='utf-8') as f:
loaded_yaml = AnsibleLoader(f, vault_secrets=_vault.secrets).get_single_data()
3)如果您需要加密新字符串并更新字典:
new_encrypted_value = objects.AnsibleVaultEncryptedUnicode.from_plaintext(source_system_password, _vault, vault_secrets[0][1])
loaded_yaml[target_env]['credentials'][external_system_name]['password'] = new_encrypted_variable
4)完成处理后,请使用AnsibleDumper回复:
with open('new_variables.yml','w') as fd:
yaml.dump(loaded_yaml, fd, Dumper=AnsibleDumper, encoding=None, default_flow_style=False)
答案 5 :(得分:2)
这是解密字符串的另一种方法
$ ansible localhost \
-m debug \
-a "var=mysecret" \
-e "@inventory/group_vars/master"
localhost | SUCCESS => {
"mysecret": "somesecret\n"
}
这里的窍门是我们传递一个文件,其中包含Ansible拱顶机密,mysecret
也位于其中ansible
,并且能够解密。
注意::如果您没有密码来解密Ansible Vault的加密机密,也可以通过以下方式输入密码:
$ ansible localhost --vault-password-file=~/.vault_pass.txt \
-m debug \
-a "var=mysecret" \
-e "@inventory/group_vars/master"
localhost | SUCCESS => {
"mysecret": "somesecret\n"
}
答案 6 :(得分:1)
这是对我有用的,类似于Scudelletti所做的,但是通过了保险库通行证,即
REPLACE(STR([StudentID],3),' ','0')
为方便起见,由于尾随echo '$ANSIBLE_VAULT;1.1;AES256
31363861346536343331393539323936346464386534346337306565626466393764666366363637
6533373165656431393662653463646430663933363431380a336130363131373238326330393931
39343533396161323834613030383339653633393133393932613562396630303530393030396335
3630656237663038630a363032373633363161633464653431386237333262343231313830363965
31393930343532323133386536376637373463396534623631633234393565373337613530643031
38393862616635326339373731353465303364303365336132613566396666626536636533303839
393465653830393231636638643735313666' | ansible-vault decrypt --vault-password-file /path/to/your/.vault_pass.txt /dev/stdin --output=/dev/stderr > /dev/null && echo
,输出将单独显示在一行上。如果您遇到任何权限错误,我的保险库通行证的许可为644。
希望有帮助!
答案 7 :(得分:1)
对于那些想要定义别名而忽略管道和临时文件的人,可以采用以下解决方案:
function decrypt_ansible_vault_string() {
export FN=$1
export KEY=$2
ansible-vault view <(yq r $FN $KEY)
}
用法示例:
$ head myrole/var/main.yml
# Variables here override defaults
website:
server: 127.0.0.1
port: 8081
session:
hash_key: !vault |
$ANSIBLE_VAULT;1.1;AES256
33626439623630633332343836316334376637323738323061373334373733326566613262373036
6632623432373263613139646432333331313731326232390a653031366564313235323065303865
32383563393261326633306663663437386134666230373332646234656464356331646335636564
$ decrypt_ansible_vault_string myrole/vars/main.yml website.session.hash_key
此答案扩展到comment from @maricn
注意,我正在使用this yq,但是任何yaml查询工具都可以。在这里重要的是使用subshell重定向的原理(没有临时文件)。
另请注意,您可以添加--ask-vault-password
。但是,使用GPG加密的机密要好得多,因为您不必每次都输入密码,并且此工作流程对于团队(YMVV和IHMO)而言要好得多。这是a good tutorial on how to use GPG with ansible-vault。
将此标签粘贴在您的.bashrc
中,并享用它。
我对ansible-vault encrypt\decrypt
工作流程感到沮丧。因此,我创建了一个包装器,还用于解密var文件中的字符串。签出:https://github.com/oz123/ansible-vault-string-helper
答案 8 :(得分:0)
此命令仅提取加密的数据并将其传递给解密。我喜欢它更好一些,因为您不需要手动提取数据。
cat test.yml | grep -v vault| awk '{$1=$1;print}' | ansible-vault decrypt
答案 9 :(得分:0)
yq提取加密的var值,然后创建一个临时文件并将其与ansible-vault
一起使用:
cat ansible_file.yml | yq -r ".variable_name" > tmp_file.txt
# you can also use 'ansible-vault decrypt'
ansible-vault view --ask-vault-pass tmp_file.txt
答案 10 :(得分:0)
这是我内联加密和解密字符串的方式,此外还用作环境变量。
yq在解释yaml输入时特别有用。
如果要测试加密和解密字符串,我会在一行中这样做-
echo -n "test some input that will be encrypted and decrypted" | ansible-vault encrypt_string --vault-id $vault_key --stdin-name testvar_name | yq r - "testvar_name" | ansible-vault decrypt --vault-id $vault_key
我猜想那些通常对此感兴趣的人对解密环境变量感兴趣。这就是我实现该用例的方式,其中testvar是加密的环境变量,而$ vault-id是用于加密/解密的密钥的路径。
testvar=$(echo -n "test some input that will be encrypted and stored as an env var" | ansible-vault encrypt_string --vault-id $vault_key --stdin-name testvar_name | base64 -w 0)
result=$(echo $testvar | base64 -d | /var/lib/snapd/snap/bin/yq r - "testvar_name" | ansible-vault decrypt --vault-id $vault_key); echo $result
答案 11 :(得分:0)
对于像test.yml这样的文件:
---
test: !vault |
$ANSIBLE_VAULT;1.1;AES256
37366638363362303836383335623066343562666662386233306537333232396637346463376430
3664323265333036663736383837326263376637616466610a383430623562633235616531303861
66313432303063343230613665323930386138613334303839626131373033656463303736366166
6635346135636437360a313031376566303238303835353364313434363163343066363932346165
6136
以下粗略的实现方式(显然仅推荐用于一些快速的手动操作):
for row in $(cat test.yml | yq -c '.[]'); do
decrypt() {
printf "decrypting '%s'" $row | sed -e 's/^"//' -e 's/"$//'
echo "---"
printf $row | sed -e 's/^"//' -e 's/"$//' | ansible-vault decrypt -
}
echo -e "==\n: $(decrypt '.')"
done
应该工作,前提是您具有加密数据的密钥。
答案 12 :(得分:0)
在这里遇到这个问题和答案时,我只想添加一个我一起煮过的快速bash脚本,该脚本读取整个yaml文件,寻找可解密并转储到屏幕上的字符串。
这还远非完美,我不是bash上最热门的人,但是希望这可以帮助处于与我一样情况的人进行一般转储。
要使用以下脚本,必须在名为vault_pass
的文件(当前工作路径)中安装Vault密码,并安装yq and jq
。要解析的文件应该是第一个参数。例如./vault_reader.sh group_vars/production.yml
#!/bin/bash
KEY_OR_VALUE=key
for row in $(yq read -j $1 | jq); do
if [ "$KEY_OR_VALUE" == "key" ]
then
KEY_OR_VALUE="value"
echo $(sed -e "s/\"//g" -e "s/\://g" <<<$row)
else
KEY_OR_VALUE="key"
ENC_VALUE=$(sed -e "s/\"//g" -e "s/\://g" -e"s/\,//g"<<<$row)
if [[ $ENC_VALUE = '$ANSIBLE_VAULT'* ]]; then
echo -e "$ENC_VALUE" | ansible-vault decrypt --vault-password-file vault_pass
fi
echo ""
fi
done
答案 13 :(得分:0)
你可以用单线做
ansible localhost -m debug -a var='NAME_OF_ENCRYPTED_VAR' -e "@PATH_TO_FILE_WITH_VARIABLE" --vault-id yourid@/path/to/file
或从命令行输入密码
ansible localhost -m debug -a var='NAME_OF_ENCRYPTED_VAR' -e "@PATH_TO_FILE_WITH_VARIABLE" --ask-vault-pass
答案 14 :(得分:-1)
如果您安装了ansible,则可以使用以下方法解密文件(不是字符串):
ansible-vault view your_vault_filename.yml
这将提示您输入密码,通过身份验证后,内容将显示为解密。