我制作了一个有趣的剧本,以便从这个json文件中收集数据
{
"validacion_user": {
"stdout_lines": [
"",
"Account name: root",
"Description: root",
"Enabled: No",
"Password Last Change Date: Thu Feb 14 2019 (UTC)",
"Password Expiration Date: Not Applicable (UTC)",
"Locked: No",
"Role: root",
"AD membership: 0-255",
"Home AD: 0",
"Day Time Access: N/A",
"",
"Account name: admin",
"Description: Administrator",
"Enabled: Yes",
"Password Last Change Date: Thu Feb 14 2019 (UTC)",
"Password Expiration Date: Not Applicable (UTC)",
"Locked: No",
"Role: admin",
"AD membership: 0-255",
"Home AD: 0",
"Day Time Access: N/A",
"",
"Account name: user",
"Description: User",
"Enabled: Yes",
"Password Last Change Date: Thu Feb 14 2019 (UTC)",
"Password Expiration Date: Not Applicable (UTC)",
"Locked: No",
"Role: user",
"AD membership: 0",
"Home AD: 0",
"Day Time Access: N/A",
""
]
}
}
这是我写的剧本
---
- name: User, Role and Status Playbook
hosts: localhost
gather_facts: false
tasks:
- name: Obtener Usuario, rol y estado
uri:
url: http://192.168.1.20:80/data_broadcade.json
validate_certs: no
return_content: yes
register: userbroadcade
- debug:
var: userbroadcade
- name: Query broadcad
set_fact:
userdata_broadcade: "{{ userbroadcade.json.validacion_user.stdout_lines | json_query(query1) }}"
vars:
query1: "[*].{User: 'Account Name' ,Rol: Role, Estado: Enabled }"
# - copy: content={{userdata_broadcade | replace('Yes','Activado') | replace('No','Desactivado')}} dest=/root/ansible/broadcade.txt
- name: Debug
debug:
var: userdata_broadcade
但是当我执行剧本时,它会发送一个null和一个Account Name字符串:
我认为问题在于该文件的结构不佳,我一直在寻找,但我找不到如何获取帐户名,已启用和Rol(注释行是数据工作时的导出)
有人知道如何导出这些字段吗?
('userdata_broadcade'的路由是可以的,因为如果我只在query1上放“ [*]”,它将显示所有数据)
答案 0 :(得分:0)
我认为问题在于该文件的结构不像Json
绝对正确,但是几乎 yaml:
-
Account name: root
Description: root
Enabled: No
Password Last Change Date: Thu Feb 14 2019 (UTC)
Password Expiration Date: Not Applicable (UTC)
Locked: No
Role: root
AD membership: 0-255
Home AD: 0
Day Time Access: N/A
-
Account name: admin
Description: Administrator
Enabled: Yes
因此,您可以做一些按摩以将这些行转换为yaml,然后,您可以通过jinja2过滤器或使用您最初尝试的JMESpath,有多种方法来访问这些字典,如果该语法更容易为你
- debug:
var: userdata_broadcade
vars:
userdata_broadcade: >-
{{ userbroadcade.json.validacion_user.stdout_lines
| map("regex_replace", "^", " ")
| map("regex_replace", "^ *$", "- ")
| join("\n")
| from_yaml
}}
答案 1 :(得分:0)
让我们按原样获取文件,然后将密钥放入变量 my_keys 中。例如
=IMPORTFROMWEB(C1;C2)
然后下面的任务选择所需的数据
vars_files:
data_broadcade.json
vars:
my_keys: ['Account name', 'Role', 'Enabled']
给予
- set_fact:
my_dict: "{{ my_dict|default({})|
combine({item: my_values}) }}"
loop: "{{ my_keys }}"
vars:
my_regex: '^{{ item }}:(.*)$'
my_replace: '\1'
my_values: "{{ validacion_user.stdout_lines|
select('match', my_regex)|
map('regex_replace', my_regex, my_replace)|
map('trim')|
list }}"
- debug:
var: my_dict
然后下一个任务将所需的词典列表连接起来
my_dict:
Account name:
- root
- admin
- user
Enabled:
- 'No'
- 'Yes'
- 'Yes'
Role:
- root
- admin
- user
给予
- set_fact:
my_list_length: "{{ my_dict[my_keys.0]|length }}"
- set_fact:
my_list: "{{ my_list|default([]) +
[dict(my_keys|zip(my_values))] }}"
loop: "{{ range(0, my_list_length|int)|list }}"
vars:
my_values: "{{ my_keys|
map('extract', my_dict, [item])|
list }}"
- debug:
var: my_list