ansible-vault を使用してファイルを復号化してアップロードする例はありますか?.
SSL証明書をソース管理で暗号化しておくことを考えています。
次のように動作するはずです。
---
- name: upload ssl crt
copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt
それはうまくいきません。取得できるのはencrypted.crt
(Ansible Vaultを使用)文字通りdomain.crt
必要なのは、プレイブックを「Vault」の一部にし、証明書の内容を含む変数を追加することです。このようなもの:
---
- name: My cool playbook
hosts: all
vars:
mycert: |
aasfasdfasfas
sdafasdfasdfasdfsa
asfasfasfddasfasdfa
tasks:
# Apparently this causes new lines on newer ansible versions
# - name: Put uncrypted cert in a file
# Shell: echo '{{ mycert }}' > mydecrypted.pem
# You can try this as per
# https://github.com/ansible/ansible/issues/9172
- copy:
content: "{{ mycert }}"
dest: /mydecrypted.pem
- name: Upload Cert
copy: src=/home/ubuntu/mydecrypted.pem dest=/home/ubuntu/mydecrypteddest.pem
- name: Delete decrypted cert
file: path=/home/ubuntu/mydecrypted.pem state=absent
Ansible Vaultを使用して、mycert
変数を別の変数ファイルに配置することもできます。
コピーモジュールは、Ansible 2.1で更新されました。変更ログから:「コピーモジュールは、ボールトされたファイルをソースとして透過的に使用できるようになりました。ボールトパスワードが提供された場合、暗号化されたファイルは即座に復号化およびコピーされます。」一部の人々は必然的に受け入れられた答えを過ぎて見ていないので、ここでそれに注意してください。 – JKライホ
Ansible 2.1.x以降、コピーモジュールはこれをシームレスに行います。 Ansible Vaultでファイルを暗号化してから、ファイルに対してコピータスクを発行するだけです。
(参照用に、これを追加した機能を次に示します。 https://github.com/ansible/ansible/pull/15417 )
コピーモジュールでこれをネイティブにサポートするための 機能要求 があります。しかし、それが実装されるまで、回避策があります(@ dave1010の答えに似ていますが、完全性のために共通部分を繰り返します):
secrets.yml
あなたの秘密を含むansible vaultで暗号化されたファイル、例えば:
---
private_ssl_key: |
-----BEGIN PRIVATE KEY-----
abcabcabcabcabcabcabcabcabc
-----END PRIVATE KEY-----
private_crt: |
-----BEGIN CERTIFICATE-----
abcabcabcabcabcabcabcabcabc
-----END CERTIFICATE-----
あなたのプレイブックにそれを含めてください:
vars_files:
- secrets.yml
次に、タスクで変数を使用できます。
- name: Copy private kay
copy: content="{{ private_ssl_key }}" dest=/some/path/ssl.key
ただし、コピーしようとしているファイルがバイナリファイルの場合、これは機能しません。その場合、まずbase64でコンテンツをエンコードする必要があります。
cat your_secret_file | /usr/bin/base64
次に、base64でエンコードされた値をsecrets.yml
ファイル、例:
crt_b64: |
ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...
次に、2つの手順でリモートファイルを作成できます。
- name: Copy certificate (base64 encoded)
copy: content="{{ crt_b64 }}" dest=/some/path/cert.b64
- name: Decode certificate
Shell: "base64 -d /some/path/cert.b64 > /some/path/cert.txt"
args:
creates: /some/path/cert.txt
一時的なcert.b64
リモートホスト上のファイル。ただし、その後、プレイブックを再実行すると、このタスクをスキップする代わりに、プレイブックが再作成されます。だから、そこに置いておきたい。
[〜#〜] update [〜#〜]:この機能は Ansible 2.1 で実装されました。
コピーモジュールは、ボールトされたファイルをソースとして透過的に使用できるようになりました。ボールトパスワードが提供された場合、暗号化されたファイルは即座に復号化およびコピーされます。
テンプレートとvars_file
を使用して実行しました。
トップレベルのプレイブックで:
vars_files:
- secretvars.yml
タスク内:
- name: Private ssl key
template: src=etc-ssl-private-site.key dest=/etc/ssl/private/site.key
テンプレート(etc-ssl-private-site.key
)で必要なのは変数のみです:
{{ private_ssl_key }}
暗号化されたsecretvars.yml
(ansible-vault
で暗号化):
---
private_ssl_key: |
-----BEGIN PRIVATE KEY-----
abcabcabcabcabcabcabcabcabc
-----END PRIVATE KEY-----
更新:April 2016my Github PR がマージされ、Ansible 2.1以降で利用可能になりました。以下は、PRが統合されるまでの暫定的な解決策でした。
同じことをしたいので、この機能を実装するアクションプラグインを作成しました。これは github で利用できます。プラグインは、ansibleに同梱されているコピーアクションプラグインとまったく同じですが、ボールトの復号化をサポートしています。
次のように使用できます。
- name: Copy Some Secret File
copyv: src="secret.txt" dest="/tmp/"
secret.txtが暗号化されている(およびボールトパスワードが提供されている)場合、復号化されてコピーされます。
これを行うにはもっと簡単な方法があると思います。
1つのファイルで証明書+キーを何らかの形式(pkcs12または単に連結)で使用する場合、汎用のopenssl
(またはgpg
、またはその他)暗号化を使用できます。次のようになります。
openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
その後、encrypted.aesをリモートホストにコピーして、その場で復号化することができます。
- name: copy encrypted cert and key
copy: src=encrypted.aes dest=/root/ansible-files/ mode=0600
- name: decrypt cert and key
command: openssl enc -aes-256-ctr -d -in /root/ansible-files/encrypted.aes -out <dest> -k {{ pass-vault }}
Pemまたはder形式の個別のキーファイルがある場合は、次を使用できます。
openssl rsa -in original.pem -out encrypted.pem -aes256 -passout pass:<pass-vault>
Ansible 2.5では、パラメーターdecrypt
がcopy
モジュールに追加されました。
たとえば、次のようなものを使用してファイルを暗号化した場合:
$ ansible-vault encrypt vault/encrypted.crt
これで、copy + decryptを使用できます。
---
- name: upload ssl crt
copy:
src: path/to/encrypted-with-vault.crt
dest: /usr/local/etc/ssl/domain.crt
decrypt: yes
mode: 0600
「コピー」モジュールが拡張され、ボールトファイルが自動的に復号化されるまで、簡単な回避策があります。
Stdoutがttyではない場合、ansible-vault view <file>
は、ポケットベルを呼び出さずにクリアテキストを標準出力に出力します。
「パイプ」ルックアップと組み合わせて、この動作をボールトパスワードファイルとともに使用して、コピーモジュールの「コンテンツ」オプションにフィードすることができます。
- name: "install Host key"
copy: content="{{ lookup('pipe', 'ansible-vault view ' + src_key_file) }}"
dest={{ dest_key_file }}
Local_actionを使用して、プレイブックの一部としてファイルを一時的に復号化することもできます。
- name: "temporairly decrypt the twpol.enc"
Sudo: False
local_action: Shell ansible-vault view --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASS_FILE') }} ./roles/copykey/files/key.enc > ./roles/copykey/files/key.txt
- name: "copy the key to the target machine."
copy: src=key.txt dest=/tmp
- name: "remove decrypted key.txt file"
Sudo: False
local_action: rm ./roles/copykey/files/key.txt