ansable从stdout解析文本字符串

Ton*_*yen 11 regex string stdout ansible

我的问题是ansible和解析stdout.我需要从ansible play中捕获stdout并将此输出解析为stdout中的特定子字符串并保存到var中.我的具体用例如下

- 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
Run Code Online (Sandbox Code Playgroud)

这将生成一个带有以下行的输出,目标是捕获jboss vault生成的掩码密钥并将其保存在ansible var中,以便我可以使用它来配置standalone.xml模板:

vault-option name="KEYSTORE_PASSWORD" value="MASK-5dOaAVafCSd"/>

我需要一种方法解析这个字符串可能正则表达式,并使用set_facts模块或任何其他ansible模块将"MASK-5dOaAVafCSd"子字符串保存到ansible var中.

目前我的代码看起来像这样

#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') }}"
Run Code Online (Sandbox Code Playgroud)

此代码将masked_value定义为results.stdout,而不是预期的捕获组.

Kon*_*rov 20

你很近.我建议你使用regex101.com来测试正则表达式.

这是我的解决方案:

---
- 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
Run Code Online (Sandbox Code Playgroud)

结果:

ok: [localhost] => {
    "myvalue": [
        "MASK-5dOaAVafCSd"
    ]
}
Run Code Online (Sandbox Code Playgroud)

更新:

regex_search 返回找到的匹配列表,以便只获得第一个匹配:

{{ results.stdout | regex_search(regexp,'\\1') | first }}
Run Code Online (Sandbox Code Playgroud)