使用Ansible修改范围中的行

时间:2016-10-04 17:35:28

标签: scope ansible

我需要修改文件中的一行。只有问题,该行出现多次,但在不同的范围内。就像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。 使用模板不是我正在寻找的解决方案,因为我想用它来修改预先存在的服务器而不会丢失任何本地修改。

2 个答案:

答案 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块 但对于一般情况,它应该没问题 甚至尝试是幂等的 - 如果密码相同,它将不匹配块。