[](https://www.hongsnet.net) # Ansible의 Jinja2 템플릿을 이용한 Nginx 설정 배포 > Nginx 설정배포를 자동화 할 수 있다. ## 배포 조건 - 각 서버마다 로그기록 기준은 **IP 주소의 끝자리**이다(eg, 123.123.123.**123**). 즉, 만약 `일괄배포로 수행`할 시 로그서버에서 중복된 내역 및 로그가 누락될 수 있는 이슈가 있다. - default.conf 의 설정에 FQDN 서비스도메인이 100개라고 가정해보자. - Inventory 파일에 `mip_num` 이라는 호스트 변수를 추가하여, 이를 변수화하여 배포한다. ## Nginx default.conf 파일의 Review ```bash server { #서비스명 listen 80; server_name FQDN(e.g, www.hongsnet.net); access_log /var/log/nginx/서비스명-{{ mip_num }}.log weblog; root /www/서비스명; include /etc/nginx/public_params; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include /etc/nginx/fastcgi_params; } } ...중략 ``` ## Inventory 설정 ```bash # cat hosts [ALL_HOSTS] 172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03" mip_num=22 172.16.0.200 managed_ip=172.16.0.200 des="2020-12-03" mip_num=23 [ALL_HOSTS_OK] ``` 대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다. ## Host Variables 설정 ```bash # cat host_vars/172.16.0.100 ansible_ssh_host: 172.16.0.100 ansible_ssh_port: SSH_포트번호 ansible_ssh_user: 사용자 아이디 ansible_ssh_pass: "사용자 패스워드" ansible_become: yes ansible_become_method: su ansible_become_user: root ansible_become_pass: "!root_패스워드" ansible_python_interpreter: python2.7 ``` ## Playbook 설정 ```python --- - name: Nginx Config File COPY Playbook hosts: ALL_HOSTS vars: time: "{{lookup('pipe','date \"+%Y%m%d\"')}}" tasks: - name: /etc/nginx/conf.d/default.conf file backup copy check stat: path: /etc/nginx/conf.d/default.conf_{{ time }} register: default_conf_backup - name: /etc/nginx/conf.d/default.conf backup command: cp -rf /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_{{ time }} when: default_conf_backup.stat.exists == False - name: Local Directory Create local_action: command mkdir -p NGINX_REWRITE/{{ time }}/{{ managed_ip }} - name: /etc/nginx/conf.d/default.conf configuration template template: src=templates/default.conf.j2 dest=/etc/nginx/conf.d/default.conf mode=0644 register: default_conf - name: Nginx Configure file fetch fetch: src: "{{ item }}" dest: NGINX_REWRITE/{{ time }}/{{ managed_ip }}/ flat: yes with_items: ['/etc/nginx/conf.d/default.conf'] - name: Nginx Daemon Reload service: name: nginx state: reloaded enabled: yes ``` `Nginx 설정`에 대한 Playbook 분석 * [ ] 위의 Playbook은 미리 사전에 Nginx의 default.conf 파일을 Fetch해왔고, 수정했다고 가정한다. * [ ] 큰 틀에서는 기존 설정을 백업하고, 미리 약속된 설정을 배포하는데 유용하다. * [ ] 설정 적용이 완료되면, Nginx 데몬은 Reload 된다. 즉, 서비스에 영향을 받는다. ## playbook 실행 ```bash # ansible-playbook -i hosts nginx_deploy.yml ```