web-dev-qa-db-ja.com

標準出力からのansible解析テキスト文字列

私の問題は、標準化および解析可能な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として定義しています。

10
TonyNguyen

あなたはとても近いです。 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は、見つかった一致のリストを返すので、最初の1つの使用のみを取得するには:

{{ results.stdout | regex_search(regexp,'\\1') | first }}
17

上記の解決策は私にとってはうまくいきましたが、シェルコマンド出力をフィルタリングして次の行を取得するためにいくつかの追加ロジックを実行する必要がありました

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

vaultコマンドの出力には多くの行が含まれているためです。この行がキャプチャされると、Konstantinが提供するソリューションは問題なく機能します。以下は、1か所で行う必要があるすべてのことです。

 - 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コマンドの値ですべての変数を置き換えてください。

2
MNA