Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops ansible:在jinja循环中构建字符串_Loops_Ansible - Fatal编程技术网

Loops ansible:在jinja循环中构建字符串

Loops ansible:在jinja循环中构建字符串,loops,ansible,Loops,Ansible,我想在jinja循环中为输出变量hostVariableToseinawxWorFlow构建一个字符串(我想在awx工作流w/:hosts:“{hostVariableToseinawxWorFlow}}”的后面步骤中使用这个变量)。当我在工作流中定义/构建一个vm时,它很容易:hostVariableToseinawxWorFlow=vmname。但是当超过1个虚拟机时,虚拟机的名称将递增。。与第一台机器一样,名称仍然与输入相同,例如my new vm,但第二台机器是my-new-vm-2,H

我想在jinja循环中为输出变量hostVariableToseinawxWorFlow构建一个字符串(我想在awx工作流w/:hosts:“{hostVariableToseinawxWorFlow}}”的后面步骤中使用这个变量)。当我在工作流中定义/构建一个vm时,它很容易:hostVariableToseinawxWorFlow=vmname。但是当超过1个虚拟机时,虚拟机的名称将递增。。与第一台机器一样,名称仍然与输入相同,例如my new vm,但第二台机器是my-new-vm-2,HostVariableToSeinawxWorFlow的字符串是:my new vm,my-new-vm-2等等。。。我如何在剧本任务中进行这种循环

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或更多

输出

"hostvariabletouseinawxworflow": "my-new-vm, my-new-vm-2, my-new-vm-3"

两个都成功了!非常感谢您的精彩回答和宝贵时间。使用awx/tower和创建vsphere VM的通用方法帮助其他人,并在工作流中部署:1.workflow-node:在专用“设置/堡垒”主机上创建带有terraform模块的VM。2.节点:刷新vsphere动态资源清册3。节点:使用set_stats 4-xx设置主机名(如上所述)。将作业模板与--hosts一起使用:“{{hostvariabletouseinawxworflow | default('vsphere_vm_name')}”。vsphere inventory脚本atm的问题是它不读取标记/不从标记创建组,所以我需要这个解决方法。
"hostvariabletouseinawxworflow": "my-new-vm, my-new-vm-2, my-new-vm-3"