Ansible, Terraform 미니프로젝트

김건호·2022년 5월 1일
1

Ansible, Terraform을 이용하여 Azure 인프라 구축 및 wordpress 구성

시스템환경

패키지 환경

패키지 및 시스템명버전
Linux18.04.1-Ubuntu
ansibleansible 2.9.27
pythonPython 2.7.5
phpPHP 7.4.29,
MySQL-server8.0.28
wordpress5.9.3
clientWindow Chrome

Ansible 구조

Ansible 디렉토리 구조는 아래와 같습니다.

[vagrant@controller wp_azure_ansible]$ tree
.
├── ansible.cfg
├── inventory.ini
├── site.yaml
└── roles
    ├── apache
    │   └── tasks
    │       └── main.yml
    ├── database
    │   ├── tasks
    │   │   └── main.yml
    │   └── vars
    │       └── main.yml
    └── wordpress
        ├── handlers
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        ├── templates
        │   └── wp-config.php
        └── vars
            └── main.yml

시스템 아키텍쳐

프로젝트 과정

Ansible 환경 설정

wp_azure_ansible/ansible.cfg

[defaults]
remote_user = azureuser 

ansible.cfg는 Ansible의 설정파일입니다. controller는 vagrant이기 때문에, azure가상머신의 사용자인 azureuser로 remote에 ssh 접속을 하도록 설정합니다.

inventory.ini

[bastion]
public IP
[webserver]
private IP

관리할 호스트들의 목록을 관리하는 파일입니다. Terraform에서 local-exec를 통해 Terraform에서 생성된 IP를 변수로 참조하여 생성됩니다.

~/.ssh/config

Host bastion
    User azureuser
    Hostname public IP                                                                                      Host private IP
    ProxyJump bastion

Jumphost 설정을 위한 config 파일입니다. Terraform에서 local-exec를 통해 Terraform에서 생성된 IP를 변수로 참조하여 생성됩니다.

roles/apache

Ubuntu의 apache 서버 패키지인 apache2를 설치하는 역할입니다.

roles/apache/tasks/main.yml

---
- name: install apache for ubuntu
  block:
    - name: install apache2
      apt:
        name: apache2
        state: present
    - name: Start Apache
      service:
        name: apache2
        state: started
        enabled: yes

apt모듈을 통해 apaceh2를 설치합니다. 설치 후, apache2 패키지를 시작합니다.

roles/wordpress

wordpress에 필요한 패키지와 wordpress 파일을 설치하고, 설정하는 역할입니다.

roles/wordpress/vars/main.yml

wordpress:
  packages: php7.4,php7.4-curl,php7.4-gd,php7.4-mbstring,php7.4-mysql,php7.4-soap,php7.4-json,php7.4-intl,php7.4-zip,php7.4-xml,php7.4-xmlrpc,php7.4-cli,php7.4-xsl,python-pymysql,mysql-server,mysql-client
  
wordpress_version: 5.9.3
wordpress_filename: "wordpress-{{ wordpress_version }}.tar.gz"
wordpress_url: "https://wordpress.org/{{ wordpress_filename }}"

wordpress의 버전과 다운로드 링크, 그리고 필요한 패키지를 변수로 관리합니다.
변수를 사용하면 재사용성이 증가합니다.

roles/wordpress/tasks/main.yml

wordpress 역할이 진행할 tasks들을 정의합니다.

php 설치
# setup PHP for ubuntu
- name: setup PHP for ubuntu
  block:
    - name: install software-properties-common
      apt:
        name: software-properties-common
    - name: set repo
      apt_repository:
        repo: ppa:ondrej/php
        state: present
    - name: install php
      apt:
        name: "{{wordpress['packages']}}"
        update_cache: yes

    - name: Start Apache, Database Service
      service:
        name: "{{ item }}"
        state: restarted
        enabled: yes
      loop:
        - apache2
        - mysql
  • php7.4 버전을 을 위한 repository를 apt_repository로 설정하고 필요한 패키지들을 설치합니다. 설치 후, 시작이 필요한 패키지를 시작합니다.
wordpress 다운로드
- name: Deploy Wordpress CMS
  block:
    - name: Download Wordpress Archive file
      get_url:
        url: '{{ wordpress_url }}'
        dest: /home/azureuser
    - name: Decompress Archive file
      unarchive:
        src: '/home/azureuser/{{ wordpress_filename }}'
        remote_src: yes
        dest: /var/www/html/

wordpress 다운로드 링크에서 get_url 모듈을 사용하여 wordpress 파일을 다운 받습니다. 다운로드 된 파일은 사용자의 홈디렉토리의 저장됩니다.

wordpress 설정파일 구성
- name: Configure Database for Wordpress
  block:
  - name: Copy Database Configure File for Wordpress
    template:
      src: wp-config.php
      dest: /var/www/html/wordpress/wp-config.php

    notify:
      - Restart Apache Service for Ubuntu
  tags:
    - wordpress
    - database

