본문 바로가기

클라우드/앤서블(Ansible)

앤서블 Ansible: Apache + Wordpress + MySQL 배포 1

https://daaa0555.tistory.com/351

 

앤서블 Ansible 플레이북 ( playbook ) / wordpress 구성하기 2

wpdeploy.yaml 더보기 - name: MySQL Deployment   hosts: 192.168.200.102   tasks:   - name: Install MySQL Package     apt:       update_cache: true       name: mysql-..

daaa0555.tistory.com

위의 Ansible playbook을 기반으로 변수, 작업제어등을 추가하여 더 효율적이고 깔끔하게 정리한다.

 

 

 

# 변수

시스템이 항상 같은 구성을 가지지 않고 경우에 따라 다른 구성을 가져야 할 수 있기 때문에 변수를 선언하여 시스템 간 차이를 처리한다.

 

더보기

devops@control:~$ cat wordpress.yaml 
- name: MySQL Deployment
  hosts: 192.168.200.101
  vars_files:
    - vars.yaml

  tasks:
  - name: Install MySQL Package
    apt:
      update_cache: true
      name: mysql-server, python3-pymysql
      state: present
  - name: Starting MySQL Service
    service:
      name: mysql
      state: started
      enabled: yes
  - name: Create Wordpress Database
    mysql_db:
      login_unix_socket: "{{ db['mysql_sock'] }}"
      name: "{{ db['mysql_db_name'] }}"
      state: present
  - name: Create Wordpress User
    mysql_user:
      check_implicit_admin: yes
      login_unix_socket: "{{ db['mysql_sock'] }}"
      name: "{{ db['mysql_user_name'] }}"
      password: "{{ db['mysql_user_passwd'] }}"
      host: localhost
      priv: wpdb.*:ALL,GRANT
      state: present

- name: Wordpress Deployment
  hosts: 192.168.200.101
  vars_files:
    - vars.yaml

  tasks:
  - name: Install Apache2 Package
    apt:
      name: apache2, php, php-mysql, php-gd, php-mbstring
      state: present
  - name: Starting Apache2 Service
    service:
      name: apache2
      state: started
      enabled: yes
  - name: Download Wordpress Source
    get_url:
      url: "{{ web['wp_url'] }}"
 #      checksum: "{{ web['wp_checksum'] }}"
      dest: "{{ web['wp_tar'] }}"
  - name: Unarchive Wordpress Source
    unarchive:
      src: "{{ web['wp_tar'] }}"
      remote_src: true
      dest: /var/www/html
  - name: Setting Wordpress Database Configuration
    copy:
      src: /var/www/html/wordpress/wp-config-sample.php
      dest: "{{ web['wp_config'] }}"
      remote_src: yes
  - name: Setting Configuration for DB Name
    replace:
      path: "{{ web['wp_config'] }}"
      regexp: database_name_here
      replace: "{{ db['mysql_db_name'] }}"
  - name: Setting Configuration for User
    replace:
      path: "{{ web['wp_config'] }}"
      regexp: username_here
      replace: "{{ db['mysql_user_name'] }}"
  - name: Setting Configuration for Password
    replace:
      path: "{{ web['wp_config'] }}"
      regexp: password_here
      replace: "{{ db['mysql_user_passwd'] }}"

 변수 파일 (vars.files)를 이용하여 변수 파일을 포함 할 수 있다.

 

 

더보기

devops@control:~$ cat vars.yaml
db:
  mysql_sock: "/var/run/mysqld/mysqld.sock"
  mysql_db_name: "wpdb"
  mysql_user_name: "wpadm"
  mysql_user_passwd: "qwer1234"
web:
  wp_url: "https://wordpress.org/wordpress-{{ wp_version }}.tar.gz"
  wp_checksum: "https://wordpress.org/wordpress-{{ wp_version }}.tar.gz.sha1"
  wp_tar: "/tmp/wordpress-{{ wp_version }}.tar.gz"
  wp_config: "/var/www/html/wordpress/wp-config.php"
wp_version: "5.8"

변수 파일은 yaml 형식으로 작성 된다.

db)

mysql_sock: 소켓파일 경로
mysql_db_name: 데이터베이스 이름
mysql_user_name: 사용자 이름
mysql_user_passwd: 사용자 비밀번호

 

web)

wp_url: wordpress :  다운로드 링크
wp_checksum:  wordpress 해시값
wp_tar: wordpress :  파일 압축을 풀 경로
wp_config:  wp-config.php 설정 파일 경로
wp_version: wordpress 버전

 

 

