vsftpd と Apache の設定を削除しLinuxユーザも削除する

以前取り上げた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

ユーザ削除

ファイル削除

参考

Linuxコマンド

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。