Ansible 我如何循环浏览一系列的dicts及其内容列表

Ansible 我如何循环浏览一系列的dicts及其内容列表,ansible,Ansible,我有以下几点 --- - hosts: all vars: new_service: name: test Unit: - option: Description value: "Testname" Service: - option: ExecStart value: "/usr/bin/python3 -m http.server 8080"

我有以下几点

---

- hosts: all

  vars:
    new_service:
      name: test
      Unit:
      - option: Description
        value: "Testname"
      Service:
      - option: ExecStart
        value: "/usr/bin/python3 -m http.server 8080"
      - option: WorkingDirectory
        value: /home/test/testservice/html
我希望能够使用ini_文件模块创建一个服务模板,以便将上述变量转换为以下ini文件

[Unit]
Description=Testname

[Service]
ExecStart=/usr/bin/python3 -m http.server 8080
WorkingDirectory=/home/test/testservice/html
我想不出如何在这上面循环。我想用product()来循环嵌套列表,也许是这样的

  - name: "Create new unit section of service file"
    ini_file:
      path: "~{{ USERNAME }}/.config/systemd/user/{{ new_service[name] }}"
      section: "{{ item.0 }}"
      option: "{{ item.1.option }}"
      value: "{{ item.1.value }}"
    loop: "{{ ['unit', 'service'] | product({{ new_service[item.0] }})"
但我不相信项是在循环定义本身中定义的


(我之所以选择ini_文件而不是模板,是因为我希望服务文件创建能够根据需要处理任意数量的字段)

您仍然可以使用模板来拥有不同数量的节和选项。在这里使用
循环
ini_文件
对IMO来说是没有效率的。唯一真正的用例是如果您只需要保留文件的原始内容并添加新内容。但是性能将大大低于单个模板,特别是如果您有很多元素的话

我看到的唯一困难是,你的dict中有一个
name
属性,它不是一个章节标题。但这很容易被排除

模板.j2

{% for section in new_service %}
{% if section != 'name' %}
[{{ section }}]
{% for option in new_service[section] %}
{{ option.option }}={{ option.value }}
{% endfor %}

{% endif %}
{% endfor %}
回到原始问题

如果您真的想通过循环路由,这仍然是可能的,但需要在实际数据结构上付出相当大的努力(
loop
/
set\u fact
/…以最终获得单个可循环结构)

如果可能,我会将其更改为以下内容:

new\u服务:
名称:测试
部分:
-部门:单位
选项:
-选项:说明
值:“Testname”
-第节:服务
选项:
-选项:ExecStart
值:“/usr/bin/python3-mhttp.server 8080”
-选项:工作目录
值:/home/test/testservice/html
然后,您可以使用直接循环这个结构。请注意,
“name”
(在顶层)不是一个var,而是服务名称值的字符串标识符,应该这样使用(在下面的示例中修复):

-name:“创建服务文件的新单元部分”
ini_文件:
路径:“~{{USERNAME}/.config/systemd/user/{{{new_service.name}”
节:“{item.0.section}”
选项:“{item.1.option}}”
值:“{item.1.value}}”
循环:{{lookup('subelements',new_service.sections,'options')}

如果需要的话,您也可以轻松地将我的第一个示例模板调整为这个新的数据结构。

谢谢,我不知道模板可以处理这样的循环。我会走这条路。然后我建议您阅读,以便更好地了解ansible在模板模块和其他变量中使用的jinja2模板系统。