Ansibleタグ は、タスク/ロールのサブセットのみを実行するために使用できます。つまり、デフォルトではすべてのタスクが実行され、一部のタスクの実行のみを防止できます。
「foo」タグが指定されている場合に、実行するタスクを制限することはできますかonly?タスクのwhen
セクションで現在のタグを使用できますか?
Ansible 2.5には、特別なタグnever
およびalways
が付属しています。タグnever
は、まさにこの目的で使用できます。例えば:
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
この例では、debug
(またはnever
)タグが明示的に要求された場合にのみタスクが実行されます。 [ansible docsに関するリファレンス]
これは迂回的な解決策ですが、機能します。
通常の実行が実行されるときに、タスクリスト内で変数を登録します。次に、その変数をチェックする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
コマンドライン変数(--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
によるオーバーライドは引き続き機能します。
その結果、コマンドラインでthorough
がtrue
に変更されていない場合、再生はエラーなしで実行されます。
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)
...
'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
特別なタグ- "never"があります。これにより、タグが明示的に要求されない限り、タスクが実行されなくなります。
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
はい。 --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
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が指定されているかのように実行されます。
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
をTrue
に設定します。次に、False
を指定しないと、set_fact
がtags
に設定します。 ansible-playbook
から。
タグを指定すると、in_tag
はTrue
に留まり、fail
タスクが実行されます。
PS:必要なタスクにロジックを追加できます
PS2:もちろん、ロジックを拡張して、お持ちのすべてのタグとset_fact: in_tag_blah=True
をtags: ["blah"]
と組み合わせてハードコードすることもできます。
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にコミットして意図を記録することができます。
おそらくもっと慣用的でエレガントな方法は、次のように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」が含まれている場合にのみ実行されます