在Ansible中如何从ini文件中设置变量

135次阅读
没有评论

问题描述

想要在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插件,sectionfile是传递给lookup的参数,根据其文档
请注意,ini lookup似乎只在控制主机上查找ini文件,但是如果您想要查找远程主机上的文件,可以使用delegate_to关键字将任务委派给远程主机,或者将文件读入变量并从内存中读取。

结论

在Ansible中,要从ini文件中设置变量,可以使用ini lookup插件和set_fact模块。如果要读取远程主机上的ini文件,需要先将文件获取到本地,然后使用set_fact将参数的值存储到变量中。另外,可以使用delegate_to关键字将任务委派给远程主机,或者将文件读入变量并从内存中读取。
以下是一个示例任务,用于打印变量的值:

- debug:
    var: my_variable

希望这些解决方案对您有所帮助!

正文完