[Ansible] Ad-hoc 으로 하나의 VM에 Wordpress 구현

728x90

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 삭제 및 비활성화

  1. ansible wp -m service -a “name=httpd state=stopped” -b
  2. ansible wp -m service -a “name=mariadb state=stopped” -b
  3. ansible wp -m file -a “path=/var/www/html/wordpress state=absent” -b
  4. ansible wp -m file -a “path=/home/vagrant/wordpress-5.9.3.tar.gz state=absent” -b
  5. 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
  6. cd /var/lib/mysql 에 DB 데이터들이 남아있다. ansible wp -m file -a “path=/var/lib/mysql state=absent” -b
  7. 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

728x90