在我的 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)
调试输出
- 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。