我的问题是使用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"/>
我需要用可能正则表达式解析此字符串并保存" MASK-5dOaAVafCSd"使用set_facts模块或任何其他ansible模块将substring转换为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
,而不是预期的捕获组。
答案 0 :(得分:12)
你非常接近。我建议你使用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 }}
答案 1 :(得分:2)
上面的解决方案对我有用,但是我必须做一些额外的逻辑来过滤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命令中的值替换所有变量。