问题描述
想要在playbook中从一个ini文件中读取变量的值,并且希望在文件未找到或者值在文件中不存在时,能够使play失败。
用户已经找到了用于从ini文件中读取值的ini lookup插件,但是他不清楚如何将其放入一个可以在其他任务中重用的变量中,而不必再次读取它。
用户考虑了以下的方法:
- name: lookup variable from ini
ini:
name: myParam
section: mySection
file: /path_to/ini_file
register: my_variable
但是由于ini不是一个模块,所以这种方法不起作用。
此外,要读取的ini文件位于远程系统上,但是ini插件似乎在控制主机上查找它(从警告“Unable to find ‘/path_to/ini_file’ in expected paths)。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
由于ini lookup插件只能读取控制主机上的本地文件,因此需要在读取和设置变量之前将远程文件获取到本地,并使用set_fact将其内容放入变量中。以下是具体步骤:
1. 获取远程ini文件到本地。
2. 使用set_fact将参数的值存储到变量中。
下面是一个示例playbook:
- block:
- name: "Retrieve remote ini file"
fetch:
src: /path_to/ini_file
dest: /tmp/ansible
- name: "Read and store my value"
set_fact:
my_variable: "{{ lookup( 'ini', 'myParam section=mySection file=/tmp/ansible/{{ inventory_hostname }}/path_to/ini_file' ) }}"
在上面的示例中,我们首先使用fetch模块将远程ini文件获取到本地的/tmp/ansible目录下。然后,使用set_fact将参数的值存储到变量my_variable中。
方案2
使用
delegate_to
关键字可以在委派的主机上运行任务,从而可以在远程主机上查找文件。否则,您可以将文件读入变量并从内存中读取。
另一种方法是使用set_fact
来设置变量时(而不是使用register
来注册任务的结果):
- name: Set myParam from ini
set_fact:
myParam: "{{ lookup('ini', 'section=mySection, file=/path_to/ini_file') }}"
在上面的示例中,我们使用set_fact
将参数的值存储到变量myParam
中。在lookup中,ini
指定了我们使用的lookup插件,section
和file
是传递给lookup的参数,根据其文档。
请注意,ini lookup似乎只在控制主机上查找ini文件,但是如果您想要查找远程主机上的文件,可以使用delegate_to
关键字将任务委派给远程主机,或者将文件读入变量并从内存中读取。
结论
在Ansible中,要从ini文件中设置变量,可以使用ini lookup插件和set_fact模块。如果要读取远程主机上的ini文件,需要先将文件获取到本地,然后使用set_fact将参数的值存储到变量中。另外,可以使用delegate_to
关键字将任务委派给远程主机,或者将文件读入变量并从内存中读取。
以下是一个示例任务,用于打印变量的值:
- debug:
var: my_variable
希望这些解决方案对您有所帮助!