簡體   English   中英

ansable從stdout解析文本字符串

[英]ansible parse text string from stdout

我的問題是ansible和解析stdout。 我需要從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 ,而不是預期的捕獲組。

你很近。 我建議你使用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 }}

上面的解決方案對我有用,但是我必須做一些額外的邏輯來過濾shell命令輸出以到達包含以下內容的行

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

因為保險庫命令輸出中有許多行。 一旦捕獲到這條線,康斯坦丁給出的解決方案就可以了。 以下是需要在一個地方完成的整個事情。

 - 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命令中的值替換所有變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM