使用Ansible从文件中提取多个字段

时间:2020-06-27 15:34:28

标签: json ansible yaml

我制作了一个有趣的剧本,以便从这个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字符串:

enter image description here

我认为问题在于该文件的结构不佳,我一直在寻找,但我找不到如何获取帐户名,已启用和Rol(注释行是数据工作时的导出) 有人知道如何导出这些字段吗?
('userdata_broadcade'的路由是可以的,因为如果我只在query1上放“ [*]”,它将显示所有数据)

2 个答案:

答案 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
相关问题