여러 사이트를 실행하는 단일 Ansible 제공 서버가 있습니다.
내 Ansible 작업은 대략 다음과 같습니다.
- 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
validate
Ansible의 템플릿 모듈에 매개 변수 를 사용하여 nginx -t
새 구성이 구문 적으로 유효한지 확인하고 싶습니다. 기본 nginx.conf에서 작동합니다.
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
owner=root group=root mode=0444
validate="/usr/sbin/nginx -c %s -t"
그러나 사이트 특정 구성 파일에 대한 변경 사항을 선택하지 않는 것 같습니다. 유효한 사이트 지시문에 싸야 validate
하기 때문에 사이트 별 템플리트를 사용하면 작동하지 않습니다 http
.
이러한 사이트 별 파일의 유효성을 확인하려면 어떻게해야합니까?
답변
https://gist.github.com/psd/5042334 에서 빌려온 아이디어와 같은 트릭을 배치하고 배치 된 파일을 확인할 수 있습니다 .
validate: bash -c 'nginx -t -c /dev/stdin <<< "events {worker_connections 1;} http { include %s; }"'
답변
validate
특정 구성 파일의 지시문의 유효성이 나머지 구성 파일에 따라 다를 수 있으므로 (예 : 동일한 서버 블록을 선언하는 두 개의 구성 파일이 있기 때문에) nginx 기본 구성 파일에 포함 된 파일 을 직접 호출 하는 것은 의미가 없습니다. 기타).
nginx -t
nginx의 구성 변경을 확인할 때마다 항상 하위 구성 요소가 아닌 기본 구성 파일을 호출해야합니다 .
답변
다른 답변의 문제를 고려하여 허용되는 답변과 비슷한 방법을 사용했습니다.
그 목적을 위해이 요지 를 만들었습니다 .
아이디어는 전체 /etc/nginx
디렉토리를 임시 디렉토리 로 복사하고 , %s
매개 변수 에서 파일을 변경 하고 문제에 대한 기본 nginx 구성을 테스트하는 것입니다. 처음에 nginx 구성이 유효하고 nginx 구성을 수정하는 모든 작업이 유효성을 검사하는 데 사용한다고 가정하면 아무런 문제가 없을 것입니다.
하나의 라이너로 다음과 같습니다.
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'
답변
Ansible 2.5에서 작동하는보다 간단한 방법은 다음과 같습니다.
- name: Verify Nginx config
become: yes
command: nginx -t
changed_when: false
해당하는 것을 실행 sudo nginx -t
하고 출력을 확인합니다. nginx 설정에 오류가 있으면 0이 아닌 값을 반환하고 Ansible 작업에서 오류가 발생합니다 ( changed_when
).
Nginx를 사용자로 설치했다면을 제거하십시오 become
.하지만 여전히 작동한다고 생각합니다.