Encrypt_string機能を導入する予定だったので、私はansible 2.3を待っていました。
残念ながら、暗号化された文字列をどのように読み取れるかわかりません。
decrypt_string、decrypt(ファイル)、view(ファイル)を試しましたが、何も機能しません。
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
です
プレイを実行する必要なく、その値が何であるかを知るために、どうすれば文字列を解読できますか?
暗号化された文字列を変数として設定し、-debug
を使用して復号化された出力を取得しようとしましたか?
つまり.
暗号化された文字列をPlaybookの変数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
`
また、それぞれのホスト/グループ/インベントリの組み合わせに対してプレーンansible
コマンドを使用することもできます。例:
$ ansible my_server -m debug -a 'var=my_secret'
my_server | SUCCESS => {
"my_secret": "373861663362363036363361663037373661353137303762"
}
入力をパイプ処理し、ansible-vault
にstderr
に出力するように指示し、ツールが/dev/null
を出力するため、stdout
を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
ボールトファイル全体がgit履歴とうまく機能しないため、変数ファイル内でボールト文字列を使用する方法があります。また、名前で変数をgrepすることをより明確にします。
以下に簡単な例を示します。
私は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
$
Ansibleデバッグメッセージで暗号化された文字列値を表示したり、ansible cliを使用しても問題はありませんが、自動化のニーズに便利なソリューションがもう1つあります。 ansibleからpython libsを利用し、コード内で使用できます(基本的に、これらはすべて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)
Scudellettiが行うことと似ていますが、vaultパスを渡すことで、つまり、.
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です。
それが役に立てば幸い!
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
この1つのコマンドは、暗号化されたデータのみを抽出し、復号化に渡します。手動でデータを抽出する必要がないので、少し気に入っています。
$ grep -v vault test.yml | awk '{$1=$1;print}' | ansible-vault decrypt