gpt4 book ai didi

python - 在 Ansible 中修改 JSON

转载 作者:行者123 更新时间:2023-12-02 06:41:41 24 4
gpt4 key购买 nike

我有一个管理系统,我们在其中定义维护数据来控制虚拟环境,其中一个选项是不同团队的虚拟机关闭时间范围。现在,当创建新虚拟机时,用户应该从可用的时间范围列表中选择何时可以关闭他/她的虚拟机而不中断工作类次。我需要能够将数据库中的时间范围列表同步到工作模板调查。我陷入了修改 JSON 调查的困境。我已经尝试过这篇文章best way to modify json in ansible但出现错误:

"exception": " File \"/tmp/ansible_1qa8eR/ansible_module_json_modify.py\", line 38, in main\n res = jsonpointer.resolve_pointer(data, pointer)\n File \"/usr/lib/python2.7/site-packages/jsonpointer.py\", line 126, in resolve_pointer\n return pointer.resolve(doc, default)\n File \"/usr/lib/python2.7/site-packages/jsonpointer.py\", line 204, in resolve\n doc = self.walk(doc, part)\n File \"/usr/lib/python2.7/site-packages/jsonpointer.py\", line 279, in walk\n raise JsonPointerException(\"member '%s' not found in %s\" % (part, doc))\n", "msg": "member 'spec' not found in {'stderr_lines': [], 'changed': True, 'end'

这是我正在尝试修改的 JSON:

{
"spec": [
{
"question_description": "",
"min": 0,
"default": "Test text",
"max": 4096,
"required": true,
"choices": "",
"variable": "_t",
"question_name": "Note",
"type": "textarea"
},
{
"required": true,
"min": null,
"default": "",
"max": null,
"question_description": "appliance id",
"choices": "Unconfigured\n600,qvmProcessor/applianceexemptions,all",
"new_question": true,
"variable": "appid",
"question_name": "Appliance ID",
"type": "multiplechoice"
},
{
"required": true,
"min": null,
"default": "",
"max": null,
"question_description": "Select version",
"choices": "1.2.3\n1.2.4\n1.2.5",
"new_question": true,
"variable": "version",
"question_name": "App Version",
"type": "multiplechoice"
},
{
"required": true,
"min": 0,
"default": "",
"max": 1024,
"question_description": "",
"choices": "",
"new_question": true,
"variable": "newVMIP",
"question_name": "IP for new VM",
"type": "text"
},
{
"required": true,
"min": 0,
"default": "",
"max": 1024,
"question_description": "",
"choices": "",
"new_question": true,
"variable": "requesterEmail",
"question_name": "Requester's email",
"type": "text"
},
{
"required": true,
"min": null,
"default": "",
"max": null,
"question_description": "Select the timeframe for automatic VM shutdown. ***NOTE*** EST Time is in 24 hour format",
"choices": "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-02:00",
"new_question": true,
"variable": "powerOFF_TimeFrame",
"question_name": "Power OFF window",
"type": "multiplechoice"
},
{
"required": true,
"min": 0,
"default": 5,
"max": 30,
"question_description": "The VM will be deleted after # of days specified (default=5).",
"choices": "",
"new_question": true,
"variable": "vmNumReservedDays",
"question_name": "Keep VM for # of days",
"type": "integer"
}
],
"description": "",
"name": ""
}

我必须更新时间范围(前一个)选择:

"choices": "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-02:00",

这是我的代码。我可以直接读取变量,但现在我只是将 JSON 保存到文件中:

- name: Sync Power Schedules From Database to Survey Spec
hosts: awxroot
gather_facts: no

vars:
new_choices: {}

tasks:

- name: Set shared directory name
set_fact:
sharedDataPath: /var/tmp/survey

- name: Set shared file path name
set_fact:
sharedDataPathFile: "{{sharedDataPath}}/s.json"

- name: Create directory to share data
file:
path: "{{ sharedDataPath }}"
state: directory

- name: Load Survey Spec to file
shell: 'tower-cli job_template survey 70 > "{{ sharedDataPathFile }}"'



- name: Make sure the survey spec file exists
stat:
path: "{{ sharedDataPathFile }}"
register: isFileExists

- name: Fail if file is not there
fail:
msg: "Cannot find survey spec exported file"
when: isFileExists == False

- name: Read exception file to a variable
command: cat "{{ sharedDataPathFile }}"
register: surveySpec
when: isFileExists.stat.exists == True


- name: Setting key
set_fact:
choices_key: "choices"

- name: Setting new values
set_fact:
choices_value: "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-04:00"

- name: Create dictionary
set_fact:
new_choices: "{{ new_choices | combine({choices_key: choices_value}) }}"


- json_modify:
data: "{{ surveySpec }}"
pointer: "/spec/6/choices"
action: update
update: "{{new_choices}}"
register: result

- debug:
var: result.result

最佳答案

不是对您关于 modify_json 错误的问题的直接回答,而是一个有效的解决方案。

我会选择jq为了那个原因。 jq 是一个轻量级且灵活的命令行 JSON 处理器,几乎可用于每个 Linux 发行版。如果没有,请使用 prebuilt binaries没有依赖项。

正如网站所述:

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

我将你的游戏缩小到最小的工作解决方案,但结果相同。 jq 可执行文件必须位于其运行系统的 PATH 中。请随意根据您的需求进行定制。

---
- name: Sync Power Schedules From Database to Survey Spec
hosts: localhost
gather_facts: no

vars:
choices_key: ".spec[6].choices"
choices_value: "23:00-02:00\n02:00-04:00\n04:00-06:00\n00:00-04:00"
json_file: "{{playbook_dir}}/s.json"

tasks:

- name: "modify json"
command: >
jq "{{choices_key}}=\"{{choices_value}}\"" "{{json_file}}"
register: json

- debug:
var: json.stdout

我认为这作为带有额外 json_modify.py 模块的解决方案更加优雅。有关 jq 的更多信息,请参阅 manual page .

关于python - 在 Ansible 中修改 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53542389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com