ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ansible: 앤서블을 이용한 Nginx TLS 자동화 (feat. Vagrant)
    Ansible 2021. 9. 23. 13:11

    이번 포스팅은 vagrant를 이용해서 vm을 생성한 후, 

    앤서블을 이용해서 nginx를 https로 배포합니다.  

     

    환경은 다음과 같습니다. 

     

    - ansible core : ubuntu 18.04 로컬에서 진행합니다. 

    - virtual box에서 ubuntu 18.04 이미지를 사용합니다.

     

     

     

    최종 디렉토리 구조는 다음과 같습니다. 

    seung@seung-15Z990-VR5DK:~/vagrant/nginx$ tree .
    .
    ├── ansible.cfg
    ├── files
    │   ├── nginx.crt
    │   └── nginx.key
    ├── hosts
    ├── templates
    │   ├── index.html.j2
    │   └── nginx.conf.j2
    ├── ubuntu-bionic-18.04-cloudimg-console.log
    ├── Vagrantfile
    └── web-tls.yml

     

     

     

    1. vm 생성하기 

     

    Vagrantfile을 작성합니다. 

    VAGRANTFILE_API_VERSION= "2"
    
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.box='ubuntu/bionic64'  
      config.vm.network "forwarded_port" , guest: 80 , host: 8080
      config.vm.network "forwarded_port" , guest: 443 , host: 8443
    end

     

    로컬 8443 포트와 vm의 443번 포트를 바인딩합니다.  

     

     

     

    vm을 생성합니다. 

    vagrant up

     

     

     

    2. ansible 설정 

     

    ansible 사용을 위한 hosts파일과 ansible.cfg 파일을 작성합니다.

    vagrant ssh-config 커맨드를 참고하여 작성합니다. 

     

    < hosts >

    nginx ansible_host=127.0.0.1 ansible_port=2222 ansible_python_interpreter=/usr/bin/python3

    사용할 vm의 hostname을 nginx라고 합니다. 

     

     

    < ansible.cfg >

    [defaults]
    inventory = hosts
    remote_user = vagrant
    private_key_file = .vagrant/machines/default/virtualbox/private_key
    host_key_checking = False

     

    사용할 inventory명과 user, 그리고 vagrant ssh-config를 통해 알아낸 private key의 위치를 적어줍니다. 

     

     

     

    3. templates 디렉토리 생성하기 

     

    template 폴더를 생성한 뒤 nginx configuration에 사용할 파일을 생성합니다. 

    jinja2 템플릿을 사용할 것이므로 j2 확장자를 이용합니다. 

     

    <index.html.j2>

    <html>
      <head>
        <title>Welcome to ansible</title>
      </head>
      <body>
      <h1>nginx, configured by Ansible</h1>
      <p>If you can see this, Ansible successfully installed nginx.</p>
    
      <p>Running on {{ inventory_hostname }}</p>
      </body>
    </html>

     

     

    <nginx.conf.j2>

    server {
            listen 80 default_server;
            listen [::]:80 default_server ipv6only=on;
    
            listen 443 ssl;
    
            root /usr/share/nginx/html;
            index index.html index.htm;
    
            server_name {{ server_name }};
            ssl_certificate {{ cert_file }};
            ssl_certificate_key {{ key_file }};
    
            location / {
                    try_files $uri $uri/ =404;
            }
    }

     

     

     

    4. key 생성하기 

     

    files 폴더를 생성한 후, files 내부에서 tls 사용을 위한 key와 인증서를 생성합니다. 

    openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -subj /CN=localhost \
    -keyout files/nginx.key -out nginx.crt

     

     

     

    5. ansible-playbook 실행하기 

     

    마지막으로 ansible-playbook을 작성합니다. 

     

    <web-tls.yml>

    ---
    - name: Configure webserver with nginx and tls
      hosts: nginx 	# nginx 호스트에 대해서 실행할 playbook 
      become: True	# root 권한으로 실행 
      vars:		# ansible에서 사용할 변수 지정
        key_file: /etc/nginx/ssl/nginx.key
        cert_file: /etc/nginx/ssl/nginx.crt
        conf_file: /etc/nginx/sites-available/default
        server_name: localhost
      tasks:
        - name: Install nginx
          apt: name=nginx update_cache=yes cache_valid_time=3600
    
        - name: create directories for TLS certificates
          file: path=/etc/nginx/ssl state=directory
    
        - name: copy TLS key
          copy: src=files/nginx.key dest={{ key_file }} owner=root mode=0600
          notify: restart nginx
    
        - name: copy TLS certificate
          copy: src=files/nginx.crt dest={{ cert_file }}
          notify: restart nginx
    
    	# template 모듈을 이용하여 j2 확장자를 처리
        - name: copy nginx config file
          template: src=templates/nginx.conf.j2 dest={{ conf_file }}
          notify: restart nginx
    
        - name: enable configuration
          file: dest=/etc/nginx/sites-enabled/default src={{ conf_file }} state=link
          notify: restart nginx
    
        - name: copy index.html
          template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644
          
      # task에 의해 notify된 경우에 실행
      handlers:
        - name: restart nginx
          service: name=nginx state=restarted

     

    ansible-playbook을 실행합니다. 

    ansible-playbook web-tls.yml

     

     

     

    6. nginx 설치 확인하기 

     

    ansible-playbook이 완료되면 https://localhost:8443으로 접속해서 Nginx가 잘 설치 되었는지 확인합니다. 

    반응형

    댓글

Designed by Tistory.