web-dev-qa-db-ja.com

チェックモードで実行中にAnsibleタスクをスキップしますか?

私は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
43
augurar

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 }}'

好きな方。

45

ある種のハッキーなソリューションは次のとおりです。

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_modetrueに設定されます。チェックモードでない場合、タスクは常に成功し、check_modefalseに設定されます。

11
augurar

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

私の場合は動作しますが、時間依存のディレクトリでは、これは良い解決策ではないかもしれません。

2
almightyData

受け入れられた答え が既にありますが、 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

皆さんの意見を聞かせてください!

0
Michael Loo