私はAnsibleプレイブックを書いていますが、チェックモードでは常に失敗するタスクがあります:
hosts: ...
tasks:
- set_fact: filename="{{ansible_date_time.iso8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
チェックモードでは、ファイルは作成されないため、link
タスクは常に失敗します。チェックモードで実行中にそのようなタスクをスキップするようにマークする方法はありますか?何かのようなもの:
- file: state=link src={{filename}} dest=latest
when: not check_mode
Ansible 2.1は、チェックモードでTrue
に設定されるansible_check_mode
マジック変数をサポートします( official docs )。これは、これを行うことができることを意味します。
- file:
state: link
src: '{{ filename }}'
dest: latest
when: not ansible_check_mode
または
- file:
state: link
src: '{{ filename }}'
dest: latest
ignore_errors: '{{ ansible_check_mode }}'
好きな方。
ある種のハッキーなソリューションは次のとおりです。
hosts: ...
tasks:
- command: /bin/true
register: noop_result
- set_fact: check_mode={{ noop_result|skipped }}
- set_fact: filename="{{ansible_date_time.iso_8601}}"
- file: state=touch name={{filename}}
- file: state=link src={{filename}} dest=latest
when: not check_mode
チェックモードでは、command
タスクがスキップされるため、check_mode
はtrue
に設定されます。チェックモードでない場合、タスクは常に成功し、check_mode
はfalse
に設定されます。
unarchive
でも同じような状況がありました。
アーカイブが存在しない場合、および宛先ディレクトリが存在しない場合(unarchive
の前のステップで実行された場合)、unarchive
はチェックモードで失敗します。 always_run: true
を準備ステップに設定することでこの問題を解決し、チェックモードでも実行されるようにしました。
---
- name: create artifact directory
file: {{ artifact_dest_dir }} state=directory
always_run: true
- name: download artifact on the remote Host
get_url:
url={{ artifact_url }}
dest={{ artifact_dest_dir }}/{{ artifact_filename }}
force=yes
always_run: true
- name: unpack build artifact
unarchive: src={{ artifact_dest_dir }}/{{ artifact_filename }}
dest={{ artifact_dest_dir }}
copy=no
私の場合は動作しますが、時間依存のディレクトリでは、これは良い解決策ではないかもしれません。
受け入れられた答え が既にありますが、 augurar によって言及された解決策は、次のエラーを受け取り続けたため、私にとってはうまくいかなかったことに言及したかったです:skipped expects a dictionary
私のために働いて終わったのは、-e
次のフラグ:
# On the terminal
ansible-playbook [...] --check -e '{"check_mode":true}'
# In the playbook or role
when: [...] and not check_mode
# In the proper `group_vars/` file
check_mode: false
皆さんの意見を聞かせてください!