2017-08-17 56 views
2

我是新来的Stackoverflow,所以请裸露在我身边。我目前的问题是有理由和解析标准输出。我需要从一个可靠的游戏中捕获标准输出并解析这个输出,以获得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的拱顶产生隐蔽的密钥并保存在ansible变种,所以我可以用它来配置在standalone.xml模板:

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

我需要的方式解析这个字符串可能正则表达式并保存“MASK-5dOaAVafCSd”子到使用set_facts模块或任何其他ansible模块的ansible变种。

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

#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,而不是预期的捕获组。

非常感谢, 托尼N.

+0

请更改您的问题,这是绝对不清楚的。你需要运行一个完整的剧本并解析它的输出吗?或者在剧本中运行一些命令并且只调用该命令的输出? –

+0

您好康斯坦丁,基本上我试图将MASK-5dOaAVafCSd存储到一个变量中。 – TonyNguyen

回答

3

你非常接近。我建议你使用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 }} 
+0

这个作品,谢谢康斯坦丁! :) – TonyNguyen

+0

嘿康斯坦丁,当我在模板模块中使用myvalue var时,例如value = {{myvalue}},它将模板填充为value = [u'MASK-5dOaAVafCSd'] ...?你会碰巧知道这是为什么吗?谢谢 – TonyNguyen

+0

更新了我的答案 –