0

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
4

1 回答 1

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、硬盘驱动器、网络等的信息。另请参阅此答案以获取示例输出。

于 2016-02-03T11:02:50.033 回答