【发布时间】:2020-04-27 22:09:30
【问题描述】:
在这里与社区联系。我正在处理 Ansible 脚本,并且需要将一些配置数据从设置文件插入 Microsoft SQL Server DB。设置在 XML 中指定。
设置 JSON 文件示例 (ConfigData.json)
{
"ConfigDataXML": "<Settings xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><PathSettings=\"Windows\"></PathSettings></Settings>",
"ConfigDescription": "OS File Config",
"ConfigPermissions": "Readonly"
}
Ansible 数据库插入
- name 'read config file into var'
include_vars:
file: ConfigData.json
name: configData
- name 'add config to DB'
win_shell: "invoke-sqlcmd -username \"{{db_user}}\" -password \"{{db_pass}}\" -Query \"INSERT INTO ConfigData (Data, ConfigId) VALUES ({{ configData.ConfigDataXML}},'{{ item.configId }}')\""
执行上述操作时,INSERT 失败,因为 PowerShell invoke-sqlcmd 返回错误:
A positional parameter cannot be found that accepts argument 'http'
这是由于已在 XML 数据中转义的文字双引号引起的。 PowerShell 要求任何双引号必须先用反引号“`”转义,因此为了使上面的 Config XML 传递 PowerShell 语法规则,它需要在出现转义双引号的地方使用反引号:
"ConfigDataXML": "<Settings xmlns:xsd=`\"http://www.w3.org/2001/XMLSchema`\" xmlns:xsi=`\"http://www.w3.org/2001/XMLSchema-instance`\"><PathSettings=`\"Windows`\"></PathSettings></Settings>"
问题:JSON 文件是静态的,因为它是从另一个系统读取的,因此无法更改。唯一的选择是让 Ansible 脚本解析 XML 字符串并添加反引号。我想知道如何在 Ansible 中实现这一点。
【问题讨论】:
-
你可以试试
regex_replacefilter -
知道搜索词是否需要全局模式标志来匹配所有?例如
/\\\"/g -
SQL-Server 的哪个版本?从 v2016 开始,支持 JSON。您可以按原样传递字符串,使用 JSON 处理内容,将其转换为 XML,然后使用 XML 的方法来完成其余的工作......
-
@zeitounator 更改
{{ configData.ConfigDataXML }}以包含带有反引号{{ configData.ConfigDataXML | regex_replace('\"','`\"') }}的 regex_replace 与我的原始 SQL 查询一起使用 -
@mactwixs 如果这解决了您原来的问题,您应该将其添加为您自己问题的答案并将其标记为已接受(除非已经有更好的问题)。
标签: sql-server xml powershell ansible