我正在编写一本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
答案 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停止每个任务,并询问它是否应该执行该任务。假设您有一个名为“configure ssh”的任务,那么剧本运行会停止并询问:
Perform task: configure ssh (y/n/c):
回答“y”将执行任务,回答“n”将跳过任务,回答“c”将继续执行所有剩余任务而不要求。