wordpress 구성파일은 미리 templates 역할에 저장되어있습니다. 파일을 wordpress 디렉토리 아래로 복사합니다. apache2 패키지를 재시작하는 알림 handler로 보냅니다.

roles/wordpress/handlers/main.yml

tasks에서 보내온 handler알림을 관리하는 역할입니다.

- name: Restart Apache Service for Ubuntu
  service:
    name: apache2
    state: restarted

roles/wordpress/templates/wp-config.php

wordpress 구성파일 내용은 wp-config-sample.php에 의해 생성되었습니다.

SSL 설정

데이터베이스의 SSL을 접속을 위한 인증서 경로를 지정합니다.

//** Connect with SSL** //
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
//** SSL CERT **//
define('MYSQL_SSL_CERT','/home/azureuser/DigiCertGlobalRootCA.crt.pem');
// ** Database settings - You can get this info from your web host ** //

아래에 삽입합니다.

데이터베이스 연결 설정
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ database["name"] }}' );

/** Database username */
define( 'DB_USER', '{{ database["user"] }}' );

/** Database password */
define( 'DB_PASSWORD', '{{ database["pwd"] }}' );

/** Database hostname */
define( 'DB_HOST', '{{ database["host"] }}' );

데이터베이스 이름, 사용자, 사용자의 비밀번호, 연결할 데이터베이스의 엔드포인트를 설정합니다. database 역할의 변수를 참조합니다.

roles/database

데이터베이스에 데이터베이스를 만들고, 사용자를 생성하는 역할입니다.

roles/database/vars/main.yml

---
database:
  name: wordpress
  user: wpuser
  pwd: wppass
  host: 생성된 데이터베이스의 엔드포인트
  azure_user: 생성된 데이터베이스의 관리자 계정
  azure_pwd: 관리자 계정의 비밀번호

host 변수는 Terraform에서 ansible-playbook 실행 시, -e 옵션을 통한 변수로 지정됩니다.

roles/database/tasks/main.yml

database의 tasks를 선언하는 파일입니다.

---
- name: database setting
  block:
    - get_url:
        url: https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem
        dest: /home/azureuser
        validate_certs: no
    - name: create database for wordpress
      mysql_db:
        name: '{{ database["name"] }}'
        state: present
        login_host: '{{ database["host"] }}'
        login_user: '{{ database["azure_user"] }}'
        login_password: '{{ database["azure_pwd"] }}'
        ca_cert: /home/azureuser/DigiCertGlobalRootCA.crt.pem
  
    - name: create mariadb user
      mysql_user:
        name: '{{ database["user"] }}'
        password: '{{ database["pwd"] }}'
        host : '%'
        priv: '{{ database["name"] }}.*:ALL'
        state : present
        login_host: '{{ database["host"] }}'
        login_user: '{{ database["azure_user"] }}'
        login_password: '{{ database["azure_pwd"] }}'
        ca_cert: /home/azureuser/DigiCertGlobalRootCA.crt.pem
  

SSL 인증을 위한 인증서를 다운받습니다. SSL을 인증을 통해 데이터베이스에 연결하여 wordpress에 필요한 데이터베이스와 사용자를 생성합니다.
ca_cert는 인증서가 위치한 절대경로를 지정합니다.

site.yml

---
- hosts: webserver
  become: true
    
  roles:
    - apache
    - wordpress
    - database
  

관리자 권한으로 webserver그룹의 호스트에 playbook을 실행합니다.

트러블슈팅

ERROR 2005 (HY000): Unknown MySQL server host 'wordpress-db-ken.mysql.database.azure.com' (2)

ERROR 2005 (HY000): Unknown MySQL server host 'wordpress-db-ken.mysql.database.azure.com' (2)

테스트중 자동생성으로 리소스들을 생성하다 데이터베이스 서버와 가상 머신이 다른 네트워크에 위치해있어서 가상머신이 데이터베이스 서버의 엔드포인트를 찾지 못했습니다. 데이터베이스 서버와 가상머신은 같은 가상네트워크, 다른 서브넷에 위치해야 합니다.

Connections using insecure transport are prohibited while --require_secure_transport=ON

TASK [create database for wordpress] *********************************************************************************************************
fatal: [10.0.0.4]: FAILED! => {"changed": false, "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (3159, u'Connections using insecure transport are prohibited while --require_secure_transport=ON.')"}

SSL 인증 없이 데이터베이스 서버에 연결을 시도하여 생긴 결과입니다. 인증서를 다운 받고, SSL 인증을 하여 해결합니다.

해결과정

프로젝트 결과

참고문헌

Connections using insecure transport are prohibited while --require_secure_transport=ON 에러 관련
ansible jumphost

profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

1개의 댓글

comment-user-thumbnail
2022년 5월 1일

미쳤다 미쳤어

답글 달기