Python 的 Ansible:解码 JSON 时出错:需要用双引号括起来的属性名称:第 1 行第 2 列(字符 1)

问题描述 投票:0回答:1

在我的 Ansible 配置中,我有以下内容:

new_attributes:
  tenantID: "4234iugob8y8l3-8809yo3x"
  new_attribute2: "value2"

以及我的任务中的以下内容:

"{{ new_attributes | to_json }}"

在我的 Python 脚本中访问它:

    try:
        new_attributes = json.loads(new_attributes)
    except json.JSONDecodeError as e:
        print(f"Error decoding JSON: {e}")
        sys.exit(1)

但我收到以下错误:

"stderr_lines": [],
"stdout": "Error decoding JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)",
"stdout_lines": ["Error decoding JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)"]}

我想知道是否有人可以帮忙解决这个问题

谢谢

更新:

错误输出: 解码 JSON 时出错:需要用双引号括起来的属性名称:第 1 行第 2 列(字符 1)”

以及 ansible 端 to_json 的输出: "msg": "{"tenantID": "4234iugob8y8l3-8809yo3x", "new_attribute2": "value2"}"

这就是我解析Python的方式:

        - name: Debug new_attributes as JSON
          debug:
            msg: "{{ new_attributes | to_json }}"

        - name: Insert data into DynamoDB for client "{{ client_name }}"
          command: >
            python3 dynamodb_insert_or_update.py
            "{{ dynamodb_table_name }}"
            "{{ client_name }}"
            "{{ applicationID }}"
            "{{ new_attributes | to_json }}"
            "{{ aws_region }}"
            "{{ aws_profile }}"
          args:
            chdir: "/mypath/scripts/"
          register: result
          loop: "{{ clients }}"
          loop_control:
            loop_var: item

以及我的完整Python脚本:

import sys
import boto3
import json

def insert_data(dynamodb_table_name, client_name, item_id, new_attributes, aws_region, aws_profile):
    session = boto3.Session(profile_name=aws_profile, region_name=aws_region)
    dynamodb = session.resource('dynamodb')
    table = dynamodb.Table(dynamodb_table_name)

    item = {
        'client_name': client_name,
        'applicationID': item_id
    }

    try:
        new_attributes = json.loads(new_attributes)
    except json.JSONDecodeError as e:
        print(f"Error decoding JSON: {e}")
        sys.exit(1)

    item.update(new_attributes)

    try:
        response = table.put_item(Item=item)
        print(f"Insert successful: {response}")
    except Exception as e:
        print(f"Failed to insert item: {e}")
        sys.exit(1)

# Command-line arguments
dynamodb_table_name = sys.argv[1]
client_name = sys.argv[2]
item_id = sys.argv[3]
new_attributes = sys.argv[4]
aws_region = sys.argv[5]
aws_profile = sys.argv[6]

# Call the insert function
insert_data(dynamodb_table_name, client_name, item_id, new_attributes, aws_region, aws_profile)


python ansible
1个回答
0
投票

调试输出

- name: Debug new_attributes as JSON
    debug:
      msg: "{{ new_attributes | to_json }}"

应该是

"msg": "{\"tenantID\": \"4234iugob8y8l3-8809yo3x\", \"new_attribute2\": \"value2\"}"
(带有转义引号),可以通过
json.loads()
来解析。

检查 Python 命令是否适用于为 Ansible 配置的 Python 版本(使用

ansible --version
找出它是哪一个),Ansible 可能使用的是较旧的 Python。

© www.soinside.com 2019 - 2024. All rights reserved.