Я хочу извлечь логическое значение из стандартного вывода команды ansible:
- 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"
Это приносит этот результат
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}
Может ли кто-нибудь сказать мне, как получить для vault_sealed правильное значение «true»?
Спасибо, парни !
Привет, не знал, что rc 2 означает запечатанный :-( .... нужно было прочитать документацию :-) .... большое спасибо за эту подсказку!
Если вы хотите проверить, есть ли совпадение для строки, с фильтром regex_search вам не нужны никакие параметры, кроме регулярного выражения.
Чтобы определить конец строки, лучше используйте параметр multiline=True
и завершите регулярное выражение знаком $
, если вы хотите искать с начала строки, начните с ^
.
Успешное или неудачное совпадение можно определить с помощью is not none
или is none
.
В вашем случае, чтобы определить успешное совпадение регулярного выражения, вы должны использовать is not none
.
Ваша задача должна работать следующим образом:
- ansible.builtin.set_fact:
vault_sealed: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s+.+$"
Если вы просто хотите определить начало строки со словом Sealed
, за которым следует пробел, вы также можете написать свое регулярное выражение следующим образом: "^Sealed\\s"
Если вы хотите определить, следует ли за Sealed слово true, вы можете выбрать регулярное выражение следующим образом: "^Sealed\\s+true$"
Ваша задача такая:
- ansible.builtin.set_fact:
vault_sealed: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s+true$"
Примечание. Вы должны убедиться, что у вас нет пробела после вашего выражения дзиндзя (}} "
), поэтому оно должно выглядеть так: }}"
. В противном случае результат будет интерпретирован как строка, а не как истинное значение.
Пример задачи для строки, начинающейся с Sealed
:
- debug:
msg: "{{ vault_status.stdout | regex_search(regexp, multiline=True) is not none }}"
vars:
regexp: "^Sealed\\s+.+$"
vault_status:
stdout: "Sealed some thing."
Результат:
TASK [debug] ***************************
ok: [localhost] => {
"msg": true
}
Пример задач для строки 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!"
Результат:
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
}
Огромный ответ, мой друг..... именно такие ребята, как вы, делают стейк-оверфлоу таким мощным и важным...... У меня больше нет вопросов :-)
Я думаю, вам будет легче работать с «линейным» представлением:
{{ (vault_status.stdout_lines | select("match", "^Sealed") | map("split") | first)[1] }}
, при условии, что вы не получите больше пользы от статуса хранилища -json. Также можно заметить, чтоvault_status.rc
задокументирован как «2», что означает, что он запечатан.