我有一个变量(通过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