Điểm:3

Các biến Ansible tham chiếu chéo trong cùng một ánh xạ

lá cờ co

Làm cách nào tôi có thể xác định một biến Ansible có giá trị là một biến khác trong cùng một cấu trúc ánh xạ?

Để cho phép đặt tên hợp lý cho các biến, tôi đang xác định các cấu trúc ánh xạ như thế này, trong đó một số giá trị phụ thuộc vào các biến khác trong cùng cấu trúc:

tốt:
  danh mục:
    tên máy chủ: "acme-staging-v02.api.letsencrypt.org"
cho phép mã hóa:
  config_dir: "/etc/letsencrypt"
  keys_dir: "{{ letsencrypt.config_dir }}/keys"
  csrs_dir: "{{ letsencrypt.config_dir }}/csr"
  certs_dir: "{{ letsencrypt.config_dir }}/certs"
  account_dir: "{{ letsencrypt.config_dir }}/accounts"
  csr_file: "{{ letsencrypt.csrs_dir }}/{{ site_domain }}.csr"
  account_key_file: "{{ letsencrypt.csrs_dir }}/{{ acme.directory.hostname }}"
  email_address: "chứng chỉ-nhắc nhở@{{ site_domain }}"

Điều này không thành công vì Ansible không thể giải quyết các giá trị tham chiếu đến các giá trị khác trong cùng cấu trúc dữ liệu:

vòng lặp đệ quy được phát hiện trong chuỗi mẫu: {{ letsencrypt.config_dir }}/keys

Vì vậy, tôi nghĩ tra cứu lọ sẽ cho phép trì hoãn giải pháp đó:

tốt:
  danh mục:
    tên máy chủ: "acme-staging-v02.api.letsencrypt.org"
cho phép mã hóa:
  config_dir: "/etc/letsencrypt"
  keys_dir: "{{ tra cứu('vars', 'letsencrypt.config_dir') }}/keys"
  csrs_dir: "{{ tra cứu('vars', 'letsencrypt.config_dir') }}/csr"
  certs_dir: "{{ tra cứu('vars', 'letsencrypt.config_dir') }}/certs"
  account_dir: "{{ tra cứu('vars', 'letsencrypt.config_dir') }}/accounts"
  csr_file: "{{ tra cứu('vars', 'letsencrypt.csrs_dir') }}/{{ site_domain }}.csr"
  account_key_file: >-
    {{ tra cứu('vars', 'letsencrypt.csrs_dir') }}/{{ acme.directory.hostname }}
  email_address: "chứng chỉ-nhắc nhở@{{ site_domain }}"

Điều này không thành công, vì Ansible đang cố giải quyết tra cứu đó ngay lập tức:

Không tìm thấy biến nào có tên này: letsencrypt.config_dir


Tất nhiên tôi có thể tách chúng ra để chúng là các biến riêng biệt. Tuy nhiên, điều đó đánh bại mục đích của tôi là giữ tất cả các biến có liên quan chặt chẽ được nhóm trong cùng một không gian tên.

Vậy điều gì sẽ cho phép tôi xác định cấu trúc dữ liệu sao cho một số giá trị có thể phụ thuộc vào các biến khác trong cùng một cấu trúc?

Michael Hampton avatar
lá cờ cz
Đây là một vấn đề đã tồn tại từ lâu trong Ansible, hãy xem [issue #8603](https://github.com/ansible/ansible/issues/8603) để biết phần thảo luận mở rộng.
Điểm:0
lá cờ co

(Cảm ơn @ michael-hampton đã dẫn đến câu trả lời này.)

Như được mô tả trong Vấn đề ansible#8603, trình phân tích cú pháp cấu hình đang đọc các giá trị biến ngay lập tức cố gắng hiển thị các mẫu mà nó gặp phải khi xác định các biến. Điều này khiến việc phân tích cú pháp không thành công khi một mẫu tham chiếu đến một biến chưa được xác định đầy đủ.

Một nhận xét của ârquelibariâ đưa ra một phân tích tốt:

Tính năng này thực sự được xác định rõ về ý nghĩa chính xác một điều. Cả cú pháp và ngữ nghĩa (về logic) đều được xác định rõ cho loại "tham chiếu ngược" này. [â¦]

và giải thích chi tiết làm thế nào điều này xảy ra.

một tiếp theo nhận xét của cmpunchesâ nêu trực tiếp giải pháp cần thiết:

Sự cố này là kết quả trực tiếp của việc sử dụng ansibles của trình phân tích cú pháp yaml tính năng nội suy thay vì tải đối tượng yaml và thực hiện thao tác thứ hai vượt qua để nội suy. Đây không chỉ là một lỗi jinja mà đây là một lỗi triển khai trong ansible. Vui lòng kiểm tra. Đang tải dưới dạng chuỗi thô và sau đó xử lý các thành viên đối tượng đã khởi tạo trong lần thứ hai sẽ khắc phục cái này.

Vì vậy, cho đến khi trình phân tích cú pháp YAML trong Ansible được sửa để đọc các giá trị biến dưới dạng văn bản thuần túy mà không cố gắng hiển thị ngay các mẫu (và do đó, hoãn hiển thị cho đến khi tất cả các biến được xác định), việc tham chiếu chéo trong các giá trị này chưa thể được thực hiện trong các biến Ansible .

flowerysong avatar
lá cờ th
Đây là một lời giải thích sai lệch về những gì đang xảy ra, bởi vì tất cả việc đánh giá biến xảy ra một cách lười biếng (khi sử dụng), không phải trong quá trình phân tích cú pháp. Các biến không thể tham chiếu đến chính chúng vì một biến phải được hiển thị đầy đủ trước khi có thể truy cập bất kỳ phần nào của nó. Việc thay đổi điều này sẽ liên quan đến những thay đổi khó lý giải đối với việc xử lý biến và có giá trị đáng ngờ. Một giải pháp tốt hơn là đặt các vars không gian tên có tiền tố (`letsencrypt_config_dir`, v.v.) thay vì cố gắng chuyển mọi thứ dưới dạng một var.

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