Я пишу playbook для сбора данных с некоторых сетевых устройств, но теперь мне сложно фильтровать эти данные. Мне нужны только значения из некоторых ключей.
Это полные данные, которые я получаю:
"license": {
"response": {
"@status": "success",
"result": {
"licenses": {
"entry": [
{
"authcode": "11111111",
"description": "Feature A",
"expired": "no",
"expires": "September 10, 2020",
"feature": "Feature A",
"issued": "September 10, 2016",
"serial": "96765555555"
},
{
"authcode": "222222222",
"description": "Feature B",
"expired": "no",
"expires": "September 14, 2020",
"feature": "Feature B",
"issued": "September 14, 2016",
"serial": "77777777777"
Из этого мне просто нужна функция и информация об истечении срока действия, например:
"expires": "September 10, 2020",
"feature": "Feature A",
"expires": "September 14, 2020",
"feature": "Feature B",
Я пытаюсь сделать с регулярным выражением, как показано ниже, но я не могу получить полное значение и его марш только по первому ключу (есть два с одинаковым именем):
set_fact: функция: "{{ (license_output.stdout | regex_search('feature(.+?) '))}}" expires: "{{ (license_output.stdout | regex_search('expires(.+?) '))}}"
отлаживать: сообщение: "{{ функция }}" сообщение: "{{ истекает }}"
Мой текущий код:
set_fact: функция: "{{ (license_output.stdout | regex_search('feature(.+?) '))}}"
expires: "{{ (license_output.stdout | regex_search('expires(.+?) '))}}"
отлаживать: сообщение: "{{ функция }}" сообщение: "{{ истекает }}"
Это ожидаемый результат:
"expires": "September 10, 2020",
"feature": "Feature A",
"expires": "September 14, 2020",
"feature": "Feature B",
Похоже, вы получаете ответ JSON в license_output.stdout
. Нет причин пытаться анализировать это с помощью регулярного выражения, когда вы можете просто искать значения непосредственно в данных json. Рассмотреть возможность:
---
- hosts: localhost
gather_facts: false
vars:
license_output:
stdout: |
{
"license": {
"response": {
"@status": "success",
"result": {
"licenses": {
"entry": [
{
"authcode": "11111111",
"description": "Feature A",
"expired": "no",
"expires": "September 10, 2020",
"feature": "Feature A",
"issued": "September 10, 2016",
"serial": "96765555555"
},
{
"authcode": "222222222",
"description": "Feature B",
"expired": "no",
"expires": "September 14, 2020",
"feature": "Feature B",
"issued": "September 14, 2016",
"serial": "77777777777"
}
]
}
}
}
}
}
tasks:
- debug:
msg:
feature: "{{ item.feature }}"
expires: "{{ item.expires }}"
loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
Это выведет:
TASK [debug] **********************************************************************************
ok: [localhost] => (item=Feature A) => {
"msg": {
"expires": "September 10, 2020",
"feature": "Feature A"
}
}
ok: [localhost] => (item=Feature B) => {
"msg": {
"expires": "September 14, 2020",
"feature": "Feature B"
}
}
Не совсем понятно, что вы хотите делать с этими значениями; вы используете set_fact
в своем примере, но, поскольку есть несколько функций, вы не можете использовать одну переменную с именем feature
или expires
. Один из вариантов примерно такой:
- set_fact:
"expires_{{ item.feature.lower().replace(' ', '_') }}": "{{ item.expires }}"
loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
loop_control:
label: "{{ item.feature }}"
- debug:
msg: "Feature A expires on {{ expires_feature_a }}"
Это создаст переменные с такими именами, как expires_feature_a
и expires_feature_b
. В приведенном выше примере будет выводиться:
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "Feature A expires on September 10, 2020"
}
Другим примером может быть создание словаря, который сопоставляет имена функций с датами истечения срока действия:
- set_fact:
features: "{{ features|default({})|combine({item.feature: item.expires}) }}"
loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
loop_control:
label: "{{ item.feature }}"
- debug:
msg: "Feature {{ item.0 }} expires on {{ item.1 }}"
loop: "{{ features.items() }}"
Это выведет:
TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => (item=[u'Feature B', u'September 14, 2020']) => {
"msg": "Feature Feature B expires on September 14, 2020"
}
ok: [localhost] => (item=[u'Feature A', u'September 10, 2020']) => {
"msg": "Feature Feature A expires on September 10, 2020"
}
Рад, что это сработало! Если это решило вашу проблему, вы можете установить флажок слева от ответа, чтобы указать, что вы принимаете ответ.