当前位置: 首页 > 面试题库 >

在ansible中修改json的最佳方法

田信然
2023-03-14
问题内容

我有一个变量(通过set_fact)包含一个json字符串:

{
  "PolicyVersion": {
    "CreateDate": "2017-08-07T02:48:05Z",
    "Document": {
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:iam::123456789123:role/Root_Update_svcacct",
            "arn:aws:iam::123456789123:role/Root_Delete_svcacct",
            "arn:aws:iam::123456789123:role/Root_Create_svcacct",
            "arn:aws:iam::123456789123:role/Root_Full_svcacct",
            "arn:aws:iam::987654321987:role/Member1_Create_svcacct",
            "arn:aws:iam::987654321987:role/Member1_Update_svcacct",
            "arn:aws:iam::987654321987:role/Member1_Delete_svcacct",
            "arn:aws:iam::987654321987:role/Member1_Full_svcacct"
          ]
        }
      ],
      "Version": "2012-10-17"
    },
    "IsDefaultVersion": true,
    "VersionId": "v2"
  }
}

在“资源”数组中插入更多元素的最佳方法是什么?

"arn:aws:iam::001122334455:role/Member1_Create_svcacct",
"arn:aws:iam::001122334455:role/Member1_Update_svcacct",
"arn:aws:iam::001122334455:role/Member1_Delete_svcacct",
"arn:aws:iam::001122334455:role/Member1_Full_svcacct"

我正在探索将变量转储到文件中,并使用外部shell工具插入所需的块,这似乎并不好。


问题答案:

我不知道 最好的
方法,但是一种选择是编写一个简单的库模块来为您处理更新的机制。您可以使用该jsonpointer模块来查找要修改的数据,然后将修改后的对象返回到ansible。起点可能看起来像:

#!/usr/bin/python

from ansible.module_utils.basic import AnsibleModule

import json

try:
    import jsonpointer
except ImportError:
    jsonpointer = None


def main():
    module = AnsibleModule(
        argument_spec=dict(
            data=dict(required=True, type='dict'),
            pointer=dict(required=True),
            action=dict(required=True,
                        choices=['append', 'extend', 'update']),
            update=dict(type='dict'),
            extend=dict(type='list'),
            append=dict(),
        ),
        supports_check_mode=True,
    )

    if jsonpointer is None:
        module.fail_json(msg='jsonpointer module is not available')

    action = module.params['action']
    data = module.params['data']
    pointer = module.params['pointer']

    if isinstance(data, str):
        data = json.loads(str)

    try:
        res = jsonpointer.resolve_pointer(data, pointer)
    except jsonpointer.JsonPointerException as err:
        module.fail_json(msg=str(err))

    if action == 'append':
        res.append(module.params['append'])
    if action == 'extend':
        res.extend(module.params['extend'])
    elif action == 'update':
        res.update(module.params['update'])

    module.exit_json(changed=True,
                     result=data)


if __name__ == '__main__':
    main()

如果将其放入例如中,则library/json_modify.py可以在像这样的剧本中使用它:

- hosts: localhost
  gather_facts: false
  vars:
    myvar: {
        "PolicyVersion": {
          "CreateDate": "2017-08-07T02:48:05Z",
          "Document": {
            "Statement": [
              {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Resource": [
                  "arn:aws:iam::123456789123:role/Root_Update_svcacct",
                  "arn:aws:iam::123456789123:role/Root_Delete_svcacct",
                  "arn:aws:iam::123456789123:role/Root_Create_svcacct",
                  "arn:aws:iam::123456789123:role/Root_Full_svcacct",
                  "arn:aws:iam::987654321987:role/Member1_Create_svcacct",
                  "arn:aws:iam::987654321987:role/Member1_Update_svcacct",
                  "arn:aws:iam::987654321987:role/Member1_Delete_svcacct",
                  "arn:aws:iam::987654321987:role/Member1_Full_svcacct"
                ]
              }
            ],
            "Version": "2012-10-17"
          },
          "IsDefaultVersion": true,
          "VersionId": "v2"
        }
      }
  tasks:
    - json_modify:
        data: "{{ myvar }}"
        pointer: "/PolicyVersion/Document/Statement/0/Resource"
        action: extend
        extend:
          - "arn:aws:iam::001122334455:role/Member1_Create_svcacct"
          - "arn:aws:iam::001122334455:role/Member1_Update_svcacct"
          - "arn:aws:iam::001122334455:role/Member1_Delete_svcacct"
          - "arn:aws:iam::001122334455:role/Member1_Full_svcacct"
      register: result

    - debug:
        var: result.result

