我想在jinja循环中为输出变量hostvariabletouseinawxworflow建立一个字符串(我想在awx工作流的后面步骤中使用这个变量w:hosts."{{hostvariabletouseinawxworflow}}"),当我在我的工作流中定义build一个vm时,很容易:hostvariabletouseinawxworflow = vmname: "{{ hostvariabletouseinawxworflow }}".)当我在我的工作流中定义build一个vm时,它很容易:hostvariabletouseinawxworflow = vmname.但是当>1 vms的名字是升序的......像第一台机器的名字还是像输入e. 例如:my-new-vm,但第二台是my-new-vm-2,hostvariabletouseinawxworflow的字符串将是:my-new-vm,my-new-vm-2,以此类推......我如何能在playbook任务中实现这种循环?
Scenario1:
input_vars:
vmcount:1
vmname: my-new-vm
hostvariabletouseinawxworflow should be: my-new-vm
Scenario2:
input_vars:
vmcount:2
vmname: my-new-vm
hostvariabletouseinawxworflow should be: my-new-vm, my-new-vm-2
Scenario3:
input_vars:
vmcount:3
vmname: my-new-vm
hostvariabletouseinawxworflow should be: my-new-vm, my-new-vm-2, my-new-vm-3
下面的任务应该会给你你想要的输出。
- set_fact:
hostvariabletouseinawxworflow: {% for count in range(0, vmcount) %}{% if loop.first%}{{ vmname }}{% else %}{{ vmname }}-{{ loop.index }}{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}
vars:
vmcount: 3
vmname: my-new-vm
返回。
TASK [debug] ********
ok: [localhost] => {
"hostvariabletouseinawxworflow": "my-new-vm, my-new-vm-2, my-new-vm-3"
请注意,为了可读性,可以将 jinja 分割成多行,但如果你在模板文件之外进行操作,处理空格和新行字符会很棘手。
如果你不确定这里的循环是如何分解的,它是被分割出来的。
{% for count in range(0, vmcount) %}
{% if loop.first %}
{{ vmname }}
{% else %}
{{ vmname }}-{{ loop.index }}
{% endif %}
{% if not loop.last %}
,
{% endif %}
{% endfor %}
一个使用 过滤器.这里 [vmname,] +
是专门用来避免产生 my-new-vm-1
.
假设:vmcount为1或更多。
- set_fact:
hostvariabletouseinawxworflow : "{{ ([vmname,] + [vmname,] |
product(range(2, vmcount+1)) |
map('join', '-') | list) |
join(', ') }}"
vars:
vmcount: 3
vmname: my-new-vm
- debug:
var: hostvariabletouseinawxworflow
输出
"hostvariabletouseinawxworflow": "my-new-vm, my-new-vm-2, my-new-vm-3"