我需要修改文件中的一行。只有问题,该行出现多次,但在不同的范围内。就像wso2配置手册中的这个例子一样:
<KeyStore>
<Location>${carbon.home}/resources/security/wso2carbon.jks</Location>
<Type>JKS</Type>
<Password>wso2carbon</Password>
<KeyAlias>wso2carbon</KeyAlias>
<KeyPassword>wso2carbon</KeyPassword>
</KeyStore>
<TrustStore>
<!-- trust-store file location -->
<Location>${carbon.home}/repository/resources/security/client-truststore.jks</Location>
<!-- trust-store type (JKS/PKCS12 etc.) -->
<Type>JKS</Type>
<!-- trust-store password -->
<Password>wso2carbon</Password>
</TrustStore>
我需要例如在<Password>
范围内使用一个值修改<Keystore>
条目,并在<TrustStore>
范围内使用第二个不同的值来修改不同的密码。 lineinfile模块能做到吗?或者还有其他方法吗?
PS。 使用模板不是我正在寻找的解决方案,因为我想用它来修改预先存在的服务器而不会丢失任何本地修改。
答案 0 :(得分:0)
Ansible lineinfile
regex
参数可以匹配多行。除此之外没有任何问题,正则表达式将是漫长的,难以理解和维护。
当你试图操纵XML
ansible-xml模块可能是解决这个问题的一个很好的选择。
答案 1 :(得分:0)
您无法使用lineinfile执行此操作,因为它会单独处理文件的每一行 - 因此不存在其他行的上下文。
lineinfile
中的正则表达式不是多行的。
您可以使用replace - 它使用多行正则表达式 例如:
- replace:
backup: yes
dest: config.xml
regexp: '(<{{ item.scope }}>[\S\s]*<Password>)(?!{{ item.password }}<).*(</Password>[\S\s]*</{{ item.scope }}>)'
replace: '\1{{ item.password }}\2'
with_items:
- scope: KeyStore
password: foo
- scope: TrustStore
password: bar
请记住,此解决方案不是防弹的 - 范围名称和密码不应具有任何XML特殊字符或正则表达式序列。此外,我无法确定它如何处理具有相同范围名称的嵌套XML块 但对于一般情况,它应该没问题 甚至尝试是幂等的 - 如果密码相同,它将不匹配块。