I want to extract an boolean value from ansible command stdout:
- name: Get Status
ansible.builtin.command:
cmd: "vault status"
register: vault_status
ignore_errors: true
- ansible.builtin.set_fact:
vault_sealed: "{{ (vault_status.stdout | regex_search(regexp,'\\1')) == 'true' }} "
vars:
regexp: "Sealed\\s (. )\\n"
It brings that output
TASK [Get Status] **************************************************************
task path: /ansible/tasks/vault_setup.yml:124
fatal: [vault_instance]: FAILED! => {"changed": true, "cmd": ["vault", "status"], "delta": "0:00:00.071161", "end": "2022-11-11 21:32:06.405020", "msg": "non-zero return code", "rc": 2, "start": "2022-11-11 21:32:06.333859", "stderr": "", "stderr_lines": [], "stdout": "Key Value\n--- -----\nSeal Type shamir\nInitialized true\nSealed true\nTotal Shares 6\nThreshold 3\nUnseal Progress 1/3\nUnseal Nonce 2e079ec7-772f-7811-801e-c098c68c0400\nVersion 1.12.1\nBuild Date 2022-10-27T12:32:05Z\nStorage Type file\nHA Enabled false", "stdout_lines": ["Key Value", "--- -----", "Seal Type shamir", "Initialized true", "Sealed true", "Total Shares 6", "Threshold 3", "Unseal Progress 1/3", "Unseal Nonce 2e079ec7-772f-7811-801e-c098c68c0400", "Version 1.12.1", "Build Date 2022-10-27T12:32:05Z", "Storage Type file", "HA Enabled false"]}
...ignoring
TASK [ansible.builtin.set_fact] ************************************************
task path: /ansible/tasks/vault_setup.yml:130
ok: [vault_instance] => {"ansible_facts": {"vault_sealed": "False "}, "changed": false}
Can anybody tell me, how to get the vault_sealed to the right value "true" ?
Thanks guys !
CodePudding user response:
In case you want to check if there is a match for a string, with the regex_search filter, you don't need any parameter other than the regex.
To determine the end of line, rather use the option multiline=True and end your regex with a $, if you want to search from the beginning of the line, start with a ^.
A successful or unsuccessful matching can be determined with is not none or is none.
In your case, to determine the successful matching of the regex, you have to use is not none.
Your task should work like this:
- ansible.builtin.set_fact:
vault_sealed: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s . $"
If you just want to detect the beginning of the line with the word Sealed followed by a space, you can also write your regex like this: "^Sealed\\s"
If you want to determine whether the word true follows Sealed, then you can choose the regex as: "^Sealed\\s true$"
Your task like this:
- ansible.builtin.set_fact:
vault_sealed: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s true$"
Note: You have to make sure that you don't have a space after your jinja expression (}} "), so it should look like this: }}". Otherwise the result will be interpreted as a string instead of a truth value.
Example Task for string starting with Sealed :
- debug:
msg: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s . $"
vault_status:
stdout: "Sealed some thing."
Result:
TASK [debug] ***************************
ok: [localhost] => {
"msg": true
}
Example Tasks for string Sealed true:
- debug:
msg: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s true$"
vault_status:
stdout: "{{ item }}"
with_items:
- "Sealed true"
- "Sealed true"
- "Sealed false"
- "Some error!"
Result:
TASK [debug] ***********************************************
ok: [localhost] => (item=Sealed true) => {
"msg": true
}
ok: [localhost] => (item=Sealed true) => {
"msg": true
}
ok: [localhost] => (item=Sealed false) => {
"msg": false
}
ok: [localhost] => (item=Some error!) => {
"msg": false
}
