この一見単純な例をAnsible 1.8.3で動作させることはできません。変数の補間はタスク名に影響しません。すべて examples 私はこれが機能することを示唆しているようです。変数がvarsセクションで定義されているので、タスク名が変数の値を出力することを期待していました。なぜこれが機能しないのですか?
Ansible documentation の例でも、変数値が出力されないようです。
---
- hosts: 127.0.0.1
gather_facts: no
vars:
vhost: "foo"
tasks:
- name: create a virtual Host file for {{ vhost }}
debug: msg="{{ vhost }}"
これにより、次の出力が得られます。
PLAY [127.0.0.1]
**************************************************************
TASK: [create a virtual Host file for {{ vhost }}]
****************************
ok: [127.0.0.1] => {
"msg": "foo"
}
PLAY RECAP
********************************************************************
127.0.0.1 : ok=1 changed=0 unreachable=0 failed=0
Updateこれは1.7.2では機能しますが、1.8.3では機能しません。つまり、これはバグか機能です。
変数はname
内では解決されません。実際のタスク/条件などの中でのみ、プレースホルダーが解決されます。これは仕様によるものだと思います。あなたがwith_items
ループして{{ item }}
in name
。タスクname
は1回だけ印刷されますが、{{ item }}
は反復ごとに変化します。
リンクしたドキュメントの例でさえ、name
で変数を使用している例が表示されます。しかし、だからといって期待どおりの結果になるとは限りません。ドキュメントはコミュニティで管理されています。それをテストせずにその行をそこに置いただけの人かもしれません-または、おそらく以前のバージョンのAnsibleでそのように機能し、ドキュメントは更新されていませんでした。 (私は約1年以来、Ansibleのみを使用しています)。しかし、期待どおりに機能しない場合でも、name
で変数を使用しています。これは、タスクが動的パラメーターに基づいていることを示すためだけです。例は同じ意図で書かれているかもしれません。
私が最近行った興味深い観察(Ansible 1.9.4)は、デフォルト値がタスク名に書き出されていることです。
- name: create a virtual Host file for {{ vhost | default("foo") }}
実行すると、Ansibleはタスクのタイトルを次のように表示します。
タスク:[fooの仮想ホストファイルを作成する]
このようにして、出力で見苦しいタスク名を回避できます。
変数が補間されるかどうかは、変数が宣言されている場所によって異なります。
A
とB
の2つのホストがあるとします。
foo
にホストごとの値しかない場合、Ansibleが再生を実行するときに、使用する値を決定できません。出典: https://github.com/ansible/ansible/issues/3103#issuecomment-18835432
ansible_user
は在庫変数ですgreeting
は不変変数です- name: Test variable substitution in names
hosts: localhost
connection: local
vars:
greeting: Hello
tasks:
- name: Sorry {{ ansible_user }}
debug:
msg: this won't work
- name: You say '{{ greeting }}'
debug:
var: ansible_user
今日、Ansibleの役割の1つで同じ問題を経験し、興味深いことに気付きました。
タスク名でvarsを使用する前にset_factモジュールを使用すると、実際には正しい値に変換されます。
この例では、リモートユーザーのパスワードを設定します。
変数を使用することに注意してくださいtest_user
およびuser_password
以前に事実として設定したこと。
- name: Prepare to set user password
set_fact:
user_password: "{{ linux_pass }}"
user_salt: "s0m3s4lt"
test_user: "{{ ansible_user }}"
- name: "Changing password for user {{ test_user }} to {{ user_password }}"
user:
name: "{{ ansible_user }}"
password: "{{ user_password | password_hash('sha512', user_salt) }}"
state: present
Shell: /bin/bash
update_password: always
これにより、次の出力が得られます。
TASK [install : Changing password for user linux to LiNuXuSeRPaSs#]
これで私の問題は解決しました。
文字列は引用符で囲む必要があります。
tasks:
- name: "create a virtual Host file for {{ vhost }}"
debug: msg="{{ vhost }}"
YAML構文では、値を{{foo}}で開始する場合は、行全体を引用符で囲む必要があります。これは、YAML辞書を開始しないようにするためです。これは YAML Syntax ページで説明されています。