Ansible:使用循环变量的序列范围

时间:2019-07-15 22:14:34

标签: ansible

我需要根据名称和包含要创建的文件数的变量创建一定数量的systemd单元文件,例如:

app-name@1.service
app-name@2.service
app-name@3.service

script-name@1.service
script-name@2.service
script-name@3.service
script-name@4.service

它与使用范围函数的嵌套循环一起工作,但我不了解如何将循环变量(item.1.workers)用于range()参数。

- hosts: localhost
  vars:
    apps:
        - name: app-name
          workers: 3
        - name: script-name
          workers: 5
  connection: local
  tasks:

  - name: test
    debug:
      msg: "{{ item.1.name }}@{{ item.0 }}.service"
    loop: "{{ range(1, 3) | product(apps) | list }}"

1 个答案:

答案 0 :(得分:0)

让我们在第一个任务中创建 workers 的列表,并在第二个任务中与 subelements 循环

- set_fact:
    apps1: "{{ apps1|default([]) +
               [{'name': item.name,
                 'workers': range(1, item.workers + 1)|list}] }}"
  loop: "{{ apps }}"
- debug:
    msg: "{{ item.0.name }}@{{ item.1 }}.service"
  loop: "{{ apps1|subelements('workers') }}"

给予

  msg: app-name@1.service
  msg: app-name@2.service
  msg: app-name@3.service
  msg: script-name@1.service
  msg: script-name@2.service
  msg: script-name@3.service
  msg: script-name@4.service
  msg: script-name@5.service