Group_varsに定義された変数の値(True/False)に応じて、varsファイルにいくつかの変数を定義しようとしています。それらの値はグループ変数の値に依存します。
現在のvarファイルは次のようになります。
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
私の役割ごとに、このファイルに定義された変数を使用しています。
私のテストプレイブックは以下のようになります。
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
プレイブックを実行した後に受け取るエラーは次のとおりです。
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
私はここで愚かなことをしていますか、これはサポートされていませんか?私はこれらの変数を定義する別の方法を見つけようとしました(私はそれらをたくさん持っています)が、ここでなんらかの機能を得ることができませんでした。助言がありますか?
私が最後に行ったのは、2つの個別のvarファイルを作成することでした-それらをtype_a.yml
とtype_b.yml
と呼びましょう-使用するファイルを示すグループ変数を定義しました-type_of_file: a
のようなものです。これが私のプレイブックです。
- name: blabla
hosts: blabla
vars_files:
- <path>/type_{{ type_of_file }}.yml
roles: blabla
すべての回答をありがとう。私はそれらが本当に役立つと思います。
できないと思います。通常、条件付き変数コレクションを保持するために個別のファイルを作成し、 when
句を使用して特定の条件でそれらを含めます。
- include_vars: test_environment_vars.yml
when: global_platform == "test"
- include_vars: staging_environment_vars.yml
when: global_platform == "staging"
- include_vars: prod_environment_vars.yml
when:
- global_platform != "test"
- global_platform != "staging"
Ansibleでは、次のいずれかの形式で変数を条件付きで定義できます。
test:
var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
var2: "{{'value' if (my_group_var) else 'other_value'}}"
上記の構文とvarsルックアップを組み合わせると、複雑なvars(この場合はリスト)をロードできます。
test_value_when_my_group_var_is_true:
var1: value
var2: value
test_value_when_my_group_var_is_false:
var1: other_value
var2: other_value
test: "{{ lookup('vars','test_value_when_my_group_var_is_true') if (my_group_var) else lookup('vars','test_value_when_my_group_var_is_false')}}"
Varsルックアップで条件付きツリーの読み込みを行う別の方法があります。この方法は、ケースロジックを実装する必要がある場合に便利です(つまり、条件変数に3つ以上の可能な値がある)。
test_value_when_my_group_var_is_foo:
var1: value
var2: value
test_value_when_my_group_var_is_bar:
var1: other_value
var2: other_value
test_value_when_my_group_var_is_baz:
var1: yet_another_value
var2: yet_another_value
test: "{{ lookup('vars','test_value_when_my_group_var_is_' + my_group_var) }}"
それは素晴らしいことですが、あなたのやり方は不可能だと思います(または私は正しい方法を知りません)。
まず、jinjaテンプレートからvarsファイルを準備し、それをinclude_varsに含めることをお勧めします。プレイブックの例をご覧ください。
---
- name: -Test-
hosts: local
vars:
my_group_var: False
# my_group_var: True
tasks:
- name: Prepare vars file from template.
template: src=/tmp/vars.yaml.j2
dest=/tmp/vars.yaml
- name: Include vars
include_vars: "/tmp/vars.yaml"
Jinjaテンプレートの例/tmp/vars.yaml.j2の内容は次のとおりです。
{% if my_group_var %}
test:
var1: value
var2: value
{% else %}
test:
var1: other_value
var2: other_value
{% endif %}
以下の抜粋( Ansible Documentation から取得)が、上記の他の有用な貢献に価値のある追加になることを願っています。
- name: Show value of 'variablename'
debug: msg="{{ lookup('vars', 'variabl' + myvar)}}"
vars:
variablename: hello
myvar: ename
申し訳ありませんが、この{}の試みはJinja2テンプレート用であり、ymlファイル用ではありません。 ドキュメント から:
ansibleはテンプレートでJinja2ループと条件を許可しますが、プレイブックでは使用しません。
When句を使用して必要な変数を設定し、メインプレイブックにインポート(またはインクルード)するPlayを使用して、別の.ymlファイルを準備できます。これにより、すべての変数を条件付きで単一のファイルに定義できます。
または:ロールを使用します。問題を解決するには、役割が最も適切なアプローチだと思います。