【问题标题】:Ansible: build a string in a Jinja loopAnsible:在 Jinja 循环中构建字符串
【发布时间】:2020-05-06 11:05:01
【问题描述】:

我想在 Jinja 循环中为名为 hostvariabletouseinawxworflow 的输出变量构建一个字符串(我想在 Ansible AWX 工作流程的后续步骤中使用此变量,包括:主机:{{ hostvariabletouseinawxworflow }})。

当我在工作流程中只定义/构建一个 VM 时,这很容易:

hostvariabletouseinawxworflow = vmname

但是,当我要构建多个 VM 时,我想在末尾使用升序来命名它们。我希望第一台机器的名称省略数字,只有以下机器名称以数字结尾(所以机器名称的顺序是my-new-vmmy-new-vm-2my-new-vm-3,等等)。所以hostvariabletouseinawxworflow 的值将是:my-new-vmmy-new-vm-2 等等...如何在剧本任务中执行这种循环?

场景 1

input_vars:
  vmcount:1
  vmname: my-new-vm

hostvariabletouseinawxworflow 应该是:my-new-vm

场景 2

input_vars:
  vmcount:2
  vmname: my-new-vm

hostvariabletouseinawxworflow 应该是:my-new-vm, my-new-vm-2

场景 3

input_vars:
  vmcount:3
  vmname: my-new-vm

hostvariabletouseinawxworflow 应该是:my-new-vmmy-new-vm-2my-new-vm-3

【问题讨论】:

    标签: loops ansible


    【解决方案1】:

    以下任务应为您提供所需的输出:

    - 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 %}
    

    【讨论】:

      【解决方案2】:

      使用filters 的方法。 这里[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"
      

      【讨论】:

      • 两者都有效!非常感谢您的出色回答和时间。帮助其他人使用 awx/tower 和创建 vsphere vm 并在工作流中部署:1.workflow-node:在专用的“设置/堡垒”主机上创建带有 terraform 模块的 vms。 2. 节点:刷新 vsphere 动态清单 3. 节点:使用 set_stats 4-xx 设置主机名(如上解决)。将作业模板与以下内容一起使用:--hosts: "{{ hostvariabletouseinawxworflow| default('vsphere_vm_name') }}"。 vsphere 库存脚本 atm 的问题是它读取标签/不从标签创建组,所以我需要这个解决方法。
      猜你喜欢
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2020-10-09
      • 2017-05-31
      相关资源
      最近更新 更多