2016-10-21 4 views
0

includeステートメントを使用して、別のプレイブックから無能なv2.1プレイブック(notifications.yml)を呼び出そうとしています。タグを指定するだけでなく、呼び出されたプレイブックにパラメータを渡したいとします(含まれたプレイブックを持つプレイブック内から)。私はタグなしでこれを動作させることができましたが、タグで動作するように見えませんでした。これは、(コマンドラインパラメータなし)も可能ですし、もしそうなら、これを達成するための構文/正しい方法は何ですか:タグとパラメータを持つ無能なプレイブックを呼び出す

--- 
- connection: local 
    hosts: 127.0.0.1 
    tasks: 
    - name: Send notification message via Slack 
     tags: 
     - slack 
     local_action: 
     module: slack 
     domain: changed.slack.com 
     token: "{{ slack_token }}" 
     msg: "{{ slack_msg }}" 
     channel: "{{ slack_channel }}" 
     username: "{{ slack_username }}" 

    - name: Send notification message via Email 
     tags: 
     - email 
     local_action: 
     module: mail 
     host: "smtp.gmail.com" 
     port: "587" 
     username: '[email protected]' 
     password: 'changed' 
     to: "changed <[email protected]>" 
     subject: 'Ansible-report' 
     body: 'System {{ ansible_hostname }} has been successfully provisioned. User {{ ansible_user_id }}' 
notifications.yml

main.yml

- include: playbooks/notifications.yml 
    tags: ['slack'] 
    slack_msg: "test" 

+1

main.ymlの実行中に上記のタグが指定されている場合にのみ、このインクルードを実行しますか? – Shasha99

+0

main.ymlでタグを指定できるかどうかを調べるため、notifications.ymlファイルのタグでマークされたタスクが呼び出されます。私は今、これを実現するために条件文を使用することを検討していますが、タグで可能かどうかを知りたいのですが(私はmain.ymlのタグの使用法が間違っていると信じています) –

+0

代わりに変数を渡して通知で使用します。 yml。私はタグが含まれて渡すことができるとは思わない。 – Shasha99

答えて

5

まず、include/rolesを使用するときのタグの実際の動作について少し説明します。

タグ--tagsと指定されたタグの下に来て、すべてのタスクを使用して脚本を実行すると、彼らはメインファイルで定義されているか、役割が/そこfiles.Howeverを含めるかどうかにかかわらず実行されますしながら、指定する必要があります

main.yml

--- 
- hosts: all 
    tasks: 
    - include: includeFile.yml tags=t1 

    - debug: msg="Inside main file" 
     tags: 
     - t2 

includeFile.yml:注意すべきいくつかの興味深い事実がありますこのタグは、ファイルを含むさmain.ymlにおける最初のタスクによって使用されているので、includeFile.ymlで定義されたすべてのタスクはタグのさらなるチェックなしに実行されるので、今
1. ansible-playbook -i hosts main.yml --tags "t1" 
- debug: msg="task 1 in includeFile" 
    tags: 
    - t1 

- debug: msg="task 2 in includeFile" 
    tags: 
    - t2 

- debug: msg="task 3 in includeFile" 
    tags: 
    - t3 
includeFile.ymlにあります。

includeFile.ymlのタスクもこのタグを使用していますが、その特定のタスクのみが実行されるということではありません。 main.ymlの最初のタスクは、(含まれる)は、このタグを使用していないのでこの場合


2. ansible-playbook -i hosts main.yml --tags "t2" 

、。これはincludeFile.ymlのタスクが実行されないことを意味するものではなく、includeFile.ymlは前述のタグをさらに検索します。したがって、main.ymlの2番目のタスクとincludeFile.ymlの2番目のタスクが実行されます。


3. ansible-playbook -i hosts main.yml --tags "t3" 

今この場合、includeFile.ymlの唯一の第三のタスクが実行される(第2の点で説明したのと同じ論理)。今すぐ戻ってあなたの質問に来て



我々は--tagsを使用してのみansible-脚本コマンド実行時にタグを挙げることができます。だから今はファイルを含めながらタグを渡すことはできません。

しかし、あなたが使っているプレイプラウブを実行中にいくつかのタグ(インクルードファイルに含まれています)について言えば、その特定のタグを使用しているタスク(メインファイル内)のみが実行されます。このオプションは、あなたの事例を実行可能にするために、メインファイルにあるすべてのタスクにタグを付けなければならないので、あなたのケースでは実現可能ではありません。

コメントで説明したように、ダミー変数をインクルードファイルに渡して条件付きでタスクを実行する方が良いです。しかし、上記の議論に従って問題文が設定されている場合でも、タグを使用することができます。

注:ロール/インクルードを処理する際にもタグは有効です。メインのプレイブックやロール/添付の添付ファイルに存在する可能性のあるタスクを実行したくない場合、この場合、タグは完全に適合します(これを達成するためには、playbookを実行しながら--skip-tagsを使用します)。

最終ノート:タグを使用する主な目的は、その特定の実行でタスクを実行する必要がある動的制御を持つことです。タグをハードコードして(インクルードに渡す)、その目的は失われます。

+1

これをまとめてくれてありがとう –

関連する問題