Điểm:0

Ansible - sự cố với vòng lặp và json_query's

lá cờ gb

Tôi đang sử dụng mô-đun URI ansible để giao tiếp với api REST. Tôi có nhiệm vụ thực hiện GET để lấy cho tôi một số dữ liệu mà tôi muốn sử dụng sau này. Tôi muốn có thể khớp một biến nhất định từ GET để tạo đường dẫn thực hiện PUT trên api REST. mã của tôi là như sau

vở kịch

*host_vars/host.yml *

---
đầu vào:
  - tiêu đề: "test_input_api"
    gõ: "org.graylog2.inputs.syslog.udp.SyslogUDPInput"
    toàn cầu: sai
    cấu hình:
      allow_override_date: sai
      bind_address: "0.0.0.0"
      expand_structed_data: sai
      force_rdns: sai
      số_nhân_viên: 8
      override_source: null
      cổng: 5999
      recv_buffer_size: null
      store_full_message: true
  - tiêu đề: "test_input_api_2"
    gõ: "org.graylog2.inputs.syslog.udp.SyslogUDPInput"
    toàn cầu: sai
    cấu hình:
      allow_override_date: sai
      bind_address: "0.0.0.0"
      expand_structed_data: sai
      force_rdns: sai
      số_nhân_viên: 8
      override_source: null
      cảng: 5998
      recv_buffer_size: null
      store_full_message: true

playbook.yml

---
- name: Cấu hình hệ thống
  máy chủ: greylog
  kết nối: cục bộ
  thu thập_sự kiện: không
  vai trò:
    - greylog/đầu vào

vai trò/graylog/đầu vào/tác vụ/main.yml

---
- bao gồm_tác vụ: get_inputs.yml
- bao gồm_tác vụ: put_inputs.yml

vai trò/graylog/đầu vào/tác vụ/get_inputs.yml

--- 
- tên: "API NHẬN Đầu vào hệ thống"
    bạn:
      url: http://{{ ansible_host }}:9000/api/system/inputs
      url_username : "{{system.users.triple_admin.api_token }}"
      url_password: mã thông báo
      phương pháp: NHẬN
      return_content: có
    đăng ký: get_graylog_inputs

- tên: Set Fact
  set_fact:
    get_input_id: "{{ get_graylog_inputs.content | from_json | json_query('inputs[?title == `{}`] | [0].id '.format(input.title)) }}"
  vòng lặp: "{{đầu vào}}"
  loop_control:
    loop_var: đầu vào

vai trò/graylog/đầu vào/tác vụ/put_inputs.yml

---
  - tên: "Đầu vào hệ thống API PUT"
    bạn:
      url: http://{{ ansible_host }}:9000/api/system/inputs/{{ get_input_id }}
      url_username : "{{system.users.triple_admin.api_token }}"
      url_password: mã thông báo
      tiêu đề:
        X-Requested-By: X-Ansible
      phương pháp: ĐẶT
      body_format: json
      body: "{{ tra cứu('template', 'templates/post_template.j2') }}"
      status_code: 201
      return_content: có
    vòng lặp: "{{đầu vào}}"
    loop_control:
      loop_var: đầu vào

vấn đề có thể xảy ra

Một câu lệnh lặp kép trong vở kịch

Như bạn có thể thấy trong get_inputs.yml tôi làm một vòng lặp trên đầu vào dict trong host_vars trong tác vụ set_fact để lấy ID từ API REST cho mỗi mục nhập đầu vào được xác định trong host_vars phù hợp với tiêu đề.

Ý tưởng đằng sau điều này là khi tôi muốn thay đổi điều gì đó về mục nhập đầu vào, tôi có thể thực hiện PUT để tạo đường dẫn trong tác vụ put_inputs.yml biến URL đến đầu vào có id được thu thập bằng GET và được tác vụ get_facts đặt thành thực tế, sau đó phát tác vụ PUT cho api còn lại và điều chỉnh một số tham số.

Nhưng tôi cũng cần thực hiện một vòng lặp tương tự đầu vào dict trong host_vars trong put_inputs.yml bởi vì nếu có thay đổi đối với nhiều mục nhập, tôi muốn lặp lại PUT.

Vấn đề là get_facts nhận cả hai giá trị id như hiển thị bên dưới, chỉ có giá trị cuối cùng được đăng ký là thực tế vì đó là một vòng lặp và chúng có cùng tên.

    "ansible_facts": {
        "get_input_id": "61015085eca1554750236084",
        "get_input_titles": "kiểm tra_input_api"
    },
    "ansible_facts": {
        "get_input_id": "610282d0eca155475024ac91",
        "get_input_titles": "kiểm tra_input_api_2"

Vì vậy, khi put_inputs.yml nhiệm vụ được chơi (sau khi get_inputs.yml) Tôi kết thúc với phản hồi sau từ vở kịch, tóm lại là cả hai lần nhiệm vụ đang được phát ( theo vòng lặp ) tôi đều nhận được như vậy get_input_id giá trị.

vòng 1 - điều này cần phải được khớp với tiêu đề và do đó nhận id "61015085eca1554750236084"

        "tiêu đề": "test_input_api",
            "url": "http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91",

vòng 2

        "tiêu đề": "test_input_api_2",
            "url": "http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91",

Câu hỏi

Tôi cần lấy ID từ GET vì nó cần có trong URL trong tác vụ PUT để chỉnh sửa mục nhập "đầu vào" cụ thể. Nhưng vì tôi cần khớp ID với Tiêu đề nên tôi cần thực hiện một vòng lặp nhưng điều này như tôi đã nói trước đây dẫn đến việc chỉ nhận được một giá trị ID như một thực tế đang được sử dụng trong vòng lặp PUT cho tất cả các mục trong đầu vào dict đây là không phải thứ tôi cần vì tôi cần có thể chỉnh sửa riêng từng mục nhập dựa trên ID.

Mọi sự giúp đỡ đều được chào đón!

Zeitounator avatar
lá cờ fr
Chào. Vui lòng không đăng chéo [cùng một câu hỏi](https://stackoverflow.com/questions/68587692/ansible-issue-with-loop-and-json-querys) trên các trang web stackexchange khác nhau. Chọn một trong đó là thích hợp nhất.

Đă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.