web-dev-qa-db-ja.com

Ansible:タグが指定されている場合にのみタスクを実行します

Ansibleタグ は、タスク/ロールのサブセットのみを実行するために使用できます。つまり、デフォルトではすべてのタスクが実行され、一部のタスクの実行のみを防止できます。

「foo」タグが指定されている場合に、実行するタスクを制限することはできますかonly?タスクのwhenセクションで現在のタグを使用できますか?

79
Taha Jahangir

Ansible 2.5には、特別なタグneverおよびalwaysが付属しています。タグneverは、まさにこの目的で使用できます。例えば:

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

この例では、debug(またはnever)タグが明示的に要求された場合にのみタスクが実行されます。 [ansible docsに関するリファレンス]

46
Taha Jahangir

これは迂回的な解決策ですが、機能します。

通常の実行が実行されるときに、タスクリスト内で変数を登録します。次に、その変数をチェックするwhen条件をタグ付きタスクに追加します。

- Shell: /bin/true
  register: normal_task_list

- name: Only run when tag is specified
  Shell: /bin/echo "Only running because of specified tag"
  when: normal_task_list is not defined
  tags: specified
20
Chris Chipman

コマンドライン変数(--extra-vars)の使用を提案する回答に賛成票を投じたりコメントしたりするのに十分な評判はありませんが、これに追加する必要があります。

このメソッドの注意点は、その追加の変数を定義しないと、再生がエラーになり失敗することです。

プレイブック自体にデフォルト値を定義することで、--extra-vars定義がない場合に再生が失敗するのを防ぐことができます。

---
- hosts: ...
# ↓↓↓
  vars:
    thorough: false
# ↑↑↑
  tasks:
  - name: apt - install nfs-common only when thorough is true
    when: thorough | bool
    apt:
      cache_valid_time: 86400
      force: yes
      pkg:
        - nfs-common

コマンドラインで定義された変数が他のすべての定義よりも優先されるため、--extra-varsによるオーバーライドは引き続き機能します。

その結果、コマンドラインでthoroughtrueに変更されていない場合、再生はエラーなしで実行されます。

17
Alex Peters

Conditionals を使用して、タグを指定しない場合に実行されるタスクを誤って実行するのを防ぐことができます。このメソッドの注意点は、その追加の変数を定義しないと、再生がエラーになり失敗することです。

Extra-vars引数を使用すると、条件付き実行をトリガーできます。

Ansible-playbook --helpから:

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    set additional variables as key=value or YAML/JSON

例:

ansible-playbook test.yaml -e "thorough=true"

test.yaml:

...
- name: apt - install nfs-common only when thorough is true
  apt:
    cache_valid_time: 86400
    force: yes
    pkg:
    - nfs-common
  when: thorough | default(False)
...
10
Ava

'tags'変数のチェックは、Ansible 2.1.1.0では機能しません。テストについては、以下を参照してください。タグが定義されている場合にのみタスクを実行し、Ansible 1.9.Xと2.X.Yの両方で機能するという別のアイデアがあります。

- set_fact: foo=true
  tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
  debug: var=foo
  when: foo
  tags: bar

これにより、タグなしでプレイブックを実行すると、「foo」変数がtrueに設定されてからfalseに設定されるため、何も実行されません。 'bar'タグを追加すると、最初の設定のみが適用されるため、 'foo'変数はtrueになり、タスクが実行されます。楽しい!


そして、これがAnsible 2.1.1.0の「タグ」変数に関するテストです。

プレイブックは次のとおりです。

- hosts: localhost
  connection: local
  tasks:
    - name: display tags variable
      debug: var=tags
      tags: foo

    - name: do something only when tag 'foo' is provided
      debug: var=tag
      when: tags is defined
      tags: foo

そしてここに出力があります:

$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
  config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
  configured module search path = Default w/o overrides

PLAY [localhost] ***************************************************************

TASK [display tags variable] ***************************************************
ok: [localhost] => {
    "tags": "VARIABLE IS NOT DEFINED!"
}

TASK [do something only when tag 'foo' is provided] ****************************

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   
4
nootal

特別なタグ- "never"があります。これにより、タグが明示的に要求されない限り、タスクが実行されなくなります。

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]
2
xtoznaxto

はい。 --tags fooフラグを使用してansible-playbookを実行すると、fooでタグ付けされたタスクのみが実行されます。たとえば、example.ymlというプレイブックがあるとします。

tasks:

  - yum: name={{ item }} state=installed
    with_items:
       - httpd
       - memcached
    tags:
       - packages

  - name: some other task
    ..
    tags:
      - some other tag

