Получение значения регулярного выражения из ansible stdout

Я хочу извлечь логическое значение из стандартного вывода команды 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»?

Спасибо, парни !

Я думаю, вам будет легче работать с «линейным» представлением: {{ (vault_status.stdout_lines | select("match", "^Sealed") | map("split") | first)[1] }}, при условии, что вы не получите больше пользы от статуса хранилища -json. Также можно заметить, что vault_status.rc задокументирован как «2», что означает, что он запечатан.

mdaniel 12.11.2022 00:13

Привет, не знал, что rc 2 означает запечатанный :-( .... нужно было прочитать документацию :-) .... большое спасибо за эту подсказку!

Wurzelseppi 12.11.2022 10:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите проверить, есть ли совпадение для строки, с фильтром 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
}

Огромный ответ, мой друг..... именно такие ребята, как вы, делают стейк-оверфлоу таким мощным и важным...... У меня больше нет вопросов :-)

Wurzelseppi 12.11.2022 10:28

Другие вопросы по теме