77

我一直在等待 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

如何解密字符串以便我知道它的价值而不需要运行播放?

4

19 回答 19

53

您还可以ansible对相应的主机/组/库存组合使用普通命令,例如:

$ ansible my_server -m debug -a 'var=my_secret'
my_server | SUCCESS => {
    "my_secret": "373861663362363036363361663037373661353137303762"
}
于 2017-07-26T12:17:59.047 回答
49

您可以通过管道输入输入,然后告诉ansible-vault输出到stderr,然后将其重定向到stdout/dev/null因为该工具会打印Decryption successful.

/dev/stdin/在新的 Ansible 版本中可能不需要该部分。

就像是:

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
于 2017-06-29T10:15:27.710 回答
33

由于整个 vault 文件不能很好地与 git 历史记录一起使用,因此在变量文件中使用 vault 字符串是可行的方法,它也使得按名称查找变量更加清晰。

这是一个简单的工作示例:

我想把 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
    $
于 2017-07-14T16:25:13.253 回答
22

您是否尝试将加密字符串设置为变量,然后-debug用于获取其解密输出?

IE

将您的加密字符串定义为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
于 2017-04-18T08:33:48.553 回答
7

这是解密字符串的另一种方法

$ ansible localhost \
       -m debug \
       -a "var=mysecret" \
       -e "@inventory/group_vars/master"
localhost | SUCCESS => {
"mysecret": "somesecret\n"
}

这里的诀窍是我们传递了一个带有 Ansible 拱顶秘密的文件,mysecret它也在ansible其中,它能够解密它。

注意:如果您没有密码来解密 Ansible 保管的加密密钥,您也可以将其传递:

$ ansible localhost --vault-password-file=~/.vault_pass.txt \
       -m debug \
       -a "var=mysecret" \
       -e "@inventory/group_vars/master"
localhost | SUCCESS => {
"mysecret": "somesecret\n"
}
于 2019-09-23T20:25:40.513 回答
7

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
于 2019-03-26T23:41:03.413 回答
6

你可以用单线做到这一点

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
于 2021-03-09T15:17:34.757 回答
4

这对我有用,类似于 Scudelletti 所做的,但通过跳马传球,即

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

多亏了尾随的&& echo. 如果您遇到任何权限错误,我的保险库通行证的权限为 644。

希望能帮助到你!

于 2018-11-21T06:07:37.990 回答
4

有了这个,你可以解密一个只包含一个 ansible Vault 字符串的文件:

cat encrypted_vault_string | ansible-vault decrypt

输出:

Vault passsword: <enter password, is not echoed to you>
Decryption successful
< decrypted string here>

ansible Vault 字符串如下所示:

$ANSIBE_VAULT;1.1;AES256
123456789...
123456789...
123456789...
1234

这也适用于没有中间文件

echo -e '$ANSIBLE_VAULT;1.1;AES256\n123456789...789' | ansible-vault decrypt
于 2021-12-15T10:55:13.657 回答
2

这一命令仅提取加密数据并将其传递给解密。我更喜欢它,因为您不需要手动提取数据。

$ grep -v vault test.yml | awk '{$1=$1;print}' | ansible-vault decrypt
于 2019-02-01T21:48:05.260 回答
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)
于 2018-02-21T21:36:56.693 回答
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

这个答案扩展了@maricn 注意的评论,我正在使用这个 yq,但是任何 yaml 查询工具都可以。使用 subshel​​l 重定向的原则在这里很重要(无临时文件)。另请注意,您可以添加--ask-vault-password. 但是,使用用 GPG 加密的秘密要好得多,因为您不必每次都输入密码,而且这种工作流程对于团队(YMVV 和 IHMO)来说要好得多。这是一个关于如何将 GPG 与 ansible-vault 一起使用的好教程

把它贴在你的身上.bashrc并享受它。

更新

