Ansibleタグを使用して、タスク/ロールのサブセットのみを実行できます。これは、デフォルトですべてのタスクが実行され、一部のタスクのみが実行されるのを防ぐことができることを意味します。
「foo」タグが指定されている場合にのみ実行されるタスクを制限できますか?when
タスクのセクションで現在のタグを使用できますか?
Ansibleタグを使用して、タスク/ロールのサブセットのみを実行できます。これは、デフォルトですべてのタスクが実行され、一部のタスクのみが実行されるのを防ぐことができることを意味します。
「foo」タグが指定されている場合にのみ実行されるタスクを制限できますか?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
untagged
これを達成するためにも使用できます- set_fact: untagged_run=true
tags: untagged
コマンドライン変数(--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
れていない場合、エラーなしで再生が実行されます。
thorough | default('no') | bool
。
when: thorough is defined and thorough
、その構文を好む場合
is defined and
構文をもっと愛してください。私が感じていない複数のパイプは直感的です。
タグを指定しないと実行されないような誤って実行されるタスクから保護するために、条件を使用できます。このメソッドの注意点は、追加の変数を定義しないと、プレイがエラーになり失敗することです。
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)
...
thorough | default("false") | match("true")
。デフォルトはである必要はなくfalse
、一致しないものだけですが、true
読みやすさが向上します。
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
はい。--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
ansible-playbook
オプションを使用することで動作を実現できますが、OPは、特定のタグがansible-playbook
コマンドに明示的に追加されない限り実行されないようにタスクに注釈を付ける方法を求めていると思います。
特別なタグ- "never"があります。これは、タグが特に要求されない限り、タスクの実行を防ぎます。
tasks:
- debug: msg='{{ showmevar}}'
tags: [ 'never', 'debug' ]
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にコミットして意図を記録できます。
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」が含まれる場合にのみ実行されます
で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に戻すTrue
a があります。set_fact
False
tags
ansible-playbook
タグを指定すると、そのin_tag
ままでタスクが実行されます。True
fail
PS:必要なタスクにロジックを追加できます
PS2:ロジックを拡張し、所有しているすべてのタグをハードコードset_fact: in_tag_blah=True
してtags: ["blah"]
、もちろん組み合わせて使用することもできます。