我有一个键=值格式的属性文件
例如。 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的字典加载。加载后,我将如何使用它来检索各个键的值。
答案 0 :(得分:0)
ini查询旨在返回值,而不是全部内容。要将属性设为dict
,则需要解析整个文件。我可以想象两种不同的方法,具体取决于您的.properties
文件的复杂程度:
ini
查找的值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使用此类配置文件,我使用下一种方法:
sed模式由两部分组成:
/^ *$/d
-删除空行
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 }}"