Xác thực nginx.conf trong quá trình triển khai ansible


11

Tôi có một máy chủ được cung cấp Ansible duy nhất đang chạy một số trang web.

Nhiệm vụ Ansible của tôi trông đại khái như:

- name: site nginx config
  template: src="nginx-site.conf.j2" dest=/etc/nginx/conf.d/{{item.name}}.conf
            owner=root group=root mode=0444
  with_items: sites
  notify: restart nginx

- name: nginx conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
  notify: restart nginx

Tôi muốn sử dụng validatetham số cho mô-đun mẫu của Ansible để gọi nginx -tvà đảm bảo các cấu hình mới của tôi có hiệu lực về mặt cú pháp. Nó hoạt động cho nginx.conf chính:

  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
            owner=root group=root mode=0444
            validate="/usr/sbin/nginx -c %s -t"

Nhưng nó dường như không nhận các thay đổi đối với các tệp cấu hình dành riêng cho trang web. Đưa validatevào các mẫu dành riêng cho trang web không hoạt động, vì chúng cần được gói trong một lệnh httpđể có hiệu lực.

Tôi có thể làm gì để kiểm tra tính hợp lệ của các tệp dành riêng cho trang này?

Câu trả lời:


9

Bạn có thể thực hiện một số mẹo và xác thực tệp được đặt như (ý tưởng được mượn từ https://gist.github.com/sheet/5042334 ): validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'


Điều này thực sự hoạt động, upvote!
13dimitar

4

Sẽ không có ý nghĩa khi gọi trực tiếp validatevào một tệp có trong tệp cấu hình chính nginx của bạn vì tính hợp lệ của các lệnh trong một tệp cấu hình cụ thể có thể phụ thuộc vào phần còn lại của tệp cấu hình của bạn (ví dụ: bạn có hai tệp cấu hình khai báo cùng một khối máy chủ Vân vân).

Bạn phải luôn gọi nginx -ttệp cấu hình chính và không phải là một trong các phần phụ của nó bất cứ khi nào bạn muốn xác thực bất kỳ thay đổi cấu hình nào của nginx.


1
Đồng ý. Vì vậy, tôi đoán rằng tôi cần phải thuyết phục ansible để gói mọi thứ để xác nhận trong một lần?
Erin Gọi

@ErinCall Lý tưởng nhất là cấu hình nginx của bạn sẽ vẫn hoàn toàn hợp lệ ngay cả khi playbook của bạn được xen kẽ giữa chừng.
Michael Hampton

3

Tôi đã sử dụng một cách tiếp cận tương tự như câu trả lời được chấp nhận có tính đến mối quan tâm của câu trả lời khác.

Tôi đã tạo ra ý chính này cho mục đích đó.

Ý tưởng là sao chép toàn bộ /etc/nginxthư mục vào một thư mục tạm thời, thay đổi một tệp từ %stham số và kiểm tra cấu hình nginx chính cho các vấn đề. Nếu bạn cho rằng ban đầu cấu hình nginx là hợp lệ và tất cả các tác vụ sửa đổi cấu hình nginx đều sử dụng để xác thực, thì tôi đoán sẽ không có vấn đề gì.

Như một lớp lót, nó sẽ trông như thế này:

validate: bash -c 'NGINX_CONF_DIR=`mktemp -d`; cp -rTp /etc/nginx/ "$NGINX_CONF_DIR" && cp -Tp %s "$NGINX_CONF_DIR"/sites-enabled/new-site.conf && nginx -t -c "$NGINX_CONF_DIR"/nginx.conf'


1
Tôi cần giải pháp này thay vì câu trả lời được chấp nhận vì conf nginx của tôi bao gồm fastcgi_params.
Yep_It's_Me

3

Đây là một cách đơn giản hơn, hoạt động ít nhất với Ansible 2.5:

- name: Verify Nginx config
  become: yes
  command: nginx -t
  changed_when: false

Nó chạy tương đương sudo nginx -tvà kiểm tra đầu ra của nó. Nếu có lỗi trong cấu hình nginx, nó sẽ trả về giá trị khác không và tác vụ Ansible sẽ báo lỗi ( changed_when).

Nếu bạn đã cài đặt Nginx với tư cách là người dùng, chỉ cần xóa become, mặc dù tôi nghĩ rằng nó vẫn sẽ hoạt động ngay cả với nó.


1
Đây là một ví dụ tồi, khi sử dụng templatemô-đun và tùy chọn xác thực trong Ansible, bạn có đảm bảo về tính hợp lệ của cấu hình, nhưng nếu bạn triển khai mẫu và sau đó kiểm tra thủ công và thất bại, thì bạn vẫn gặp vấn đề là không hợp lệ mẫu đã được triển khai và không cần phải hoàn nguyên.
Rabin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.