패키지 및 시스템명 | 버전 |
---|---|
Linux | 18.04.1-Ubuntu |
ansible | ansible 2.9.27 |
python | Python 2.7.5 |
php | PHP 7.4.29, |
MySQL-server | 8.0.28 |
wordpress | 5.9.3 |
client | Window Chrome |
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
[defaults]
remote_user = azureuser
ansible.cfg
는 Ansible의 설정파일입니다. controller는 vagrant이기 때문에, azure가상머신의 사용자인 azureuser로 remote에 ssh 접속을 하도록 설정합니다.
[bastion]
public IP
[webserver]
private IP
관리할 호스트들의 목록을 관리하는 파일입니다. Terraform에서 local-exec
를 통해 Terraform에서 생성된 IP를 변수로 참조하여 생성됩니다.
Host bastion
User azureuser
Hostname public IP Host private IP
ProxyJump bastion
Jumphost 설정을 위한 config 파일입니다. Terraform에서 local-exec
를 통해 Terraform에서 생성된 IP를 변수로 참조하여 생성됩니다.
Ubuntu의 apache 서버 패키지인 apache2를 설치하는 역할입니다.
---
- 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 패키지를 시작합니다.
wordpress에 필요한 패키지와 wordpress 파일을 설치하고, 설정하는 역할입니다.
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의 버전과 다운로드 링크, 그리고 필요한 패키지를 변수로 관리합니다.
변수를 사용하면 재사용성이 증가합니다.
wordpress 역할이 진행할 tasks들을 정의합니다.
# 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
- 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 파일을 다운 받습니다. 다운로드 된 파일은 사용자의 홈디렉토리의 저장됩니다.
- 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로 보냅니다.
tasks에서 보내온 handler알림을 관리하는 역할입니다.
- name: Restart Apache Service for Ubuntu
service:
name: apache2
state: restarted
wordpress 구성파일 내용은 wp-config-sample.php
에 의해 생성되었습니다.
데이터베이스의 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 역할의 변수를 참조합니다.
데이터베이스에 데이터베이스를 만들고, 사용자를 생성하는 역할입니다.
---
database:
name: wordpress
user: wpuser
pwd: wppass
host: 생성된 데이터베이스의 엔드포인트
azure_user: 생성된 데이터베이스의 관리자 계정
azure_pwd: 관리자 계정의 비밀번호
host
변수는 Terraform에서 ansible-playbook
실행 시, -e
옵션을 통한 변수로 지정됩니다.
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
는 인증서가 위치한 절대경로를 지정합니다.
---
- 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)
테스트중 자동생성으로 리소스들을 생성하다 데이터베이스 서버와 가상 머신이 다른 네트워크에 위치해있어서 가상머신이 데이터베이스 서버의 엔드포인트를 찾지 못했습니다. 데이터베이스 서버와 가상머신은 같은 가상네트워크, 다른 서브넷에 위치해야 합니다.
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
미쳤다 미쳤어