下面是我的 JSON 檔案:
[
{
"?xml": {
"attributes": {
"encoding": "UTF-8",
"version": "1.0"
}
}
},
{
"domain": [
{
"name": "mydom"
},
{
"domain-version": "12.2.1.3.0"
},
{
"server": [
{
"name": "AdminServer"
},
{
"ssl": {
"name": "AdminServer"
}
},
{
"listen-port": "12400"
},
{
"listen-address": "mydom.host1.bank.com"
}
]
},
{
"server": [
{
"name": "myserv1"
},
{
"ssl": [
{
"name": "myserv1"
},
{
"login-timeout-millis": "25000"
}
]
},
{
"log": [
{
"name": "myserv1"
},
{
"file-name": "/web/bea_logs/domains/mydom/myserv1/myserv1.log"
}
]
}
]
},
{
"server": [
{
"name": "myserv2"
},
{
"ssl": {
"name": "myserv2"
}
},
{
"reverse-dns-allowed": "false"
},
{
"log": [
{
"name": "myserv2"
},
{
"file-name": "/web/bea_logs/domains/mydom/myserv2/myserv2.log"
}
]
}
]
}
]
}
]
我需要使用 ansible 代碼獲取日志串列name,file-name如下所示。
myserv1_log: "/web/bea_logs/domains/mydom/myserv1/myserv1.log"
myserv2_log: "/web/bea_logs/domains/mydom/myserv2/myserv2.log"
我面臨兩個挑戰。
server可能并不總是domain陣列的第三個鍵。log陣列可能并不總是所有server陣列的鍵,因此不應列印。例如。server名稱 AdminServer 沒有任何log串列,而 myserv1 和 myserv2 有。
我需要一個 ansible 代碼來列印動態變化的 json 所需的代碼。
注意:server將始終是domain陣列中的鍵
我在這里發布參考我的類似查詢:無法理想地決議 ansible 中的 json 檔案
請建議。
uj5u.com熱心網友回復:
您只需測驗兩個鍵是否存在:
- hosts: localhost
gather_facts: no
vars:
json: "{{ lookup('file', './file.json') | from_json }}"
tasks:
- name: display
debug:
msg: "name: {{ servername }} --> filename: {{ filename }}"
loop: "{{ json[1].domain }}"
vars:
servername: "{{ item.server.0.name }}_log"
filename: "{{ item['server'][2]['log'][1]['file-name'] }}"
when: item.server is defined and item.server.2.log is defined
結果:
TASK [display]
skipping: [localhost] => (item={'name': 'USWL1212MRSHM01'})
skipping: [localhost] => (item={'domain-version': '12.2.1.3.0'})
skipping: [localhost] => (item={'server': [{'name': 'AdminServer'}, {'ssl': {'name': 'AdminServer'}}, {'listen-port': '12400'}, {'listen-address': 'myhost1'}]})
ok: [localhost] => (item={'server': [{'name': 'myserv1'}, {'ssl': {'name': 'myserv1'}}, {'log': [{'name': 'myserv1'}, {'file-name': '/web/bea_logs/domains/mydom/myserv1/myserv1.log'}]}]}) => {
"msg": "name: myserv1_log --> filename: /web/bea_logs/domains/mydom/myserv1/myserv1.log"
}
ok: [localhost] => (item={'server': [{'name': 'myserv2'}, {'ssl': {'name': 'myserv2'}}, {'log': [{'name': 'myserv2'}, {'file-name': '/web/bea_logs/domains/mydom/myserv2/myserv2.log'}]}]}) => {
"msg": "name: myserv2_log --> filename: /web/bea_logs/domains/mydom/myserv2/myserv2.log"
}
如您所見,當條件不成立時,將跳過該操作...
您可以通過僅測驗 key 來簡化log,因為在您的情況下, keylog始終鏈接到 keyserver
when: item.server.2.log is defined
uj5u.com熱心網友回復:
鑒于資料
mydata:
- ?xml:
attributes:
encoding: UTF-8
version: '1.0'
- domain:
- name: USWL1212MRSHM01
- domain-version: 12.2.1.3.0
- server:
- name: AdminServer
- ssl:
name: AdminServer
- listen-port: '12400'
- listen-address: myhost1
- server:
- name: myserv1
- ssl:
name: myserv1
- log:
- name: myserv1
- file-name: /web/bea_logs/domains/mydom/myserv1/myserv1.log
- server:
- name: myserv2
- ssl:
name: myserv2
- log:
- name: myserv2
- file-name: /web/bea_logs/domains/mydom/myserv2/myserv2.log
使用json_query選擇屬性日志
_logs: "{{ mydata|json_query(_query) }}"
_query: '[].domain[][].server[].log'
給
_logs:
- - name: myserv1
- file-name: /web/bea_logs/domains/mydom/myserv1/myserv1.log
- - name: myserv2
- file-name: /web/bea_logs/domains/mydom/myserv2/myserv2.log
接下來,組合專案并使用items2dict創建字典
logs_dict: "{{ _logs|map('combine')|list|
items2dict(key_name='name', value_name='file-name') }}"
給出預期的結果
logs_dict:
myserv1: /web/bea_logs/domains/mydom/myserv1/myserv1.log
myserv2: /web/bea_logs/domains/mydom/myserv2/myserv2.log
適當放置變數,例如
- hosts: localhost
vars:
mydata: "{{ lookup('file', 'test-658-data.yml')|from_yaml }}"
_logs: "{{ mydata|json_query(_query) }}"
_query: '[].domain[][].server[].log'
logs_dict: "{{ _logs|map('combine')|list|
items2dict(key_name='name', value_name='file-name') }}"
tasks:
- debug:
var: logs_dict
Q:名字不是日志的名字而是服務器的名字
A:一般選擇鍵和值,結合字典。下面的運算式給出相同的結果
mydata: "{{ lookup('file', 'test-658-data.yml')|from_yaml }}"
_logs: "{{ mydata|json_query(_query) }}"
_query: '[].domain[][].server'
_arr: "{{ _logs|map('combine')|
selectattr('name', 'defined')|
selectattr('log', 'defined') }}"
_names: "{{ _arr|map(attribute='name')|list }}"
_files: "{{ _arr|map(attribute='log.1.file-name')|list }}"
logs_dict: "{{ dict(_names|zip(_files)) }}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443926.html
