Điểm:1

trợ giúp json_query - không tạo ra đầu ra như mong đợi

lá cờ cn

Tôi đang cố gắng xây dựng một mảng để sử dụng cho with_nested, nhưng tôi không hiểu tại sao json_query không xuất các máy chủ thực tế được chỉ định cho mỗi cụm:

Chơi:

- tên: Chỉ mục cluster.json
  vỏ: mèo {{ tower_var_path }}/cluster.json
  đăng ký: result_cluster

- tên: Lưu dữ liệu Json vào Biến dưới dạng Sự thật
  set_fact: 
    cluster_jsondata: "{{ result_clusters.stdout | from_json }}"

- gỡ lỗi:
    msg: " {{ cluster_jsondata }}"

- tên: Đặt sự kiện cụm
  set_fact:
    cụm: "{{ cụm|mặc định([]) + [ {
      'tên': mục,
      'máy chủ': mục | json_query('*.hosts[*].name')
       } ] }}"  
  with_items: "{{cụm_jsondata.cluster }}"      

- gỡ lỗi: 
    msg: "{{cụm }}"

dữ liệu cluster.json:

    {
    "cụm": {
        "Cụm_1": {
            "máy chủ": [
                {
                    "thư mục": "/đường dẫn",
                    "tên": "host1.domain.com"
                },
                {
                    "thư mục": "/đường dẫn",
                    "tên": "host2.domain.com"
                }
            ],

        },
        "Cụm_2": {
            "máy chủ": [
                {
                    "thư mục": "/đường dẫn",
                    "tên": "host3.domain.com"
                },
                {
                    "thư mục": "/đường dẫn",
                    "tên": "host4.domain.com"
                }
            ],

        },
    }

Kết quả mong đợi:

NHIỆM VỤ [gỡ lỗi] ************************************************ *************************************************** *************************************************** *********************************************
được rồi: [máy chủ cục bộ] => {
    "tin nhắn": [
        {
            "máy chủ": "host1.domain.com, host2.domain.com",
            "tên": "Cụm_1"
        },
        {
            "máy chủ": "host3.domain.com, host4.domain.com",
            "tên": "Cụm_2"
        }
    ]
}

Kết quả thực tế:

    NHIỆM VỤ [gỡ lỗi] ************************************************ *************************************************** *************************************************** *********************************************
được rồi: [máy chủ cục bộ] => {
    "tin nhắn": [
        {
            "máy chủ": null,
            "tên": "Cụm_1"
        },
        {
            "máy chủ": null,
            "tên": "Cụm_2"
        }
    ]
}
Điểm:2
lá cờ fr

Tóm lại, bạn có thể nhận được kết quả của mình bằng một biểu thức duy nhất mà không cần bất kỳ vòng lặp nào.

Vở kịch sau:

---
- máy chủ: localhost
  thu thập_facts: sai

  lọ:
    # Dữ liệu gốc của bạn trên một dòng để dễ đọc
    result_cụm:
      tiêu chuẩn: >-
        {"cụm":{"Cụm_1":{"hosts":[{"thư mục":"/đường dẫn","tên":"host1.domain.com"},{"thư mục":"/đường dẫn"," name":"host2.domain.com"}]},"Cluster_2":{"hosts":[{"thư mục":"/path","name":"host3.domain.com"},{"thư mục ":"/path","name":"host4.domain.com"}]}}}

  nhiệm vụ:
    - tên: nhận đầu ra dự kiến ​​của tôi từ dữ liệu json trong một tác vụ
      lọ:
        truy vấn: >-
          [].{name: key, hosts: join(', ', value.hosts[].name)}
        cụm: "{{ (result_cluster.stdout | from_json).cluster }}"
      gỡ lỗi:
        msg: "{{cụm | dict2items | json_query(query) }}"

Cung cấp:

CHƠI [máy chủ cục bộ] ************************************************ ********

NHIỆM VỤ [lấy đầu ra dự kiến ​​của tôi từ dữ liệu json trong một tác vụ] *********
được rồi: [máy chủ cục bộ] => {
    "tin nhắn": [
        {
            "máy chủ": "host1.domain.com, host2.domain.com",
            "tên": "Cụm_1"
        },
        {
            "máy chủ": "host3.domain.com, host4.domain.com",
            "tên": "Cụm_2"
        }
    ]
}

TÓM TẮT CHƠI *************************************************** ************
máy chủ cục bộ: ok=1 thay đổi=0 không truy cập được=0 thất bại=0 bỏ qua=0 giải cứu=0 bỏ qua=0

Lưu ý: mặc dù ở trên cung cấp rất chính xác đầu ra mà bạn yêu cầu, nhưng tôi thực sự nghi ngờ rằng bạn đang tìm kiếm một kết quả hơi khác một chút. Thay thế truy vấn trên bằng:

        truy vấn: >-
          [].{name: key, hosts: value.hosts[].name}

sẽ đưa ra cái này thay thế:

NHIỆM VỤ [lấy đầu ra dự kiến ​​của tôi từ dữ liệu json trong một tác vụ] ************************************ *************************************************** *************************************************** ************************************
được rồi: [máy chủ cục bộ] => {
    "tin nhắn": [
        {
            "máy chủ": [
                "host1.domain.com",
                "host2.domain.com"
            ],
            "tên": "Cụm_1"
        },
        {
            "máy chủ": [
                "host3.domain.com",
                "host4.domain.com"
            ],
            "tên": "Cụm_2"
        }
    ]
}

lá cờ cn
Hoàn hảo! Cảm ơn bạn. Khác nhiều so với những gì tôi đang nghĩ, vì vậy bạn có vui lòng cung cấp liên kết đến tài nguyên có thể giải thích cách bạn đến với phương pháp này không?
Zeitounator avatar
lá cờ fr
Tôi khó có thể tìm thấy một liên kết trỏ đến một bản tóm tắt kinh nghiệm của tôi khi xử lý các vấn đề như vậy trong hơn 8 năm qua;) Trong khi đó, ba điểm khởi đầu tốt liên quan đến chủ đề: [bộ lọc dựng sẵn jinja2](https://jinja.palletsprojects .com/en/3.0.x/templates/#list-of-builtin-filters), [bộ lọc ansilble](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html) và [hướng dẫn jmespath ](https://jmespath.org/tutorial.html)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.