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


75

Ansibleタグを使用して、タスク/ロールのサブセットのみを実行できます。これは、デフォルトですべてのタスクが実行され、一部のタスクのみが実行されるのを防ぐことができることを意味します。

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


2
必要なのは、limit_to_tags:fooのようなタスク設定であるように思えますが、fooは存在せず、今のところそれが可能だとは思いません。将来の実装では、これらのタグを一緒にANDまたはORするかどうかの計画も必要です。
dgh

- 「デフォルト/明示的なタグAnsible」での私anwserを見てください stackoverflow.com/questions/28789912/...
sirkubax

回答:


38

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

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

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


20

これはラウンドアバウトの解決策ですが、機能します。

通常の実行の実行時に、タスクリスト内に変数を登録します。次に、その変数をチェックする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

untaggedこれを達成するためにも使用できます- set_fact: untagged_run=true tags: untagged
。– Pyzo

これについてもう少し説明できますか?実世界の例?
Quintinのパー

17

コマンドライン変数(--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コマンドラインで定義された変数は他のすべての定義より優先されるため、viaによるオーバーライドは引き続き機能します。

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


5
を使用して同じことが実現できますthorough | default('no') | bool
コスティシウダトゥ

2
またはwhen: thorough is defined and thorough、その構文を好む場合
-KCD

ありがとう、is defined and構文をもっと愛してください。私が感じていない複数のパイプは直感的です。
イライジャリン

10

タグを指定しないと実行されないような誤って実行されるタスクから保護するために、条件を使用できます。このメソッドの注意点は、追加の変数を定義しないと、プレイがエラーになり失敗することです。

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)
...

2
「完全」を定義しない場合にエラーを回避するには、を使用しますthorough | default("false") | match("true")。デフォルトはである必要はなくfalse、一致しないものだけですが、true読みやすさが向上します。
トムウィルソン

4

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

- 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の 'tags'変数に関するテストです:

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

- 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   

2

はい。--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」のタグが付けられ、インクルードプレイブック内の一部のタスクに「bar」のタグが付けられ、実行する場合

ansible-playbook --tags "foo"

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

ansible-playbook --tags foo --skip-tags bar

7
これは正しくありません。「タスクにタグを指定すると、このタグがansible-playbookコマンドに明示的に渡された場合にのみ、そのタスクが実行されます。」
ジンボランド14年

1
第二に、声明は真実ではありません。
クリス14年

10
はい、常に適切なansible-playbookオプションを使用することで動作を実現できますが、OPは、特定のタグがansible-playbookコマンドに明示的に追加されない限り実行されないようにタスクに注釈を付ける方法を求めていると思います。
dgh

4
ええ、これはOPの質問に答えていません。
アレンルーチェ

タグを指定しない場合、タグ付き/タグなしのすべてのアクションが実行されます。タグは実行するアクションを除外することはできず、含めるだけです。加算フィルターを除いて、述語ロジックはありません。
bbaassssiiee


0

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

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

#在庫
[開発]
192.168.1.1

#site.yml
-ホスト:dev
  役割:
    -{役割:共通}

およびcommon / tasks / main.yml内

#roles / common / tasks / main.yaml
-名前:インストールリンク
  apt:name = links state = present

-含める:uninstall.yml
  when:uninstall_linksが定義されている
  タグ:
    - アンインストール

#roles / common / tasks / uninstall.yml
-名前:リンクのアンインストール
  apt:name = links state = absent

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

すべてを実行する方法(インストールとアンインストール):

$ 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

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

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_tagすることから始まり、fromを指定しない場合にonに戻すTruea があります。set_factFalsetagsansible-playbook

タグを指定すると、そのin_tagままでタスクが実行されます。Truefail

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.