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

时间:2016-02-03 10:36:12

标签: ansible ansible-playbook ansible-facts

Ansible只在开始时获取事实。但我需要检查每个命令的事实。 例如:

我需要创建一个目录,之后我需要把文件放到这个目录中。但是ansible得到事实'dir不存在'在开始时,创建dir并且在下一步事实仍然是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

1 个答案:

答案 0 :(得分:1)

我认为你误解了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以获取示例输出。