when vars set_fact playbook hostvars facts debug scope ansible

scope - vars - ansible when



Modificar una línea en un ámbito con Ansible (2)

Necesito modificar una línea en un archivo. El único problema es que la línea aparece varias veces, pero en diferentes ámbitos. Como en este ejemplo del manual de configuración de 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>

Necesitaría, por ejemplo, modificar la entrada <Password> con un valor en el ámbito <Keystore> , y con un segundo valor diferente en el alcance <TrustStore> para tener diferentes contraseñas. ¿Puede el módulo linefile hacer eso? O hay otra manera ?

PD. Usar una plantilla no es la solución que estoy buscando, ya que me gustaría usar esto para modificar servidores preexistentes y no perder ninguna modificación local.


No puede hacer esto con el archivo de línea , ya que maneja cada línea del archivo por separado, por lo que no es posible el contexto de otras líneas.
Regex en lineinfile no es multilínea.

Puede usar replace - usa multiline regex.
Por ejemplo:

- 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

Tenga en cuenta que esta solución no es a prueba de balas: los nombres del alcance y la contraseña no deben tener ningún carácter especial de XML o secuencias de expresiones regulares. Además, no puedo decir con certeza cómo maneja los bloques XML anidados con el mismo nombre de ámbito.
Pero para casos generales, debería estar bien.
Incluso hay un intento de ser idempotente: no coincidirá con un bloque si la contraseña es la misma.


lineinfile parámetro regex lineinfile Ansible puede coincidir con varias líneas. No hay problema en eso además de que la expresión regular sería larga y difícil de entender y mantener.

Como está tratando de manipular XML , el módulo ansible-xml podría ser una buena opción para resolver este problema.