Điểm:0

Tự động chuyển json làm tham số trong tác vụ "lệnh"

lá cờ lc

Tôi có nhiệm vụ này trong playbook của mình:

- tên: Cập nhật thẻ phiên bản
    lệnh: cập nhật phiên bản tính toán oci -c {{ ngăn }} --freeform-tags {{ tag_var_json }}

Theo tài liệu tiên tri đối với lệnh này, tham số --freeform-thẻ chấp nhận một json đại diện cho cặp khóa-giá trị cho thẻ. Tôi cần tạo động json này trong chính playbook, vì vậy trước khi chạy tác vụ đó, tôi có cái này cho mục đích thử nghiệm:

  - name: Tạo một đối tượng json để sử dụng làm thẻ
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

Nhưng tôi phải làm gì đó sai vì tôi cứ gặp lỗi này:
gây tử vong: [localhost]: KHÔNG THÀNH CÔNG! => {"thông điệp": "Tác vụ bao gồm một tùy chọn có biến không xác định. Lỗi là: 'tag_var' không xác định

Có cách nào dễ dàng hơn để tạo json trực tiếp trong playbook và chuyển nó làm đối số cho tham số đó không?

Cảm ơn bạn.

anx avatar
lá cờ fr
anx
Khóa YAML phải là duy nhất. Vì vậy, mẫu của bạn là cú pháp không chính xác. Có lẽ bạn muốn đặt biến trong một tác vụ khác?
anx avatar
lá cờ fr
anx
Bạn có thể hiểu sai lỗi là một cái gì đó được trả về từ lệnh của bạn không? Đây là *ansible* đang nói, không phải là trích dẫn của một tin nhắn được trả về từ một số chương trình có tên!
Ress avatar
lá cờ lc
Tôi mới sử dụng ansible nên xin lỗi. Tôi chỉ đang cố gắng chuyển một json dưới dạng lập luận cho một tham số như đã thấy ở trên, nhưng tôi cần xây dựng json đã nói trong cùng một playbook
Điểm:1
lá cờ th

Có hai điều đang diễn ra ở đây. Đầu tiên là bạn đã tạo YAML được trình phân tích cú pháp chấp nhận, nhưng hoạt động theo cách hơi bất ngờ (và sẽ đưa ra cảnh báo trong phiên bản Ansible hiện tại.)

  - name: Tạo một đối tượng json để sử dụng làm thẻ
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

Các khóa trong YAML là duy nhất; khi trình phân tích cú pháp gặp phiên bản thứ hai của cùng một khóa, nó sẽ loại bỏ phiên bản đầu tiên. Vì bạn đã lặp lại set_fact, điều này tương đương với:

  - name: Tạo một đối tượng json để sử dụng làm thẻ
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

Tuy nhiên, sửa lỗi cú pháp sẽ vẫn dẫn đến lỗi.

  - name: Tạo một đối tượng json để sử dụng làm thẻ
    set_fact:
      tag_var: '{ "test": "thisisatest" }'
      tag_var_json: "{{ tag_var | to_json }}"

Các lập luận để set_fact phải được tạo khuôn mẫu trước khi tác vụ chạy, tại thời điểm đó tag_var vẫn chưa được xác định (vì tác vụ này đang xác định nó.)

Một cách chính xác để viết nhiệm vụ này là chia thành hai nhiệm vụ riêng biệt:

  - name: Tạo đối tượng tag
    set_fact:
      thẻ_var:
        kiểm tra: thisisatest

  - name: Tạo chuỗi JSON để gắn thẻ
    set_fact: 
      tag_var_json: "{{ tag_var | to_json }}"

Tuy nhiên, set_fact không bắt buộc ở tất cả. Bạn chỉ có thể đặt var trực tiếp trên tác vụ mà bạn sử dụng nó, điều này vừa hiệu quả hơn vừa làm cho nó có phạm vi chặt chẽ hơn.

- tên: Cập nhật thẻ phiên bản
    lệnh: cập nhật phiên bản tính toán oci -c {{ ngăn }} --freeform-tags "{{ tag_var | to_json }}"
  lọ:
    thẻ_var:
      kiểm tra: thisisatest

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