高度な構文

このページの高度な yaml 構文の例では、Ansible で使用される yaml ファイルに置かれるデータをさらに制御できます。Python 固有の yaml に関する追加情報は、公式の PyYAML ドキュメント を参照してください。

安全でない文字列または raw 文字列

Ansible は、変数値を「安全ではない」と宣言する内部データタイプを提供します。つまり、変数値内に保持されるデータは安全ではない状態で処理される必要があり、安全ではない文字置換や情報の公開を防ぎます。

Jinja2 にはエスケープの機能が含まれ、{% raw %} ... {% endraw %} などの機能を使用してデータをテンプレート化しないように Jinja2 に指示しますが、これにより、より包括的な実装を使用して値がテンプレート化されないようにします。

YAML タグを使用して、以下のように !unsafe タグを使用して値を「安全ではない」としてマークすることもできます。

---
my_unsafe_variable: !unsafe 'this variable has {{ characters that should not be treated as a jinja2 template'

Playbook では、以下のようになります。

— hosts: all vars:

my_unsafe_variable: !unsafe ‘unsafe value’
tasks:

ハッシュやアレイなどの複雑な変数の場合は、個々の要素で以下のような !unsafe を使用します。

— my_unsafe_array:

  • !unsafe ‘unsafe element’
  • ‘safe element’
my_unsafe_hash:
unsafe_key: !unsafe ‘unsafe value’

yaml アンカーおよびエイリアス: 変数値の共有

yaml アンカーおよびエイリアス は、柔軟な方法で共有変数の値を定義、維持、および使用するのに役立ちます。 アンカーは & で定義してから、* で示されるエイリアスを使用して参照します。アンカーで 3 つの値を設定し、エイリアスでこれらの値のうち 2 つを使用し、3 番目の値を上書きする例を次に示します。

vars:
app1:
jvm: &jvm_opts
opts: ‘-Xms1G -Xmx2G’ port:1000 path: /usr/lib/app1
app2:
jvm:
<<: *jvm_opts path: /usr/lib/app2

ここでは、app1 および app2 は、アンカー &jvm_opts およびエイリアス *jvm_opts を使用して、opts および port の値を共有します。 path の値は、<< または マージオペレーター でマージされます。

アンカーとエイリアスを使用すると、ネストされた変数を含む変数値の複雑なセットを共有することもできます。別の変数の値が含まれる変数値がある場合は、個別に定義できます。

vars:
webapp_version:1.0 webapp_custom_name:ToDo_App-1.0

これは非効率的であり、大規模になると、より多くの維持が必要になります。名前にバージョン値を組み込むには、app_version のアンカーと、custom_name のエイリアスを使用できます。

vars:
webapp:

version: &my_version 1.0 custom_name:

  • “ToDo_App”
  • *my_version

これで、custom_name の値の app_version の値を再利用し、テンプレートで出力を使用できます:

---
- name:Using values nested inside dictionary
  hosts: localhost
  vars:
    webapp:
        version: &my_version 1.0
        custom_name:
            - "ToDo_App"
            - *my_version
  tasks:
  - name:Using Anchor value
    debug:
        msg:My app is called "{{ webapp.custom_name | join('-') }}".

version の値に &my_version アンカーを付けてアンカーを作成し、*my_version エイリアスで再利用しました。アンカーとエイリアスを使用すると、ディクショナリー内のネストされた値にアクセスできます。

See also

変数の使用
変数の詳細
ユーザーメーリングリスト
ご質問はございますか。 Google Group をご覧ください。
irc.freenode.net
IRC チャットチャンネル #ansible