web-dev-qa-db-fra.com

ansible parse text string from stdout

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.

6
TonyNguyen

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 }}
11
Konstantin Suvorov

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.

1
MNA