[![logo](https://www.hongsnet.net/images/logo.gif)](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
```