regex - 来自标准输出的ansible解析文本字符串

标签 regex string ansible stdout

我的问题是 ansible 和解析标准输出。我需要从 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

这将生成带有以下行的输出,目标是捕获 jboss vault 生成的屏蔽 key 并将其保存在 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') }}"

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

最佳答案

你很亲密。我建议你使用 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

结果:
ok: [localhost] => {
    "myvalue": [
        "MASK-5dOaAVafCSd"
    ]
}

更新:
regex_search返回找到的匹配项列表,因此只获取第一个匹配项:
{{ results.stdout | regex_search(regexp,'\\1') | first }}

关于regex - 来自标准输出的ansible解析文本字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740777/

相关文章:

java - Java 中 String 的性能替代

确认字符串中的字符是 C 中的数组

Ansible:定义 playbook "default"变量,优先于角色,但在库存中可覆盖

python - 在提示时将密码传递给 Python 脚本

java - 获取单引号或空格之间的字符串

python - RegEx 模式未按预期运行

c++ - C++ 程序的异常/错误行为

python - 使用正则表达式从一个字符串中提取字符python

r - 筛选器变量,其列名包含模式

mysql - Ansible mysql 授权