我对ansible-vault encrypt\decrypt工作流程感到沮丧。因此,我创建了一个包装器,用于解密 var 文件中的字符串。看看:https ://github.com/oz123/ansible-vault-string-helper

于 2020-11-20T18:17:17.370 回答
1

您可以将加密字符串复制到文件中,但您只需要复制加密部分而不是其他 yml 部分。

所以你的文件需要改变:

test: !vault |
     $ANSIBLE_VAULT;1.1;AES256
     37366638363362303836383335623066343562666662386233306537333232396637346463376430
     3664323265333036663736383837326263376637616466610a383430623562633235616531303861
     66313432303063343230613665323930386138613334303839626131373033656463303736366166
     6635346135636437360a313031376566303238303835353364313434363163343066363932346165
     6136

至:

$ANSIBLE_VAULT;1.1;AES256
37366638363362303836383335623066343562666662386233306537333232396637346463376430
3664323265333036663736383837326263376637616466610a383430623562633235616531303861
66313432303063343230613665323930386138613334303839626131373033656463303736366166
6635346135636437360a313031376566303238303835353364313434363163343066363932346136

您将能够使用

ansible-vault decrypt --vault-password-file <path to passwordfile> test.yml

ansible-vault view --vault-password-file <path to passwordfile> test.yml

也许放弃,.yml因为那不再有意义了。

于 2021-09-20T10:29:14.887 回答
1

我知道已经有一段时间了,但是当我在ansible-vault decrypt没有其他任何东西的情况下通过管道传输它时,它对我有用,就像这样:

$ echo '$ANSIBLE_VAULT;1.1;AES256
38613538323065373061616466616334306237336461333935393261646131616232643238626635
3336633631366539383039343437306664336165326565650a353233303431613362653838643135
34363763366134393366356339343039313035366164636133326639376334313335316565373330
3435633463313334310a653239313039323135363865313933626464663363656164343662303763
34616663626530656630633839346531653862633332396365396432366234333861' | ansible-vault decrypt
Decryption successful
super-secret-string$ 

以防万一有人感兴趣。我有ansible版本2.9.26

于 2021-11-09T20:55:43.793 回答
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

应该可以工作,前提是您拥有加密数据的密钥

于 2020-03-01T20:18:17.470 回答
0

遇到这个问题和这里的答案,我只想添加一个我一起编写的快速 bash 脚本,它读取整个 yaml 文件,寻找可以解密转储到屏幕的字符串。

它远非完美,我也不是 bash 中最热门的,但希望这可以帮助那些与我处于相同情况的人想要进行一般转储。

要使用以下脚本,您必须在名为 的文件(当前工作路径)中包含您的保管库密码vault_pass,并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
于 2020-09-23T04:12:10.723 回答
0

像其他评论者提到的那样,尝试解密或使用 ,对我来说也失败,并出现/dev/stdin错误,ansible-vault decrypt /dev/stdin例如.--vault-password-file=/dev/stdinERROR! [Errno 2] No such file or directory: '/proc/100/fd/pipe:[12930445]'

但是,--vault-password-file还需要一个可执行文件在标准输出上生成密码,因此您实际上可以使用/bin/cat管道输入密码:

echo password | ansible-vault decrypt --output - --vault-password-file=/bin/cat ./encrypted_vault_file

于 2022-01-13T12:49:51.000 回答
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
于 2020-03-01T07:30:15.287 回答
0

疯狂但优雅的 shell 脚本,用于输出带有解密的内联变量的干净 yaml 文件(假设您设置了ANSIBLE_VAULT_PASSWORD_FILE并安装了yq v4 ):

VARS_FILE=path/to/your/vars_file_with_encrypted_vars.yml
yq -P e "$(for v in $(grep '\!vault' $VARS_FILE | cut -d: -f1); do val=$(yq e .${v} $VARS_FILE | tr -d ' ' | ansible-vault decrypt); echo .$v = \"$val\" \|; done) null = null" $VARS_FILE
于 2021-12-02T20:40:54.307 回答