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ể?