2017-08-17 55 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

更新了我的答案 –