【问题标题】:Result from Jinja2 template returned as string in AnsibleJinja2 模板的结果在 Ansible 中以字符串形式返回
【发布时间】:2020-05-15 13:38:16
【问题描述】:

我尝试使用 jinja2 模板在 ansible 上设置一个变量。在我的剧本中,我有这个:

- set_fact:
    restart: |
      {% for host in groups['primary'] %}
      {% if hostvars[host].arbiter_host == inventory_hostname_short %}
      {{ restart | combine(hostvars[host].restart | dict2items | selectattr('key', 'regex', 'mongod_\d+$') | list | items2dict) }}
      {% endif %}
      {% endfor %}

- debug:
    var: restart

结果是这个

ok: [my_host] => {
    "restart": "{u'mongod_01': True}\n{u'mongod_02': True}\n"
}

这几乎没问题,但是数据以单个字符串的形式给出。我需要这样的字典:

ok: [my_host] => {
    "restart": {
        "mongod_01": true,
        "mongod_02": true,
    }
}

我几乎尝试了所有方法,但注意到成功了。如何从字符串转换为dict对象?

顺便说一句,当 dict 对象只包含一个项目但它失败了两个或更多时,它工作正常。

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    终于找到了解决办法:

    set_fact:
      restart: |
        {% set services = {} %}
        {% for host in groups['primary'] %}
        {% if hostvars[host].arbiter_host == inventory_hostname_short %}
        {% set _ = services.update(hostvars[host].restart | dict2items | selectattr('key', 'regex', 'mongod_\d+$') | list | items2dict) %}
        {% endif %}
        {% endfor %}
        {{ restart | combine(services) }}
    

    给出想要的结果。

    【讨论】:

      猜你喜欢
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多