설치 확인

 

 

 

#  템플릿

동적으로 파일을 수정하는 replace는 많은 내용을 수정하기에 효율적이지 않다.

Jinja2(Ansible은 Python의 웹 템플릿 엔진)는 Ansible에서 변수를 참조해 설정 파일 등을 동적으로 생성한다.

 

wp-config.php.j2

wp-config.php 설정 파일을 복사하여 확장자명이 j2인 파일을 생성하고, 필요한 부분을 수정한다.

 

 

wp-config.php.j2

변수를 이용해 Apache 포트번호를 정의하고 템플릿을 이용해 배포한다.

 

 

wpdeploy.yaml 에서 replace를 대체하여 template 사용한다.

 

 

 

# 핸들러

 핸들러는 작업을 실행하고 시스템의 변경(changed)이 있을 때 별도의 작업을 호출하고 실행하는 작업이다.

작업에 변경이 있고, 반드시 알림 (Notify)이 있을때만 실행된다. 알림을 받은 즉시 실행하지 않고,  모든 작업이 완료되고 난 후 작업을 실행한다. 시스템의 멱등성을 제공한다.

 

더보기

devops@control:~/wp$ cat wordpress.yaml 
- name: MySQL Deployment
  hosts: 192.168.200.101
  vars_files:
    - ./vars/vars.yaml

  tasks:
  - name: Install MySQL Package
    apt:
      update_cache: true
      name: mysql-server, python3-pymysql
      state: present
    when: ansible_facts['os_family'] == "Debian"
  - name: Install MariaDB Package
    apt:
      update_cache: true
      name: mariadb-server, mariadb-client
      state: present
    when: ansible_facts['os_family'] == "RedHat"
  - name: Starting MySQL Service
    service:
      name: mysql
      state: started
      enabled: yes
  - name: Create Wordpress Database
    mysql_db:
      login_unix_socket: "{{ db['mysql_sock'] }}"
      name: "{{ db['mysql_db_name'] }}"
      state: present
  - name: Create Wordpress User
    mysql_user:
      check_implicit_admin: yes
      login_unix_socket: "{{ db['mysql_sock'] }}"
      name: "{{ db['mysql_user_name'] }}"
      password: "{{ db['mysql_user_passwd'] }}"
      host: localhost
      priv: wpdb.*:ALL,GRANT
      state: present

- name: Wordpress Deployment
  hosts: 192.168.200.102
  vars_files:
    - ./vars/vars.yaml

  tasks:
  - name: Install Apache2 Package
    apt:
      name: apache2, php, php-mysql, php-gd, php-mbstring
      state: present
    when: ansible_facts['os_family'] == "Debian"
  - name: Install Httpd Package
    apt:
      name: httpd, php, php-mysql, php-gd, php-mbstring
      state: present
    when: ansible_facts['os_family'] == "RedHat"
  - name: Change Apache2 Service Ports
    template:
      src: jinja/ports.conf.j2
      dest: /etc/apache2/ports.conf
    notify:
      - Restart web services
  - name: Starting Apache2 Service
    service:
      name: apache2
      state: started
      enabled: yes
  - name: Download Wordpress Source
    get_url:
      url: "{{ web['wp_url'] }}"
 #      checksum: "{{ web['wp_checksum'] }}"
      dest: "{{ web['wp_tar'] }}"
  - name: Unarchive Wordpress Source
    unarchive:
      src: "{{ web['wp_tar'] }}"
      remote_src: true
      dest: /var/www/html
  - name: Setting Wordpress Database Configuration
    template:
      src: jinja/wp-config.php.j2
      dest: "{{ web['wp_config'] }}"

  handlers:
  - name: Restart web services
    service:
      name: apache2 
      state: restarted

 

작업에 notify를 설정하고 핸들러를 정의해 준다.

 

 

#  조건문 (팩트 변수)

play 에서 변수의 값을 실행 할 것인지 실행하지 않을 것인지 조건을 설정한다.

 

when: ansible_facts['os_family'] == "Debian"

Debian 계열이면 Install MySQL Package ,  Install Apache2 Package 작업을 실행한다.

when: ansible_facts['os_family'] == "RedHat"

RedHat 계열이면 Install MariaDB Package , Install Httpd Package 작업을 실행한다.

데비안계열, 레드햇계열 의 워드프레스를 배포할 수 있도록 설정한다.