在检查模式下运行时跳过Ansible任务?

时间:2015-02-25 21:06:07

标签: ansible ansible-playbook

我正在编写一本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

6 个答案:

答案 0 :(得分:44)

Ansible 2.1支持True魔术变量,在检查模式(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 }}'

    gmFrame
        .font("./assets/impact.ttf", fontSize)
        .stroke("#000")
        .strokeWidth(8)
        .draw(`gravity center text ${position.x},${position.y} '${text}'`)
        .stroke("transparent")
        .fill("#fff")
        .draw(`gravity center text ${position.x},${position.y} '${text}'`);

无论你喜欢什么。

答案 1 :(得分:11)

这是一种hacky解决方案:

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

答案 2 :(得分:2)

我与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

它适用于我的情况,但是对于时间相关的目录,这可能不是一个好的解决方案。

答案 3 :(得分:0)

虽然已经有accepted answer,但我想提及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

让我知道你们的想法!

答案 4 :(得分:-1)

您可能只需为所有任务设置when: filename is defined即可。如果不能定义filename,则在正常模式下,您不能失败。

hosts: ...
tasks:
    - set_fact: filename="{{ansible_date_time.iso_8601}}"
    - file: state=present name={{filename}}
      when: filename is defined
    - file: state=link src={{filename}} dest=latest
      when: filename is defined

答案 5 :(得分:-1)

要注意的其他选项是标签或--step选项。

<强>代码

tasks:
    - set_fact: filename="{{ansible_date_time.iso8601}}"
    - file: state=touch name={{filename}}
    - file: state=link src={{filename}} dest=latest
      tags:
        - test

然后要使用的Ansible命令是:

ansible-playbook example.yml --skip-tags "test" --check

还有其他示例可以使用Ansible tags documentation中的代码跳过/指定您要运行的任务。

开始和步骤

Ansible还提供了--step选项的一个很好的逐步调试模式。

正在运行ansible-playbook example.yml --step --check将以交互方式引导您完成游戏手册中的每项任务

Ansible documentation

的“开始和步骤”部分
  

这将导致ansible停止每个任务,并询问它是否应该执行该任务。假设您有一个名为“configure ssh”的任务,那么剧本运行会停止并询问:

     

Perform task: configure ssh (y/n/c):

     

回答“y”将执行任务,回答“n”将跳过任务,回答“c”将继续执行所有剩余任务而不要求。