ランニング:

ansible-playbook example.yml --tags "packages"

Yumタスクのみが実行されることを確認します。

したがって、実際にwhenセクションでタグを使用して条件付きでタスクを実行する必要はありません。プレイブック/ロールの複雑さによっては、-tagsと--skip-tagsの組み合わせを使用して、実行するタスクを制御する必要がある場合があります。たとえば、インクルードタスクに「foo」というタグが付けられ、インクルードされたプレイブック内の一部のタスクに「バー」というタグが付けられている場合、次のコマンドを実行します。

ansible-playbook --tags "foo"

内部タスク( 'bar'としてのみタグ付け)が実行されます。 「bar」としてタグ付けされたすべての内部タスクの実行を回避するには、次のコマンドを実行する必要があります

ansible-playbook --tags foo --skip-tags bar
2
Shahar
tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

これは正しい答えですが、しばしば人々を混乱させるのは、このタグをAnsibleにaddさせる方法です。なぜなら、--tags debugコマンドラインの場合、only実行されるのはデバッグタスクです。ソリューションは--tags all,debugです。

ansible-playbook play.yaml --tags all,debug

タグに関するAnsible docs には次の行があります。

デフォルトでは、Ansibleは--tags allが指定されているかのように実行されます。

0
Wookie

Ansible 2.3.2.0での問題の解決策は次のとおりです。

---
- hosts: localhost
  gather_facts: no
  vars:
    in_tag: yes
  tasks:
    - set_fact: in_tag=no
    - fail:
        msg: "recently_added is set and you're using blah tag"
      when: ( in_tag | bool )
      tags:
        - blah
    - debug:
        msg: "always remember"

最初にin_tagTrueに設定します。次に、Falseを指定しないと、set_facttagsに設定します。 ansible-playbookから。

タグを指定すると、in_tagTrueに留まり、failタスクが実行されます。

PS:必要なタスクにロジックを追加できます

PS2:もちろん、ロジックを拡張して、お持ちのすべてのタグとset_fact: in_tag_blah=Truetags: ["blah"]と組み合わせてハードコードすることもできます。

0
tehmoon

when句はタグの存在を評価できません。回避策として、変数とタグを一緒に使用して、そのタグ/変数に固有のタスクを実行します。

例:プレイブックとインベントリを想像してください

#インベントリ
 [dev] 
 192.168.1.1 
 
#site.yml 
-ホスト:dev 
ロール:
-{ロール:共通} 
 
およびcommon/tasks/main.yml 
 
#ロール/共通/ tasks/main.yaml 
-name:インストールリンク
 apt:name = links state = present 
 
-include:uninstall.yml 
 when:uninstall_linksが定義されています
タグ:
-アンインストール
 
#roles/common/tasks/uninstall.yml 
-名前:アンインストールリンク
 apt:name = links state = absent 

このアプローチでは、タグを使用してuninstall.ymlのタスクのみを選択しますが、それを有効にするには 'uninstall_links'変数を何かに設定する必要もあります。そのため、パラメータなしでプレイブックを実行すると、デフォルトでインストールタスクが実行されます。アンインストールするには、タグ「uninstall」をプレイブック(またはcmdline)に設定し、[〜#〜] must [〜#〜]を設定することができます変数。タグを設定しない場合は、すべて(インストールとアンインストール)がこの順序で実行されるため、プロセス全体をテストするのに適しています。

すべてを実行する方法(インストールおよびアンインストールされます):

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"

開発グループで「アンインストール」タグのみを実行する方法

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall

したがって、変数とタグはsite.yml/inventoryファイルにもあり、SCMにコミットして意図を記録することができます。

0

おそらくもっと慣用的でエレガントな方法は、次のようにwhen条件をタスクに追加することです。

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'debug' ]
    when: "'debug' in ansible_run_tags"

これは、CLI引数ansible_run_tags(または同義語として--tags)を介して提供されるタグのリストを含む 魔法の変数-t を使用し、上記を実行する効果がありますタスクおよびdebugタグが指定されている場合のみ.

この魔法の変数はansible 2.5で導入されたようです

nootalが正しい、私のアプローチ機能しない-無視:(「when:myvar is defined」とコマンドラインスイッチ「-e "myvar = X"を使用して、明示的にのみタスクを実行する要求した。

さらに簡単に(少なくともansible 2.1.1.0で):

- name: do something only when tag 'foo' is provided
  when: tags is defined
  tags: foo

->タグが指定されていて、タグに「foo」が含まれている場合にのみ実行されます

0
DrPsychick