Điểm:0

Mẫu jinja2 ansible từ định dạng JSON được cung cấp dưới dạng bình bổ sung

lá cờ us

Tôi có mẫu jinja2 này:

# {{ ansible_managed }}

{% cho vhost trong nginx_vhosts %}
{%- if vhost.name == item.name -%}

# chuyển hướng www sang non-www
người phục vụ {
    nghe {{ nginx_port }};
    nghe [::]:{{ nginx_port }};
    port_in_redirect tắt;

    server_name www.{{ vhost.name }};
    trả về 301 http://{{ vhost.name }}$request_uri;
}
{%- endif -%}
{%- endfor -%}

Vai trò ansible với tệp yaml vhosts.ymtôi chứa các định nghĩa như thế này:

nginx_vhost:
      - tên: "test1.com"
        repo: "git1"
        chi nhánh: chủ
        trạng thái: hiện tại
      - tên: "test2.com"
        repo: "git2"
        chi nhánh: chủ
        trạng thái: hiện tại
...
      - tên: "test101.com"
        repo: "git101"
        chi nhánh: chủ
        trạng thái: hiện tại

Một nhiệm vụ bên trong playbook.yml:

- tên: "Tạo tệp cấu hình nginx vhost"
  mẫu:
    src: mẫu/nginx-vhost-template.j2
    đích: "{{ nginx_vhosts_dir }}/{{ item.name }}.conf"
    chủ sở hữu: "{{ nginx_user }}"
    nhóm: "{{ nginx_group }}"
    chế độ: 0640
  with_items:
    - "{{ nginx_vhosts }}"
  khi nào:
    - item.state == 'hiện tại'
  thông báo:
    - khởi động lại nginx

Tôi chạy một taks như:

ansible-playbook -l web1 playbook.yml --tags=nginx-vhost-config

đang hoạt động tốt, nó sẽ tạo từ mẫu một tệp cấu hình nginx vhost trên máy chủ từ xa dưới dạng domain1.com.conf, v.v. cho tất cả các định nghĩa được tìm thấy.

Giả sử rằng trong tệp vhosts.yml tôi có test1.com cho đến test100.com, tôi sẽ thêm giả sử test101.com và tôi muốn chạy các tác vụ một cách nghiêm ngặt cho test101.com đó chứ không phải cho tất cả các máy chủ trước đó. Vì vậy, tôi đã thử một cái gì đó như thế này:

ansible-playbook -l web1 playbook.yml --tags=nginx-vhost-config -e "{ 'nginx_vhosts': { 'name': 'test101.com', 'state': 'present', 'repo': ' git101', 'nhánh': 'chính chủ' }}"

Vấn đề với điều này là nó dẫn đến lỗi khi cố gắng thay thế các giá trị từ mẫu jinja2.

Một ngoại lệ xảy ra trong quá trình thực hiện tác vụ. Để xem truy nguyên đầy đủ, hãy sử dụng -vvv. Lỗi là: ansible.errors.AnsibleUndefinedVariable: 'ansible.parsing.yaml.objects.AnsibleUnicode object' không có thuộc tính 'tên'

Tôi cũng đã thử sử dụng vòng thay vì with_items nhưng không có may mắn.

Tôi hiểu rằng khi sử dụng các lọ bổ sung, nội dung được cung cấp ở định dạng JSON nhưng tôi không thể tìm ra cách khác để chuyển nội dung từ vhosts.yml dưới dạng các lọ bổ sung cho một mục nhập. Có cách nào để làm cho chức năng này?

Có một cách tiếp cận tốt hơn có thể?

flowerysong avatar
lá cờ th
Một lưu ý nhỏ: những gì bạn đang chuyển vào là YAML, không phải JSON. Nó trông rất giống JSON vì nó là YAML kiểu dòng chảy, nhưng có thể dễ dàng phân biệt vì JSON không cho phép sử dụng các trích dẫn đơn theo cách chúng ở đây.
Điểm:1
lá cờ th

Bạn đang chuyển vào một đối tượng/từ điển nhưng mã của bạn đang mong đợi một danh sách. Bạn cần gói nó trong một danh sách khi bạn chuyển nó vào hoặc tính đến các cấu trúc khác nhau có thể có khi bạn sử dụng nó.

Trước tiên, bạn nên giảm số lượng địa điểm tham chiếu nginx_vhosts bằng cách sử dụng mục vòng lặp hiện tại trực tiếp trong mẫu của bạn:

# {{ ansible_managed }}

# chuyển hướng www sang non-www
người phục vụ {
    nghe {{ nginx_port }};
    nghe [::]:{{ nginx_port }};
    port_in_redirect tắt;

    server_name www.{{ item.name }};
    trả về 301 http://{{ item.name }}$request_uri;
}

Sau đó, bạn có thể sửa đổi cấu trúc mà bạn chuyển vào một chút:

"{ 'nginx_vhosts': [{ 'name': 'test101.com', 'state': 'present', 'repo': 'git101', 'branch': 'master' }]}"

Hoặc sửa đổi vòng lặp của bạn một chút:

- tên: "Tạo tệp cấu hình nginx vhost"
  mẫu:
    src: mẫu/nginx-vhost-template.j2
    đích: "{{ nginx_vhosts_dir }}/{{ item.name }}.conf"
    chủ sở hữu: "{{ nginx_user }}"
    nhóm: "{{ nginx_group }}"
    chế độ: "0640"
  vòng lặp: "{{ [ nginx_vhosts ] | làm phẳng }}"
  khi nào:
    - item.state == 'hiện tại'
  thông báo:
    - khởi động lại nginx
Bogdan Stoica avatar
lá cờ us
Nó có ý nghĩa bây giờ. Nó hoạt động như một say mê! Cảm ơn bạn!

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