当它们可能不存在时使用本地事实(`ansible_local`)

时间:2017-06-16 12:31:59

标签: ansible

我正在使用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_localmypackagegeneralinstalled中的每一个都执行多级默认设置感觉很不舒服。

有没有一种优雅的方法来实现这一目标?

2 个答案:

答案 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事实中。

setup – Gathers facts about remote hosts

相关问题