web-dev-qa-db-ja.com

ansibleロールで複数のvarファイルを使用する

私の役割の1つには、2つの異なる変数タイプがあります。 1つは公開されています(パッケージバージョンやその他の無害な情報など)。これらは心配することなくSCMにコミットできます。また、いくつかの個人情報(APIキーやその他の秘密情報など)も必要です。秘密情報を暗号化するためにansible-vaultを使用しています。私の解決策は、pulic用にvars/main.yamlを、暗号化された個人情報用にvars/vault.ymlを用意することでした。

私は問題に遭遇し、ここでのベストプラクティスまたは実際の解決策が何であるかがわかりません。 ansibleはvars/main.ymlファイルのみをロードするようです。当然、公開情報を暗号化したくないので、解決策を探しました。これまでのところ、私が思いついた(IRCで提案された)唯一の解決策は、group_vars/all/vault.ymlを作成し、すべての変数の前にロール名を付けることです。これは、ansibleがgroup_varsの下のすべてを再帰的にロードするように見えるために機能します。これは機能しますが、変数がspecificロール用であり、「グローバルに普遍的に真」ではないため、組織的に正しくないようです。また、include: vars/vault.ymlvars/main.ymlに入れようとしましたが、うまくいきませんでした。

これを行う適切な方法はありますか?

13
ahawkins

あなたの役割の最初のタスクとして、 include_vars task を持つことができます。

- include_vars: vault.yml

私はそれを試したことがありませんが ドキュメントによると ボールト暗号化ファイルはinclude_varsモジュールで使用できます。

ボールト機能は、Ansibleで使用される構造化データファイルを暗号化できます。これには、「group_vars /」または「Host_vars /」インベントリ変数、「include_vars」または「vars_files」によってロードされる変数を含めることができます[...]

7
udondan

Vaultを使用することをお勧めします。しかし、あなたは役割でこれを行うべきではありません。

その理由は、あなたの役割は変数とそのデフォルトを宣言するだけだからです。プレイブックはこれを使用するか、1つの値を設定します。変数がプライベートの場合、必要に応じて変数を宣言する必要がありますが、デフォルトはありません。したがって、誰かがあなたのロールを使用している場合、それを実行するために変数を宣言する必要があります。

必要な変数を要求する1つの解決策は、単純な条件です。

- fail: msg="Variable foo is required"
  when: foo is not defined

したがって、ボールトで暗号化された変数の処理は、プレイブックレベルで行われます。これは実装の詳細であり、役割を担うべきではありません。

5
flxPeters