Điểm:0

ansible main.yml if other có điều kiện

lá cờ us

Vì vậy, tôi đang chạy một vai trò ansible có tệp main.yml trong thư mục vai trò/mặc định. Nội dung của tập tin đó là thế này:

---
api_bí mật:
  'API_PROFILE': "{{api_profile }}"
  'SERVER_ADDRESS': "{{ server_address }}"
  'MGMT_SERVER_ADDRESS': "{{ management_server_address }}"

Bây giờ tôi muốn đưa vào khối api_secrets, sau MGMT_SERVER_ADDRESS một cái gì đó như thế này:

{% if '"port" trong mgmt_ports' %}
'MGMT_SERVER_PORT': "{{ management_server_port1 }}"
'MGMT_SERVER_USER': "{{ user1 }}"
{% khác %}
'MGMT_SERVER_PORT': "{{ management_server_port2 }}"
'MGMT_SERVER_USER': "{{ user2 }}"
{% endif %}

Với mọi thứ từ đây, một tệp được tạo trên máy chủ có nội dung ở trên và tất nhiên là thay thế các biến bằng giá trị thực của chúng.

Bất kể tôi cố gắng thế nào, nó luôn dẫn đến các lỗi khác nhau. Tôi đã thử với "{% if ... endif %}", cũng như với ''

Lỗi sẽ là thế này:

LỖI! Lỗi cú pháp khi tải YAML.
  tìm thấy ký tự không thể bắt đầu bất kỳ mã thông báo nào

Lỗi dường như ở '/opt/ansible/roles/api/defaults/main.yml': dòng 55, cột 2, nhưng có thể
ở nơi khác trong tệp tùy thuộc vào vấn đề cú pháp chính xác.

Dòng vi phạm dường như là:

{% if '"port" trong mgmt_ports' %}
 ^ ở đây

Tôi cũng đã thử như thế này:

   "{% if (cổng tính bằng mgmt_ports) %}
   'MGMT_SERVER_PORT': "{{ management_server_port1 }}"
   {% khác %}
   'MGMT_SERVER_PORT': "{{ management_server_port2 }}"
   {% endif %}"

Trong trường hợp này, lỗi là:

LỖI! Lỗi cú pháp khi tải YAML.
  không thể tìm thấy mong đợi ':'

Lỗi dường như ở '/opt/ansible/roles/api/defaults/main.yml': dòng 56, cột 24, nhưng có thể
ở nơi khác trong tệp tùy thuộc vào vấn đề cú pháp chính xác.

Dòng vi phạm dường như là:

  "{% if (cổng tính bằng mgmt_ports) %}
  'MGMT_SERVER_PORT': "{{ management_server_port1 }}"
                       ^ ở đây
Chúng tôi có thể sai, nhưng điều này có vẻ như nó có thể là một vấn đề với
thiếu dấu ngoặc kép. Luôn trích dẫn các dấu ngoặc của biểu thức mẫu khi chúng
bắt đầu một giá trị. Ví dụ:

    with_items:
      - {{ foo }}

Nên được viết là:

    with_items:
      - "{{ foo }}"

cách thích hợp để làm điều này là gì?

Tôi biết sẽ dễ dàng hơn bằng cách sử dụng mẫu jinja2 nhưng playbooks được tạo ra như thế này và tôi phải tuân theo phương pháp này.

Điểm:1
lá cờ th

Tạo khuôn mẫu cho các biến xảy ra tốt sau bước phân tích cú pháp YAML, vì vậy bạn không thể sử dụng nó để tạo khuôn mẫu YAML theo cách này.

Cách tiếp cận đơn giản nhất là chuyển điều kiện vào các biểu thức Jinja riêng lẻ:

api_bí mật:
  API_PROFILE: "{{api_profile }}"
  SERVER_ADDRESS: "{{ server_address }}"
  MGMT_SERVER_ADDRESS: "{{ management_server_address }}"
  MGMT_SERVER_PORT: "{{ management_server_port1 if 'port' in mgmt_ports other management_server_port2 }}"
  MGMT_SERVER_USER: "{{ user1 if 'port' in mgmt_ports other user2 }}"

Bạn cũng có thể sử dụng các câu lệnh Jinja, mặc dù điều đó làm cho giá trị dài hơn một chút cho cùng một kết quả.

api_bí mật:
  API_PROFILE: "{{api_profile }}"
  SERVER_ADDRESS: "{{ server_address }}"
  MGMT_SERVER_ADDRESS: "{{ management_server_address }}"
  MGMT_SERVER_PORT: "{% if 'port' trong mgmt_ports %}{{ management_server_port1 }}{% other %}{{ management_server_port2 }}{% endif %}"
  MGMT_SERVER_USER: "{% if 'port' in mgmt_ports %}{{ user1 }}{% other %}{{ user2 }}{% endif %}"
Điểm:0
lá cờ lr

Ansible không có nghĩa là xử lý If-Else-Statements.

Như bạn đã đề cập ở cuối câu hỏi của mình, với các mẫu jinja2, điều đó sẽ dễ dàng hơn, nhưng nó không chỉ dễ dàng hơn mà còn biến nó thành cách chính xác để thực hiện.

Vì vậy, thay vì cố gắng làm rối tung tệp yaml của bạn bằng các câu lệnh if-else, hãy tạo một tệp jinja2 duy nhất với các tham số mẫu bắt buộc (dù sao thì có vẻ như bạn đã có cấu trúc mẫu jinja2 khá nhiều!) và tạo một tệp cấu hình bằng cách sử dụng tệp đó.

Sau đó, bạn có thể thực hiện một lệnh mẫu để đưa mẫu vào đúng vị trí với các tham số chính xác.

"Sách vở được tạo ra như thế này và tôi phải tuân theo phương pháp này" hét lên rằng bất kỳ ai đưa ra chính sách đó đều không an toàn hoặc chỉ là một đứa trẻ.

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