5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【小ネタ】Ansible Vaultで暗号化された文字列が関数を挟むと何故かデコードされない場合は

Last updated at Posted at 2022-10-03

Ansible Vaultはパスワードなど秘密をキーファイルで暗号化してリポジトリに入れられるので便利です。1

group_vars/all.yml
# $ ansible-vault encrypt_string --encrypt-vault-id production 'Passw0rd!'
secret_string: !vault |
          $ANSIBLE_VAULT;1.2;AES256;production
          63303765363236336162663032356433396165336163666439326638356231313166373066636564
          3133396434386262373862656662623066346166343437650a366463343239346134303137303831
          61613062643835393435666138653364656261303062306663656637343362336532316465323066
          3936326532633831650a336162393538366337396432633232343635663561633663623862366535
          3861

通常、こういった暗号化文字列はAnsibleを実行する際に透過的にデコードされるのですが、

playbook.yml
- hosts: localhost
  gather_facts: false
  tasks:
     - ansible.builtin.debug:
         msg: "{{ secret_string }}"
$ ansible-playbook playbook.yml
PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************************************************************

TASK [ansible.builtin.debug] ********************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Passw0rd!"
}

たとえば、これを何かの関数に通すと、デコードをサボり始めることがあります。

playbook.yml
- hosts: localhost
  gather_facts: false
  tasks:
     - ansible.builtin.debug:
         # to_nice_yaml を介するとデコードしなくなる
         msg: "{{ secret_string | to_nice_yaml() }}"
TASK [ansible.builtin.debug] ********************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "!vault |\n    $ANSIBLE_VAULT;1.2;AES256;production\n    63303765363236336162663032356433396165336163666439326638356231313166373066636564\n    3133396434386262373862656662623066346166343437650a366463343239346134303137303831\n    61613062643835393435666138653364656261303062306663656637343362336532316465323066\n    3936326532633831650a336162393538366337396432633232343635663561633663623862366535\n    3861\n"
}

Ansible内部のデコード関数に到達していないためこうなってしまうと思われるのですが、こういった Ansible Vault文字列がデコードされない場合は、パイプラインの途中で一旦 | string を挟んであげるとデコードし始めるようになります。(あまり気持ちのいい挙動ではないですが)

playbook.yml
- hosts: localhost
  gather_facts: false
  tasks:
     - ansible.builtin.debug:
         # string でデコードされるようになる
         msg: "{{ secret_string | string | to_nice_yaml() }}"
TASK [ansible.builtin.debug] ********************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Passw0rd!\n"
}
  1. もちろんキーファイルはリポジトリに入れてはいけません。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?