如何在Ansible的postgresql_query中传入列表变量作为JSON类型?
解决PostgreSQL JSON列插入的Ansible语法错误
错误原因
你用'{{ contacts }}'传递列表变量时,Ansible会把列表渲染成带单引号的字符串(例如'["test@gmail.com", "test2@gmail.com"]'),而PostgreSQL的json类型要求值是无外层单引号的合法JSON格式,这种带单引号的字符串会被判定为无效JSON,触发语法错误。
修复方案
方案1:直接传递原生列表变量
postgresql_query模块支持直接传入Python原生列表/字典类型,会自动将其序列化为符合PostgreSQL要求的JSON格式,不需要手动添加引号:
- name: Insert to db postgresql_query: db: xxx login_user: xxx login_password: xxx query: INSERT INTO test_table (id, contacts) VALUES (%s, %s) positional_args: - 1 - "{{ contacts }}" # 移除外层单引号
方案2:使用to_json过滤器显式转换(可选)
如果需要确保变量被严格序列化为JSON字符串,可以用Ansible的to_json过滤器,同样不需要加单引号:
- name: Insert to db postgresql_query: db: xxx login_user: xxx login_password: xxx query: INSERT INTO test_table (id, contacts) VALUES (%s, %s) positional_args: - 1 - "{{ contacts | to_json }}"
验证逻辑
执行上述代码后,模块会自动将列表["test@gmail.com", "test2@gmail.com"]转换为PostgreSQL可识别的JSON值,插入到contacts列中,不会再出现引号相关的语法错误。
内容的提问来源于stack exchange,提问作者SNR
相关产品推荐
相关产品推荐

