Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex ansible解析标准输出的文本字符串_Regex_String_Ansible_Stdout - Fatal编程技术网

Regex ansible解析标准输出的文本字符串

Regex ansible解析标准输出的文本字符串,regex,string,ansible,stdout,Regex,String,Ansible,Stdout,我的问题是ansible和解析stdout。我需要从ansible play中捕获stdout,并为stdout中的特定子字符串解析此输出,然后保存到变量中。我的特定用例如下所示 - shell: "vault.sh --keystore EAP_HOME/vault/vault.keystore | --keystore-password vault22 --alias vault --vault-block | vb --attribute passw

我的问题是ansible和解析stdout。我需要从ansible play中捕获stdout,并为stdout中的特定子字符串解析此输出,然后保存到变量中。我的特定用例如下所示

- 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\u 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') }}"

此代码将掩码_值定义为
结果。stdout
,而不是预期的捕获组。

您非常接近。我建议你用它来测试正则表达式

以下是我的解决方案:

---
- 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 }}

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

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

请确保用上述vault.sh命令中的值替换所有变量。

请重新表述您的问题,它绝对不清楚。您是否需要运行一个完整的playbook并分析它的输出?或者在playbook中运行某个命令,只处理该命令的输出?您好Konstantin,本质上我正在尝试将MASK-5dOaAVafCSd存储到一个变量中。嘿,Konstantin,当我在模板模块中使用myvalue变量,例如value={myvalue}时,它会将模板填充为value=[u'MASK-5dOaAVafCSd']。。。?你知道为什么吗?谢谢
 - 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