web-dev-qa-db-ja.com

タグとパラメーターでansibleプレイブックを呼び出す

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

main.yml

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

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 }}'
5
ali haider

最初に、include/rolesを使用する場合のタグの実際の動作について少し説明します。

-tagsを使用してプレイブックを実行するときにタグを指定する必要があります。指定したタグの下にあるすべてのタスクは、メインファイルで定義されているか、ロール/インクルードファイルで定義されているかに関係なく実行されます。注意すべきいくつかの興味深い事実があります:

main.yml

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

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

includeFile.yml

- debug: msg="task 1 in includeFile"
  tags:
    - t1

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

- debug: msg="task 3 in includeFile"
  tags:
    - t3

 1. ansible-playbook -i hosts main.yml --tags "t1"

このタグは、ファイルを含むmain.ymlの最初のタスクで使用されているため、includeFile.ymlで定義されているすべてのタスクは、includeFile.ymlのタグをさらにチェックすることなく実行されます。

includeFile.yml内のタスクもこのタグを使用していることに注意してください。ただし、その特定のタスクのみが実行されることを意味するわけではありません。


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

この場合、main.ymlの最初のタスク(include)はこのタグを使用していません。これは、includeFile.ymlのタスクが実行されないことを意味するものではなく、includeFile.ymlはさらに言及されたタグを検索します。したがって、main.ymlの2番目のタスクとincludeFile.ymlの2番目のタスクが実行されます。


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

この場合、includeFile.ymlの3番目のタスクのみが実行されます(2番目のポイントで説明したのと同じロジック)。



今あなたの質問に戻ってきます:

-tagsを使用したansible-playbookコマンドの実行時にのみタグに言及できます。そのため、現時点では、ファイルをインクルードするときにタグを渡すことはできません。

ただし、ansible-playbookの実行中にいくつかのタグ(インクルードファイルに存在する)に言及すると、処理は完了しますが、その特定のタグを使用しているタスク(メインファイル内)のみが実行されます。したがって、このオプションは、メインファイルに存在するすべてのタスクにタグを付けて機能させるために、実行可能ではないように見えます。

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

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

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

14
Shasha99