如何使用ansible-vault 2.3.0解密字符串

时间:2017-04-18 08:24:23

标签: ansible ansible-vault

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

如何解密字符串,以便在不需要运行播放的情况下知道它的价值?

15 个答案:

答案 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查询工具都可以。在这里重要的是使用subshel​​l重定向的原理(没有临时文件)。 另请注意,您可以添加--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

这将提示您输入密码,通过身份验证后,内容将显示为解密。

来源https://www.digitalocean.com/community/tutorials/how-to-use-vault-to-protect-sensitive-ansible-data-on-ubuntu-16-04