我认为在Ansible中应该是直接的,但是我很难找到一个规范的最佳实践。
在Ansible中,我有一个YAML中的字典列表:
config:
- id: x
value: X
- id: y
value: Y
我想生成一个字符串列表,可以作为一个整体传递给mysql_query模块。
我已经尝试了使用Ansible过滤器的各种优雅的方法,但我想到的最好的方法是在单个模板中生成一个换行符分隔的字符串列表,该列表在config
上迭代,然后在trim | split('n')
上迭代生成单个字符串。
模板:
{% for item in config %}
{{ item.id }} => {{ item.value }}
{% endfor %}
剧本的任务:
set_fact:
converted_items: "{{ lookup('template', './template.j2') | trim | split('n') }}"
但这感觉像一个拼凑。
我在这里错过了什么?
[注意,为了简单起见,这是一个固定的例子]
如果要将字典列表转换为字符串列表,只需使用循环和联合:
- name: vartest
hosts: localhost
vars:
config:
- id: x
value: X
- id: y
value: Y
tasks:
- name: transform value
set_fact:
result: "{{ result | default([]) | union([item.id ~ ' => ' ~ item.value]) }}"
loop: "{{ config }}"
- name: display result
debug:
var: result
等价于并集:result | default([]) + [item.id ~ ' => ' ~ item.value]
结果:
ok: [localhost] => {
"result": [
"x => X",
"y => Y"
]
}
您不必使用文件。将Jinja模板放入本地变量中,例如
- set_fact:
converted_items: "{{ _converted_items|trim|split('n') }}"
vars:
_converted_items: |
{% for item in config %}
{{ item.id }} => {{ item.value }}
{% endfor %}
为
converted_items:
- x => X
- y => Y
如何转换数据有许多选项,例如下面的任务给出相同的结果
- set_fact:
converted_items: "{{ _keys|zip(_vals)|map('join', ' => ')|list }}"
vars:
_keys: "{{ config|map(attribute='id')|list }}"
_vals: "{{ config|map(attribute='value')|list }}"