首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ansible中构建JSON对象列表

在Ansible中构建JSON对象列表
EN

Stack Overflow用户
提问于 2020-05-14 00:14:18
回答 2查看 976关注 0票数 0

请原谅可能的重复,但是我也问了这个问题here,但是为了增加可见性而问了这个问题。

我正在尝试用Ansible构建一个JSON对象的数组/列表。我的剧本是通过指定--extra-vars "userids=123456,654321"来调用的。

然后,我尝试使用以下内容构建列表。("TBD“只是一个占位符。我将在后面的实战手册中使用从SQL查询中检索到的数据填充这些值)

代码语言:javascript
运行
复制
- name: Initiate User List
      set_fact:
        all_users: []    

    - name: Add new JSON Objects to List
      set_fact:
        all_users: "{{ all_users+ [{ 'UserID': '{{ item }}', 'UserType': 'TBD', 'UserName': 'TBD' }] }}"
      loop: "{{ userids.split(',') }}"

    - name: Debug
      debug:
        var: all_users

列表有点构建,但它跳过了列表中的第一个项目,而是具有"{{ item }}“。这是结果输出:

代码语言:javascript
运行
复制
TASK [Initiate User List] *************************************************************************************************************************************************************
ok: [localhost]

TASK [Add new JSON Objects to List] ******************************************************************************************************************************************************
ok: [localhost] => (item=123456)
ok: [localhost] => (item=654321)

TASK [Debug] *****************************************************************************************************************************************************************************
ok: [localhost] => {
    "all_users": [
        {
            "UserID": "654321",
            "UserType": "TBD",
            "UserName": "TBD"
        },
        {
            "UserID": "{{ item }}",
            "UserType": "TBD",
            "UserName": "TBD"
        }
    ]
}

我不确定我错过了什么。我尝试在循环任务之前执行"set_fact“,以便首先执行split(),但是没有帮助。我也尝试了"with_items“而不是循环,没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-16 00:25:51

感谢mdaniel的反馈,我结束了学习,我需要删除额外的{{ }}以及项目周围的单引号。我在排除故障时移除了它们中的任何一个,但不是同时移除两个

代码语言:javascript
运行
复制
- name: Initiate User List
      set_fact:
        all_users: []    

    - name: Add new JSON Objects to List
      set_fact:
        all_users: "{{ all_users+ 
               [
                   { 'UserID': item, 
                     'UserType': 'TBD', 
                     'UserName': 'TBD' 
                   }
               ] 
            }}"
      loop: "{{ userids.split(',') }}"
票数 0
EN

Stack Overflow用户

发布于 2020-05-14 13:10:47

这种情况经常出现,这是一个常见问题;不要将嵌套的jinja2模板放在jijna2模板中--它们是python变量,因此您可以这样使用它们。在loop:with_items:中使用set_fact:几乎不是您想要做的事情

代码语言:javascript
运行
复制
- set_fact:
    all_users: >-
       {%- set results = [] -%}
       {%- for u in userids.split(',') -%}
       {%- set _ = results.append({
         'UserID': u,
         'UserType': u_type,
         'UserName': u_name,
       }) -%}
       {%- endfor -%}
       {{ results }}
  vars:
    u_type: TBD
    u_name: TBD
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61779602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档