如何在 Ansible 中的每个命令中获取事实

How to get facts at each command in Ansible

A​​nsible 仅在开始时获取事实。但我需要在每个命令中检查事实。 例如:

我需要创建一个目录,然后我需要将文件放到这个目录中。但是 ansible 在开始时获取事实 'dir 不存在',创建 dir 并且在下一步 fact 仍然是 FALSE 并且 ansible 跳过这一步 =(并且仅在第二 运行.

之后执行此步骤

我会尝试 setup 在所有步骤之后再次收集事实,但它不起作用。

我是这样做的:

 - stat: path=/etc/zabbix/scripts/rabbitmq
   register: rmqscriptdir

 - name: Create scripts dir if not exist
   when: rmqscriptdir.stat.exists == False
   shell: mkdir /etc/zabbix/scripts/rabbitmq

 - name: Gathering facts again
   setup:

 - name: Set owner and permissions to rabbitmq directory
   when: rmqscriptdir.stat.exists == True
   file: path=/etc/zabbix/scripts/rabbitmq owner=zabbix group=root mode=0750


 - stat: path=/etc/zabbix/scripts/rabbitmq/api.py
   register: rmqscript_api

 - name: Create api.py if not exist 
   when: rmqscript_api.stat.exists == False and rmqscriptdir.stat.exists == True
   shell: cd /etc/zabbix/scripts/rabbitmq; wget https://raw.githubusercontent.com/jasonmcintosh/rabbitmq-zabbix/master/scripts/rabbitmq/api.py

 - name: Gathering facts again
   setup:

 - name: Set owner and permissions to api.py
   when: rmqscript_api.stat.exists == True
   file: path=/etc/zabbix/scripts/rabbitmq/api.py owner=zabbix group=root mode=0755

我认为您误解了 setup 模块的作用。通过注册一个值,它不会成为事实,当 运行 再次被 setup 模块重新加载时。您的注册值保持不变。如果要再次检查路径是否存在,则不需要重新 运行 setup 模块,而是 stats 模块并再次注册其输出。

但无论如何,Ansible 的想法实际上是不手动检查每个任务是否应该执行。这是 Ansible 会为您处理的事情,Ansible 通常是无能为力的,这意味着无论您 运行 播放多少次,它都会得到相同的结果。

这是一个清理过的版本,它创建了一个文件夹并下载了文件。如果该文件夹已经存在,则第一个任务将不执行任何操作。如果文件 api.py 已经存在,第二个任务将不执行任何操作。

- name: Create scripts dir if not exist
  file:
    path: /etc/zabbix/scripts/rabbitmq
    state: directory
    owner: zabbix
    group: root
    mode: 0750

- name: Create api.py if not exist
  get_url:
    url: https://raw.githubusercontent.com/jasonmcintosh/rabbitmq-zabbix/master/scripts/rabbitmq/api.py
    dest: /etc/zabbix/scripts/rabbitmq/api.py
    owner: zabbix
    group: root
    mode: 0755

PS:如果您想查看 setup 模块重新加载了哪些值,您可以注册它的输出并在调试任务中显示它,如下所示:

- setup:
  register: all_server_facts

- debug:
    var: all_server_facts

这仅包含服务器事实、有关 cpu、硬盘驱动器、网络等的信息。另请参阅 this answer 以获取示例输出。