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
答案 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以获取示例输出。