Mon problème est avec ansible et l'analyse syntaxique. J'ai besoin de capturer la sortie standard d'une lecture ansible et d'analyser cette sortie pour une sous-chaîne spécifique dans la sortie standard et de l'enregistrer dans un fichier var. Mon cas d'utilisation spécifique est ci-dessous
- Shell: "vault.sh --keystore EAP_HOME/vault/vault.keystore |
--keystore-password vault22 --alias vault --vault-block |
vb --attribute password --sec-attr 0penS3sam3 --enc-dir |
EAP_HOME/vault/ --iteration 120 --salt 1234abcd"
register: results
become: true
Ceci génère une sortie avec la ligne suivante, l’objectif est de capturer la clé masquée générée par jboss vault et de la sauvegarder dans une variable ansible afin que je puisse l’utiliser pour configurer le modèle standalone.xml:
vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>
J'ai besoin d'un moyen d'analyser cette chaîne avec éventuellement regex et d'enregistrer la sous-chaîne "MASK-5dOaAVafCSd" dans une variable ansible à l'aide du module set_facts ou de tout autre module ansible.
Actuellement, mon code ressemble à ceci
#example stdout
results: vault-option name=\"KEYSTORE_PASSWORD\" value=\"MASK-5dOaAVafCSd\"/>
- name: JBOSS_VAULT:define keystore password masked value variable
set_fact:
masked_value: |
"{{ results.stdout |
regex_replace('^.+(MASK-.+?)\\.+','\\\1') }}"
Ce code définit masked_value comme étant le results.stdout
et non le groupe de capture attendu.
Tu es très proche. Je vous conseille d'utiliser regex101.com pour tester les expressions régulières.
Voici ma solution:
---
- hosts: localhost
gather_facts: no
tasks:
- Shell: echo 'vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"'
register: results
- set_fact:
myvalue: "{{ results.stdout | regex_search(regexp,'\\1') }}"
vars:
regexp: 'value=\"([^"]+)'
- debug:
var: myvalue
résultat:
ok: [localhost] => {
"myvalue": [
"MASK-5dOaAVafCSd"
]
}
Mettre à jour:
regex_search
retourne une liste des correspondances trouvées, donc pour obtenir seulement la première utilisation:
{{ results.stdout | regex_search(regexp,'\\1') | first }}
La solution ci-dessus a fonctionné pour moi, mais j'ai dû faire un peu plus de logique pour filtrer la sortie de commande Shell pour accéder à la ligne qui contient:
<vault-option name="KEYSTORE_PASSWORD" value="MASK-6qcNdkIprlA"/>
parce que la sortie de la commande vault contient de nombreuses lignes. Une fois cette ligne capturée, la solution proposée par Konstantin fonctionne parfaitement. Vous trouverez ci-dessous l’ensemble des tâches à effectuer au même endroit.
- name: Creating jboss vault
Shell: |
{{ baseDir }}/bin/vault.sh -e {{ vaultDir }} -k {{ keystoreURL }} -p {{ keystorePassword }} \
-s {{ keystoreSalt }} -i {{ iterationCount }} -v {{ keystoreAlias }} -b {{ vaultBlock }} \
-a {{ attributeName }} -x {{ attributeValue }}
register: vaultResult
- set_fact:
jbossKeystorePassword: "{{ item | regex_search('value=\"([^\"]+)','\\1') | first }}"
when: item | trim | match('.*KEYSTORE_PASSWORD.*')
with_items:
- "{{ vaultResult.stdout_lines }}"
- debug:
var: jbossKeystorePassword
Assurez-vous de remplacer toutes les variables par vos valeurs dans la commande vault.sh ci-dessus.