运行该手册和建议的模块的结果是:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "result.result": {
        "PolicyVersion": {
            "CreateDate": "2017-08-07T02:48:05Z", 
            "Document": {
                "Statement": [
                    {
                        "Action": "sts:AssumeRole", 
                        "Effect": "Allow", 
                        "Resource": [
                            "arn:aws:iam::123456789123:role/Root_Update_svcacct", 
                            "arn:aws:iam::123456789123:role/Root_Delete_svcacct", 
                            "arn:aws:iam::123456789123:role/Root_Create_svcacct", 
                            "arn:aws:iam::123456789123:role/Root_Full_svcacct", 
                            "arn:aws:iam::987654321987:role/Member1_Create_svcacct", 
                            "arn:aws:iam::987654321987:role/Member1_Update_svcacct", 
                            "arn:aws:iam::987654321987:role/Member1_Delete_svcacct", 
                            "arn:aws:iam::987654321987:role/Member1_Full_svcacct", 
                            "arn:aws:iam::001122334455:role/Member1_Create_svcacct", 
                            "arn:aws:iam::001122334455:role/Member1_Update_svcacct", 
                            "arn:aws:iam::001122334455:role/Member1_Delete_svcacct", 
                            "arn:aws:iam::001122334455:role/Member1_Full_svcacct"
                        ]
                    }
                ], 
                "Version": "2012-10-17"
            }, 
            "IsDefaultVersion": true, 
            "VersionId": "v2"
        }
    }
}


 类似资料:
  • 什麼是最佳實踐 (Best Practice)? 因為 Ansible 給予開發者那麼大的彈性,隨著參與開發的人數增加,或者專案規模的擴大,若沒有一個參考的標準,很容易產生因為多種撰寫風格的混淆或是結構過於鬆散等因素,最後導致專案最後走向難以維護死胡同裡的情況。其實,現今大部分的程式語言、框架或者開發工具都會提供一套最佳實踐 (best practice) 的文件給開發者們作為設計參考,當然,身為

  • 问题内容: 我需要将JSON对象放入HTML元素的属性中。 HTML不必验证。 昆汀回答: 将JSON存储在有效HTML5 的attribute中。 JSON对象可以是任何大小-即巨大 如果JSON包含特殊字符怎么办? 例如 昆汀回答:按照常规惯例,将JSON字符串放入属性之前,先对其进行编码。 对于PHP,请使用 函数。 编辑-使用PHP和jQuery的示例解决方案 将JSON写入HTML属性:

  • 问题内容: 我想获取目录中的文件列表,但是我想对它进行排序,以使最早的文件排在第一位。我的解决方案是调用File.listFiles并仅基于File.lastModified重新创建列表,但是我想知道是否有更好的方法。 编辑:根据建议,我当前的解决方案是使用匿名比较器: 问题答案: 我认为您的解决方案是唯一明智的方法。获取文件列表的唯一方法是使用File.listFiles(),文档说明这不能保证

  • 问题内容: 要创建一个空的JSON对象,我通常使用: 将null强制转换为对象有效,但是此解决方案是否还有其他更好的方法和/或任何问题? 问题答案: 您的解决方案可以工作。 该文档指定将导致一个空的对象,因此可能有人说您的代码有效,这是使用的方法。 PHP:对象-手册 如果将任何其他类型的值转换为对象,则将创建stdClass内置类的新实例。如果值为NULL,则新实例将为空。 ..但是,请尝试确保

  • 问题内容: 将对象传递给方法后,我想更改其字段之一。在Java中执行此任务的最佳实践是什么? 问题答案: 简单的答案 如其他答案所述,您可以简单地调用setter方法。 更多的哲学答案 通常,在除对象创建范围之外的范围内对对象进行突变可能很危险: http://en.wikipedia.org/wiki/Functional_programming 就是说,在很多情况下,您只想在同一逻辑范围内封装

  • 有一项政策规定,一个项目的税收应该四舍五入到最接近的0.05。因此,1.499应四舍五入至1.5,7.125应四舍五入至7.25。 上述四舍五入要求可以使用以下逻辑实现: 把税加到该项目的成本上就会产生: 我尝试使用BigDecimal而不是float来存储所有的值,并将刻度设置为小数点后2位。这种方法的问题是,如果没有指定舍入策略,bigDecimal将在某些情况下引发异常。为BigDecima