【问题标题】:ansible parse text string from stdout来自标准输出的ansible解析文本字符串
【发布时间】:2017-08-17 16:43:02
【问题描述】:

我的问题是 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 生成的屏蔽密钥并将其保存在 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,而不是预期的捕获组。

【问题讨论】:

  • 请重新表述您的问题,这绝对不清楚。你需要运行一个完整的剧本并解析它的输出吗?或者在 playbook 中运行一些命令并只使用该命令的输出?
  • 你好康斯坦丁,基本上我想将 MASK-5dOaAVafCSd 存储到一个变量中。

标签: regex string ansible stdout


【解决方案1】:

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

【讨论】:

  • 嘿 Konstantin,当我在 value={{myvalue}} 等模板模块中使用 myvalue var 时,它会将模板填充为 value=[u'MASK-5dOaAVafCSd']...?你会碰巧知道这是为什么吗?谢谢
【解决方案2】:

上述解决方案对我有用,但是我必须做一些额外的逻辑来过滤 shell 命令输出以到达包含以下内容的行

<vault-option name="KEYSTORE_PASSWORD" value="MASK-6qcNdkIprlA"/>

因为 Vault 命令输出中有很多行。一旦捕获了这条线,康斯坦丁给出的解决方案就可以正常工作。以下是需要在一个地方完成的全部内容。

 - 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

请务必将所有变量替换为您在上述 vault.sh 命令中的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多