web-dev-qa-db-ja.com

Ansible:タスク名の変数補間

この一見単純な例を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では機能しません。つまり、これはバグか機能です。

18
calvinkrishy

変数は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の仮想ホストファイルを作成する]

このようにして、出力で見苦しいタスク名を回避できます。

24
udondan

説明

変数が補間されるかどうかは、変数が宣言されている場所によって異なります。

ABの2つのホストがあるとします。

  • 変数fooにホストごとの値しかない場合、Ansibleが再生を実行するときに、使用する値を決定できません。
  • 一方、global値(ホストの不変性の意味でのグローバル)がある場合、どの値を使用するかについて混乱はありません。

出典: 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
4
MrMeszaros

今日、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 }}"

ansible documentation から:

YAML構文では、値を{{foo}}で開始する場合は、行全体を引用符で囲む必要があります。これは、YAML辞書を開始しないようにするためです。これは YAML Syntax ページで説明されています。

1
J.A. Simmons V