我正在使用ansible进行自动部署。
我需要安装某个软件包是一个漫长的,非标准的,无聊的操作。我想仅在必要时运行相应的任务,即如果之前尚未执行过。
我的计划是让这种安装的最后一步创建一个本地事实:
- name: Flag installed
block:
- file:
path: /etc/ansible/facts.d
state: directory
- copy:
src: mypackage.fact
dest: /etc/ansbile/facts.d/mypackage.fact
mypackage.fact
文件是这样的:
[general]
installed=yes
此时我想将这样的本地事实作为条件使用,所以我可以避免两次运行无聊的程序:
- include: install_boring
when: not(ansible_local.mypackage.general.installed | bool)
显然这会失败,因为ansible_local
未定义。我知道default
过滤器存在,但对于ansible_local
,mypackage
,general
和installed
中的每一个都执行多级默认设置感觉很不舒服。
有没有一种优雅的方法来实现这一目标?
答案 0 :(得分:0)
嗯,它可能是一个肮脏的黑客,但检查文件是否存在似乎可以完成这项工作
- name: Check custom mypackage facts exists
command: grep -q installed /etc/ansible/facts.d/mypackage.fact
ignore_errors: yes
register: mypackage_fact_exists
- name: Prepare MyPackage
when: (mypackage_fact_exists | failed) or not(ansible_local.mypackage.general.installed | bool)
block:
...LOTS OF STUFF HERE...
- name: Flag installed
block:
- file:
path: /etc/ansible/facts.d/
state: directory
- copy:
src: mypackage.fact
dest: /etc/ansible/facts.d/mypackage.fact
答案 1 :(得分:0)
我认为您可以使用设置模块重新加载ansible_local:
- name: "reload ansible_local"
setup:
filter: "ansible_local"
它说:
用于本地ansible事实(* .fact)的路径-该目录中的文件将运行(如果可执行),并且如果文件不是可执行文件,则将其结果添加到ansible_local事实中。