以前取り上げたAnsible を使って FTPユーザの作成と Apache の仮想サイトの設定をするの逆方向バージョンです。
つまり、
- Linuxユーザを削除
- 上記ユーザを vsftpdユーザ からも削除
- Apache の仮想サイトの設定と該当ディレクトリのデータを全て削除
を行うタスクを作ろう、と考えました。
これは、上記のプレイブックを一時的なテスト環境として作った後、削除することも往々にしてあり、手動で削除するのが面倒になってきたからです。
前提
テストに利用するサーバは前の記事と同じサーバで、該当プレイブックによって vsftpd や Apache が設定されている、という状況を想定しています。
設定
ディレクトリ階層
PROJECT_ROOT/
├ workspace/
│ ├ entrypoint.sh
│ └ ansible/
│ ├ (諸々元のプレイブックと同じ構造)
│ ├ main.yml // Ansible の設定用 playbook
│ └ resset.yml // 今回追加した削除用タスク
│
├ docker-compose.yml
└ Dockerfile
ほぼ前の記事の通り、というか同じプロジェクトをそのまま流用しています。元々の意図が設定用プレイブックに対して設定を元に戻すためのものなので、同じ場所にあった方が都合は良いと考えました。
ただ、リセットするためのタスクは設定用タスクほど複雑ではないのでタスクを分割せずに1つのファイルに既述することにしました。
ansible/vars/param_vars.yml
username: USERNAME
password: Password1234
rootdirectory: sample_site
domain: www.sample.jp
ipaddress: 192.0.2.1
portnum: 80
上記ディレクトリ構造より、設定用のプレイブックに使用する変数ファイルがあるため、これをそのまま流用します。
ansible/resset.yml
- name: Remove vsftpd and httpd settings
become: yes
become_user: ADMIN_USER
become_method: su
hosts:
- add_vhost_servers
vars_files: ./vars/param_vars.yml
tasks:
- name: Remove user
user:
name: "{{ username }}"
state: absent
remove: yes
- name: Remove user in vsftpd user_list
blockinfile:
path: /etc/vsftpd/user_list
create: yes
insertafter: EOF
marker: "# {mark} ANSIBLE basic setup: {{ username }}"
block: ""
- name: Remove user_conf file
file:
path: "/etc/vsftpd/user_conf/{{ username }}"
state: absent
- name: Restart vsftpd
systemd:
name: vsftpd.service
state: restarted
daemon_reload: yes
- name: Remove Apache virtual site data
file:
path: "/var/www/{{ rootdirectory }}"
state: absent
- name: Remove Apache conffile
file:
path: "/etc/httpd/conf.d/{{ rootdirectory }}.conf"
state: absent
- name: Restart httpd
systemd:
name: httpd.service
state: reloaded
daemon_reload: yes
今回のメイン。削除用のタスクです。
やっていることは冒頭で記した通り。
動作確認
削除用プレイブックを走らせる前
# less /etc/passwd
## 略
USERNAME:x:
設定用プレイブックで追加されたユーザがいることを確認。
# less /etc/vsftpd/user_list
## 略
# BEGIN ANSIBLE basic setup: USERNAME
USERNAME
# END ANSIBLE basic setup: USERNAME
ここにも。
# ls -al /etc/vsftpd/user_conf/
合計 4
drwxrwxr-x 2 ADMIN_USER ADMIN_USER 23 MM月 DD hh:ii .
drwxr-xr-x 3 ADMIN_USER ADMIN_USER 150 MM月 DD hh:ii ..
-rw-rw-r-- 1 ADMIN_USER ADMIN_USER 107 MM月 DD hh:ii USERNAME
# less /etc/vsftpd/user_conf/USERNAME
# BEGIN ANSIBLE basic setup: USERNAME
local_root=/var/www/sample_site
# END ANSIBLE basic setup: USERNAME
ここにも。
# ls -al /var/www/
合計 4
drwxr-xr-x 5 ADMIN_USER ADMIN_USER 51 MM月 DD hh:ii .
drwxr-xr-x. 22 ADMIN_USER ADMIN_USER 4096 MM月 DD hh:ii ..
drwxr-xr-x 2 ADMIN_USER ADMIN_USER 6 MM月 DD hh:ii cgi-bin
drwxr-xr-x 3 ADMIN_USER ADMIN_USER 35 MM月 DD hh:ii html
drwxr-xr-x 3 ADMIN_USER ADMIN_USER 17 MM月 DD hh:ii sample_site
# ls -al /etc/httpd/conf.d/
合計 36
drwxr-xr-x 2 ADMIN_USER ADMIN_USER 137 MM月 DD hh:ii .
drwxr-xr-x 5 ADMIN_USER ADMIN_USER 92 MM月 DD hh:ii ..
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 366 MM月 DD hh:ii README
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 2926 MM月 DD hh:ii autoindex.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii php.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 9443 MM月 DD hh:ii ssl.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii userdir.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 824 MM月 DD hh:ii welcome.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 439 MM月 DD hh:ii sample_site.conf
# less /etc/httpd/conf.d/sample_site.conf
<VirtualHost 192.0.2.1:80>
DocumentRoot "/var/www/sample_site/web"
ServerName www.sample_site.jp
ServerAlias sample_site.jp
ScriptAlias /cgi-bin/ /var/www/sample_site/web/cgi-bin/
RewriteEngine on
RewriteCond %{HTTP_HOST} ^sample_site\.jp$
RewriteRule ^(.*)$ http://www.sample_site.jp$1 [R=301,L]
<Directory "/var/www/sample_site/web">
allow from all
AllowOverride All
Options FollowSymLinks
Require all granted
</Directory>
</VirtualHost>
Apache 側にも仮想サイトの設定があり、仮想サイト用のディレクトリが切られていることを確認。
FTPでログインしたり、 hosts
で名前解決して仮想サイトにアクセスできることを確認。
一通りプレイブックの設定通りです。
削除用プレイブックを走らせる
Dry run
# ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/reset.yml -u SSH_REMOTEUSER --private-key="/root/.ssh/PRIVATE_KEY" -K --check
BECOME password:
PLAY [Remove vsftpd and httpd settings] ***************************************************************************
TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1]
TASK [Remove user] ************************************************************************************************changed: [192.0.2.1]
TASK [Remove user in vsftpd user_list] ****************************************************************************changed: [192.0.2.1]
TASK [Remove user_conf file] **************************************************************************************changed: [192.0.2.1]
TASK [Restart vsftpd] *********************************************************************************************changed: [192.0.2.1]
TASK [Remove Apache virtual site data] ****************************************************************************changed: [192.0.2.1]
TASK [Remove Apache conffile] *************************************************************************************changed: [192.0.2.1]
TASK [Restart httpd] **********************************************************************************************changed: [192.0.2.1]
PLAY RECAP ********************************************************************************************************192.0.2.1 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
まずは Dry run でエラーが出ないことを確認。大丈夫そうです。
本番
# ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/reset.yml -u SSH_REMOTEUSER --private-key="/root/.ssh/PRIVATE_KEY" -K
BECOME password:
PLAY [Remove vsftpd and httpd settings] ***************************************************************************
TASK [Gathering Facts] ********************************************************************************************ok: [192.0.2.1]
TASK [Remove user] ************************************************************************************************changed: [192.0.2.1]
TASK [Remove user in vsftpd user_list] ****************************************************************************changed: [192.0.2.1]
TASK [Remove user_conf file] **************************************************************************************changed: [192.0.2.1]
TASK [Restart vsftpd] *********************************************************************************************changed: [192.0.2.1]
TASK [Remove Apache virtual site data] ****************************************************************************changed: [192.0.2.1]
TASK [Remove Apache conffile] *************************************************************************************changed: [192.0.2.1]
TASK [Restart httpd] **********************************************************************************************changed: [192.0.2.1]
PLAY RECAP ********************************************************************************************************192.0.2.1 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
続いて本番実行。完了しました。
削除用プレイブックを走らせた後
それでは、念のため確認していきたいと思います。
# less /etc/passwd
設定したユーザが消えていることを確認。
# ls -al /etc/vsftpd/user_conf/
合計 0
drwxrwxr-x 2 ADMIN_USER ADMIN_USER 6 MM月 DD hh:ii .
drwxr-xr-x 3 ADMIN_USER ADMIN_USER 150 MM月 DD hh:ii ..
# less /etc/vsftpd/user_list
## 略
nobody
vsftpd の設定も消えています。OK。
# ls -al /var/www/
合計 4
drwxr-xr-x 4 ADMIN_USER ADMIN_USER 33 MM月 DD hh:ii .
drwxr-xr-x. 22 ADMIN_USER ADMIN_USER 4096 MM月 DD hh:ii ..
drwxr-xr-x 2 ADMIN_USER ADMIN_USER 6 MM月 DD hh:ii cgi-bin
drwxr-xr-x 3 ADMIN_USER ADMIN_USER 35 MM月 DD hh:ii html
# ls -al /etc/httpd/conf.d/
合計 32
drwxr-xr-x 2 ADMIN_USER ADMIN_USER 114 MM月 DD hh:ii .
drwxr-xr-x 5 ADMIN_USER ADMIN_USER 92 MM月 DD hh:ii ..
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 366 MM月 DD hh:ii README
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 2926 MM月 DD hh:ii autoindex.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii php.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 9443 MM月 DD hh:ii ssl.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 1252 MM月 DD hh:ii userdir.conf
-rw-r--r-- 1 ADMIN_USER ADMIN_USER 824 MM月 DD hh:ii welcome.conf
仮想サイトのディレクトリは丸ごと消えて、設定ファイルも消えました。OKです。
当然、FTPでログインできなくなっていますし、ブラウザでアクセスすると仮想サイトが消えたので代理の仮想サイトが応答してきました。OKです。
以上より、一通り意図通りの動作になったことを確認できました。
参考
Ansible
ユーザ削除
ファイル削除
- [Ansible] file モジュールの基本的な使い方(ファイルやディレクトリの操作) – てくなべ (tekunabe)
- ansible のモジュール(ファイル操作等)をまとめてみました – Qiita
- Ansibleのfileモジュールでディレクトリをabsentするのは危険 – grep Tips *
参考
- Ansible Playbookでユーザ管理(登録・削除)をまるっとやる – SMARTCAMP Engineer Blog
- Ansibleの新モジュール replace(置換)を使ってみた。 – Qiita
- Ansibleでテキスト置換を行ういくつかの方法 | uuutee.log
- Ansible で複数行の文字列置換 – akishin999の日記