Ad-hoc 명령으로 Wordpress 구성
module index 공식 문서 : https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
패키지 설치(yum): yum
서비스 제어(systemctl): service
텍스트 수정(sed): lineinfile, blockinfile, replace
호스트 네임 설정(hostnamectl): hostname
압축 해제(tar): archive, unarchive
방화벽(firewall-cmd): firewalld(레드햇 계열), ufw(데비안 계열), iptables
파일 복사(cp): copy, fetch(관리 노드에 있는 파일을 제어 노드로 복사해서 가져올 때)
디렉토리 생성, 파일 권한 변경 등..(mkdir, chmod): file
파일 다운로드(wget): get_url
네트워크 설정(nmcli): nmcli
데이터베이스(mysql): mysql_db, mysql_user, meysql_info, mysql_replica...
SSL 인증서(mod_ssl): openssl_certificate, openssl_csr, openssl_*...
yum 에서 다운로드 받을 수 있는 php 버전이 5버전으로 너무 낮아서 remi repo 로 설치를 해야 한다. 아마존의 경우는 아마존 엑스트라로 레포를 확장시킬 수 있다.
한대의 VM 에서 ansible 을 이용하여 워드프레스 구성
centos7 에서 Remi 저장소를 사용하여 php74 를 다운받을 것이다. remi 저장소를 사용하기 위해서는 사전에 epel 저장소를 설정해야 한다. centos7 은 epel 저장소도 포함하고 있으므로 yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y 을 사용하면 자동으로 설치된다.
[vagrant@controller ~]$ ansible wp -m yum -a 'name=https://rpms.remirepo.net/enterprise/remi-release-7.rpm state=present validate_certs=no' -b
192.168.100.11 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"remi-release-7.9-3.el7.remi.noarch providing /home/vagrant/.ansible/tmp/ansible-tmp-1649900129.24-3118-94499209921844/remi-release-7vBdQXK.rpm is already installed"
]
}
[SSL: CERTIFICATE_VERIFY_FAILED] 오류가 발생, 인증서 문제가 발생한 것인데 validate_certs=no 옵션을 추가하여 회피한다.
php7.4 버전을 설치하기 위해서는 remi repo 가 필요하여 yum 모듈로 remi-release 패키지를 다운로드
[vagrant@node1 ~]$ cd /etc/yum.repos.d
[vagrant@node1 yum.repos.d]$ ls
CentOS-Base.repo epel-testing.repo remi-php72.repo
CentOS-CR.repo remi-glpi91.repo remi-php73.repo
CentOS-Debuginfo.repo remi-glpi92.repo remi-php74.repo
CentOS-fasttrack.repo remi-glpi93.repo remi-php80.repo
CentOS-Media.repo remi-glpi94.repo remi-php81.repo
CentOS-Sources.repo remi-modular.repo remi.repo
CentOS-Vault.repo remi-php54.repo remi-safe.repo
CentOS-x86_64-kernel.repo remi-php70.repo
epel.repo remi-php71.repo
/etc/yum.repo.d 디렉토리를 확인해보면 remi 레포 리스트들을 확인할 수 있다. 여기서 remi-safe.repo 가 자동으로 활성화되기 때문에 remi-safe 레포지토리를 비활성화 시켜줘야 한다.
여기서 사용할 레포지토리는 remi-php74 이다.
[vagrant@controller ~]$ ansible wp -m yum_repository -a 'name=remi_safe enabled=no' -b
192.168.100.11 | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "Parameter 'baseurl', 'metalink' or 'mirrorlist' is required."
}
Parameter 'baseurl', 'metalink' or 'mirrorlist' is required. → baseurl 이나 mirrorlist 가 필수이다 라고 말해주고 있다. 즉 remi-safe 레포를 다운로드 하기 위한 mirrorlist 나 baseurl 이 필요로 하다는 것이다.
[vagrant@node1 yum.repos.d]$ cat remi-php74.repo
# This repository only provides PHP 7.4 and its extensions
# NOTICE: common dependencies are in "remi-safe"
[remi-php74]
name=Remi's PHP 7.4 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php74/$basearch/
#mirrorlist=https://rpms.remirepo.net/enterprise/7/php74/httpsmirror
mirrorlist=http://cdn.remirepo.net/enterprise/7/php74/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
.
.
.
[vagrant@node1 yum.repos.d]$
node1에서 cat /etc/yum.repos.d/remi-php74.repo 로 remi-php74 레포지토리의 mirrorlist url 을 찾아서 ansible ad-hoc 에서 mirrorlist 에 값을 넣어준다.
[vagrant@controller ~]$ ansible wp -m yum_repository -a 'name=remi-safe file=remi-safe mirrorlist=http://cdn.remirepo.net/enterprise/7/safe/mirror description=remi-safe enabled=no' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "remi-safe",
"state": "present"
}
remi-safe 레포지토리를 비활성화시킨다. enabled=no(비활성화) 한 이유는 remi-repo 와 remi-safe 저장소 두 개가 존재할 경우 패키지 설치시 의존성 충돌이 날 수 있어서 remi-safe 를 비활성화 시키는 것이다.
[vagrant@controller ~]$ ansible wp -m yum_repository -a 'name=remi-php74 file=remi-php74 mirrorlist=http://cdn.remirepo.net/enterprise/7/php74/mirror description=remi-php74 enabled=yes' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "remi-php74",
"state": "present"
}
remi-php74.repo 레포지토리를 추가한다. mirrorlist 설정하여 해당 mirrorlist 사이트에서 설치, enabled=yes → remi-php74 레포지토리를 활성화 하겠다는 뜻, remi-safe 레포지토리는 비활성화 된 상태이다.
[vagrant@controller ~]$ ansible wp -m yum -a 'name=httpd,php,php-mysql,mariadb,mariadb-server,python2-PyMySQL state=installed' -b
httpd, php, php-mysql, mariadb, mariadb-server, python2-PyMySQL 등 ansible ad-hoc 명령을 사용할 때 필요한 패키지와 DB, php 패키지들을 다운로드한다.
[vagrant@controller ~]$ ansible wp -m yum -a 'name=php,php-mysql state=insta
lled' -b
192.168.100.11 | FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"changes": {
"installed": [
"php",
"php-mysql"
]
},
"msg": "warning: /var/cache/yum/x86_64/7/remi-php74/packages/php-mysqlnd-7.4.29-1.el7.remi.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 00f97f56: NOKEY\\n\\n\\nPublic key for php-mysqlnd-7.4.29-1.el7.remi.x86_64.rpm is not installed\\n",
[vagrant@controller ~]$ ansible wordpress -i inventory.ini -m rpm_key -a "key=/etc/pki/rpm-gpg/RPM-GPG-KEY-remi state=present" -b
192.168.100.12 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true
}
또는
[vagrant@controller ~]$ ansible wordpress -i inventory.ini -m yum -a "name=epel-release state=installed" -b
remi-php74 레포지토리의 php-mysqlnd 패키지를 다운받아야 하는데 php-mysql 을 다운로드 받아서 생긴 문제이다. 일단 아래 명령어들로 해결할 수도 있거나 설치를 받을 때 애초에 php-mysqlnd 패키지를 다운로드 받으면 된다.
php,php-mysql 패키지를 다운로드 할 때 Header V4 DSA/SHA1 Signature 오류가 발생하는데 GPG Key 가 만료되어 뜨는 문제로 sudo rpm --import /etc/pki/rpm-gpg/RPM* 명령어를 통해 해결할 수 있다.
또는, ansible wordpress -i inventory.ini -m yum -a "name=epel-release state=installed" -b 를 설치하여 해결할 수 있다.
[vagrant@controller ~]$ ansible wp -m service -a 'name=httpd state=started enabled=yes' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"enabled": true,
"name": "httpd",
"state": "started",
.
.
.
[vagrant@controller ~]$ ansible wp -m service -a 'name=mariadb state=started enabled=yes' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"enabled": true,
"name": "mariadb",
"state": "started",
.
.
.
service 모듈을 사용하여 httpd, mariadb status 변경해준다.
[vagrant@controller ~]$ ansible wp -m get_url -a 'url=https://wordpress.org/wordpress-5.9.3.tar.gz dest=/home/vagrant' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
.
.
get_url 모듈을 사용하여 워드프레스를 다운로드한다.
[vagrant@controller ~]$ ansible wp -m unarchive -a 'src=/home/vagrant/wordpress-5.9.3.tar.gz remote_src=yes dest=/var/www/html owner=apache group=apache' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/var/www/html",
.
.
tar 파일 압축을 풀어준다. 해당 압축 파일은 원격지에 존재하기 때문에 remote_src=yes 옵션을 넣어줬고 사용자, 그룹을 apache 로 설정해줬다.
[vagrant@controller ~]$ ansible wp -m mysql_db -a 'name=wordpress state=present login_user=root'
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"db": "wordpress",
"db_list": [
"wordpress"
]
}
mysql root 유저로 wordpress 이름의 데이터베이스를 생성한다.
[vagrant@controller ~]$ ansible wp -m mysql_user -a 'name=wpadm password=1234 state=present login_user=root priv="wordpress.*:ALL"'
[WARNING]: Module did not set no_log for update_password
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"msg": "User added",
"user": "wpadm"
}
mysql root 유저로 유저 이름과 비밀번호 권한을 설정해줬다.
[vagrant@controller ~]$ ansible wp -m copy -a 'src=/var/www/html/wordpress/wp-config-sample.php remote_src=yes dest=/var/www/html/wordpress/wp-config.php owner=apache group=apache' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
.
.
wp-config-sample.php 파일을 복사하여 wp-config.php 파일로 만든다. 소유자, 그룹을 apache 로 설정해줬다.
[vagrant@controller ~]$ ansible wp -m replace -a 'path=/var/www/html/wordpress/wp-config.php regexp=database_name_here replace=wordpress' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"msg": "1 replacements made"
}
wp-config.php 파일의 database_name_here 부분을 wordpress 로 대치해준다.
[vagrant@controller ~]$ ansible wp -m replace -a 'path=/var/www/html/wordpress/wp-config.php regexp=username_here replace=wpadm' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"msg": "1 replacements made"
}
wp-config.php 파일의 username_here 부분을 wordpress 로 대치해준다.
[vagrant@controller ~]$ ansible wp -m replace -a 'path=/var/www/html/wordpress/wp-config.php regexp=password_here replace=1234' -b
192.168.100.11 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"msg": "1 replacements made"
}
wp-config.php 파일의 password_here 부분을 wordpress 로 대치해준다.
잘 설치된 것을 확인할 수 있다.
ansible ad-hoc 으로 맨 처음 상태로 되돌아가기
서비스 종료, 워드프레스 소스 삭제, 패키지 삭제, db 데이터 삭제, remi-repo 삭제 및 비활성화
- ansible wp -m service -a “name=httpd state=stopped” -b
- ansible wp -m service -a “name=mariadb state=stopped” -b
- ansible wp -m file -a “path=/var/www/html/wordpress state=absent” -b
- ansible wp -m file -a “path=/home/vagrant/wordpress-5.9.3.tar.gz state=absent” -b
- yum autoremove httpd 명령어를 사용하면 httpd 의존성 관련된 모든 패키지들을 전부 삭제해준다. httpd 만 삭제할 것인지 httpd 와 관련된 모든 패키지들을 삭제할 것인지 구분해야 한다. 여기서는 autoremove 로 삭제하는 것이 맞다. ansible wp -m yum -a “name=httpd,php,php-mysql,mariadb,mariadb-server,python2-PyMySQL state=absent autoremove=yes” -b
- cd /var/lib/mysql 에 DB 데이터들이 남아있다. ansible wp -m file -a “path=/var/lib/mysql state=absent” -b
- yum repolist → repo list 에 remi-php74 가 남아있다. 즉, remi repo 가 남아있다. /etc/yum.repos.d 에 remi 관련된 파일들이 사라진다. ansible wp -m yum -a “name=remi-release state=absent autoremove=yes” -b
ad-hoc 리턴 밸류
공식 문서 ⇒ https://docs.ansible.com/ansible/2.9/reference_appendices/common_return_values.html