如何在 Ansible 中的每个命令中获取事实
How to get facts at each command in Ansible
Ansible 仅在开始时获取事实。但我需要在每个命令中检查事实。
例如:
我需要创建一个目录,然后我需要将文件放到这个目录中。但是 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 以获取示例输出。
Ansible 仅在开始时获取事实。但我需要在每个命令中检查事实。 例如:
我需要创建一个目录,然后我需要将文件放到这个目录中。但是 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 以获取示例输出。