在Ansible中将属性文件读入字典

时间:2019-03-07 14:15:57

标签: ansible

我有一个键=值格式的属性文件
例如。 File.properties
context.root=ServerName http.port=1542 db.user=abc db.password=xyx

我想将此属性文件作为字典加载。我可以一次读取一个键值,例如
vars: db.user: "{{ lookup('ini', 'db.user type=properties file=File.properties') }}"

但是我不想单独获取每个值,而是希望将所有键值对作为ansible的字典加载。加载后,我将如何使用它来检索各个键的值。

2 个答案:

答案 0 :(得分:0)

ini查询旨在返回,而不是全部内容。要将属性设为dict,则需要解析整个文件。我可以想象两种不同的方法,具体取决于您的.properties文件的复杂程度:

  1. 首先获取密钥,然后在循环中询问现有的ini查找的值
  2. 以简单的方式将.properties文件转换为dict;如果您有换行符或Unicode转义符或其他类似的东西,这将不起作用

首先,类似:

 - debug: var=the_dict
   vars:
     the_dict: >-
      {%- set results = {} -%}
      {%- set keys = lookup("file", "File.properties").split("\n")
       | map("regex_replace", "^([^=]+)=.*", '\\1')
       | list -%}
      {%- for k in keys -%}
      {%-   set _ = results.update({k: lookup("ini", k+" type=properties file=File.properties")}) -%}
      {%- endfor -%}
      {{ results | to_json }}

第二点,您可以利用yaml的语法如此自由的事实:

 - debug:
     msg: >-
      {{ lookup("file", "File.properties").split("\n")
       | map("regex_replace", "^([^=]+)=(.*)", '"\1": "\2"')
       | join("\n")
       | from_yaml }}

答案 1 :(得分:0)

我有一个目录,我在其中保存一些文件,包括脚本,业务流程文件和不友好的员工。 config / ,用于保存全局配置文件并在不同工具之间共享。这些配置文件是 key = value 对(属性文件),我不想创建yaml配置文件,因为其他一些工具无法处理它。

要使Ansible使用此类配置文件,我使用下一种方法:

  • 正在 localhost
  • 上读取和处理配置文件
  • 使用 sed在shell中,将其重新格式化为Yaml格式,并通过 register
  • 以文本形式存储在变量中
  • 通过使用过滤器 from_yaml 从文本中读取 到set_fact中的某些变量 X
  • 带有属性文件中变量的字典可通过 hostvars.localhost.X.PROPERTY
  • 在其他节点上访问

sed模式由两部分组成:

  1. /^ *$/d-删除空行

  2. s@^\(.*\)=\(.*\)$@\1\ :\ "\2"@g-抓取从行开始到“ =”的所有内容作为捕获组1,将其他所有内容捕获到捕获组2。将行重新格式化为: group_1:“ group_2” < / p>

# Assuming that my property file config/tools_config has line:
# MOUNT_POINT=/mnt/shared

# Playbook
- hosts: localhost
  tasks:
  - name: "Reformat configuration file"
    shell: sed '/^ *$/d;s@^\(.*\)=\(.*\)$@\1\ :\ "\2"@g' ../config/tools_config
    args:
      warn: false
    register: result

   - name: "Load configuration"
     set_fact:
       cfg: "{{ result.stdout | from_yaml }}"

- hosts: Y
  roles:
  - X

# roles/X/tasks/main.yaml
...
path: "{{ hostvars.localhost.cfg.MOUNT_POINT }}"