◇Ansibleとは?
OSインストール後、通常はサーバーを手作業で設定しますが、どうしてもミスが生じる場合がありますし、特に複数のサーバーで設定を行う場合はマシンが増えれば増える程手違いが起こる可能性が高くなります。
その為、作業を自動化すると便利なので、最近の現場では複数のサーバーの管理を一度に行える構成管理サーバーを使⽤する場合が多いです。その代表的なツールであるAnsibleをご紹介致します。
構成管理を行えばサーバーの管理者が変わった時も引き継ぎ易いですし、旧サーバーから新サーバーへの移管作業を行う場合も、そのまま使える部分もあるかと思います。(無論テストが必須ですが)
一台一台設定を行うのが基本かと思っていた私も初めてAnsibleを使用した時は衝撃を受けました(苦笑)。
構成管理ツールには、いろいろなソフトウェアが存在しますが、その中でも今回ご使用させて頂きますAnsibleはSSH 接続が可能であれば、管理対象のマシンにエージェントを常駐させておく必要がなく、比較的手軽に構成管理を行えます。
◇本稿を実施する前の準備
本稿では2つの仮想マシンを使用します。
本稿では構成管理サーバーを使用してWebサーバーの構成を行います。Webサーバーは「サーバー構築の前にVirtualBoxの便利機能を使う」を参考に予めCentOS Stream9がインストールされたクローンマシンを作成しておいてください。
◇サーバーの設計
本稿では以下の設定でサーバーを構成します。ご自分の環境により設定を変更してください。
・構成管理(Ansible)サーバー
ホスト名:ANS
アドレス:192.168.128.101/24
ゲートウェイ:192.168.128.1
DNS:192.168.128.1
・Webサーバー
ホスト名:www1
アドレス:192.168.128.102/24
ゲートウェイ:192.168.128.1
DNS:192.168.128.1
IPアドレスとホスト名の設定は、「CentOS Stream9のネットワーク設定」の稿を参考に設定してください。
◇Ansibleで管理するWebサーバーの構成
本稿のWebサーバーではAnsible が以下の順で構成を行います。
①httpdをインストール
②Ansible サーバーからhtmlファイルをWebサーバーにコピーしパーミッション設定
③シェルを実行し、htmlファイルに文を追記。
④httpdの起動と自動起動設定
⑤firewallでhttpをブロックしない
⑥firewallのリロード
⑦seboolのhttpd_enable_homedirsをオンにする
⑧Webサーバーに設置したhtmlファイルにアクセス出来るかチェックを行う
◇テスト用のHTMLファイルの作成。
WebサーバーにコピーするHTMLファイルを作成します。中身は空白で構いません。
[root@ANS ~] # touch /root/test1.html
◇Ansibleのインストールと設定。
以下のコマンドでansibleと関連ツールをインストールします。
[root@ANS ~]# dnf install sshpass -y
[root@ANS ~]# dnf install epel-release -y
[root@ANS ~]# dnf install ansible -y
[root@ANS ~]# cp -p /etc/ansible/hosts{,.org}
以下のファイルの末尾に以下の内容を追記します。
[root@ANS ~]# vi /etc/ansible/hosts
[www1]
192.168.128.102 #←構成管理対象のWebサーバーのアドレス。
[root@ANS ~]# cp -p /etc/ansible/ansible.cfg{,.org}
[root@ANS ~]# vi /etc/ansible/ansible.cfg
[defaults]
#実行時に参考するホストの記載ファイルを追記します
inventory = /etc/ansible/hosts
[ssh_connection]
# 以下を一行で追記してください。
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
・ymlファイルの作成
以下の内容のymlファイルを新規作成します。Tabキーのインデントは使わず、空白キーを使用して空白を調整してください。尚、今回はWebサーバーの構成管理なので、例としてwww.ymlというファイル名で作成していますが、ファイル名は任意で構いません。ですが拡張子は必ず.ymlで作成してください。
ymlファイルの内容は➀~⑧を順を追ってやっています。
[root@ANS ~] # vi /etc/ansible/roles/www.yml ←Ansibleで使用ymlファイル作成
- hosts: www1
tasks:
- name: httpd install
dnf:
name: httpd
state: present
- name: Copying HTML file.
copy:
src: /root/test1.html
dest: /var/www/html
mode: 644
- name: Modifying HTML file.
shell: |
set -x
echo "Ansible test ok!" >> /var/www/html/test1.html
- name: httpd up
service:
name: httpd
state: started
enabled: yes
- firewalld:
zone: public
service: http
state: enabled
permanent: true
immediate: yes
- name: Reload firewalld
systemd:
name: firewalld
state: reloaded
- name: Set httpd_enable_homedirs
ansible.posix.seboolean:
name: httpd_enable_homedirs
state: yes
persistent: yes
- name: Checking httpd service.
uri: url=http://192.168.128.102/test1.html
上記ymlファイルを作成後、以下のコマンドでplaybookの文法に誤りが無いかチェックしてください。
[root@ANS ~]# ansible-playbook -i hosts /etc/ansible/roles/www.yml --syntax-check
playbook: www.yml
上記の様に表示されれば文法は間違えていないハズなので、続いて以下のコマンドで実行します。
[root@ANS ~]# ansible-playbook /etc/ansible/roles/www.yml -k ←kオプションでパスワード入力出来ます。
SSH password: ←管理先サーバーのパスワードを入力します。
PLAY [www1] ********************************************************************
TASK [Gathering Facts] *********************************************************
[WARNING]: Platform linux on host 192.168.128.102 is using the discovered
Python interpreter at /usr/bin/python3.9, but future installation of another
Python interpreter could change the meaning of that path. See
https://docs.ansible.com/ansible-
core/2.12/reference_appendices/interpreter_discovery.html for more information.
ok: [192.168.128.102] ←このTASKの警告はAnsible 5.8では表示されません。
TASK [httpd install] ***********************************************************
changed: [192.168.128.102]
TASK [Copying HTML file.] ******************************************************
changed: [192.168.128.102]
TASK [Modifying HTML file.] ****************************************************
changed: [192.168.128.102]
TASK [httpd up] ****************************************************************
changed: [192.168.128.102]
TASK [firewalld] ***************************************************************
changed: [192.168.128.102]
TASK [Reload firewalld] ********************************************************
changed: [192.168.128.102]
TASK [Set httpd_enable_homedirs] ***********************************************
changed: [192.168.128.102]
TASK [Checking httpd service.] *************************************************
ok: [192.168.128.102]
PLAY RECAP *********************************************************************
192.168.128.102 : ok=9 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
「PLAY RECAP」の「ok」はymlファイルの通り構成されており、「changed」はymlファイルの構成に変更された事を示します。
チェックの結果「PLAY RECAP」で問題が無い事を確認出来たので、次は実際に構成を開始します。
これでWebサーバーの構成が終了しました。次は実際に構成が行われているのか確認を行います。
◇設定と動作の確認。
構成を行ったWebサーバーにログインし、設定が反映されている事と動作を確認します。
[root@www1 ~]# dnf list httpd #←httpdがインストールされている事を確認。
メタデータの期限切れの最終確認: 0:03:58 時間前の 2022年05月26日 19時23分20秒 に実施しました。
インストール済みパッケージ
httpd.x86_64 2.4.51-8.el9 @appstream
[root@www1 ~]# systemctl status httpd #←httpdサーバーの起動を確認。
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor pre>
Active: active (running) since Thu 2022-05-26 19:23:37 JST; 5min ago #←active (running)である事を確認します。
(略)
httpdサービスの起動を確認したらCtrl+Cキーでsystemctl status の確認を終了します。
・以下のコマンドでhttpdの自動起動を確認。
[root@www1 ~]# systemctl is-enabled httpd
enabled #←enabledならばサーバー起動時に自動起動する。
・以下のコマンドでfirewallのリストを確認。
[root@www1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3
sources:
services: cockpit dhcpv6-client http ssh #←httpが含まれる事を確認
(略)
・以下のコマンドでhttpd がホームディレクトリーを読み取ることを許可します。
[root@www1 ~]# getsebool -a | grep httpd | grep 'on$'
httpd_builtin_scripting --> on
httpd_enable_cgi --> on
httpd_enable_homedirs --> on ←この行を確認。
上記構成が確認出来ましたら以下の手順で構成管理サーバー、またはホストPCのブラウザからWebサーバーにアクセスします。
・構成管理サーバー画面の「アクティブティ」をクリックしFirefoxのアイコンをクリックし起動します。
・ブラウザのURLにhttp://192.168,128.102/test1.htmlを入力してください。
「Ansible test ok!」が表示されれば動作確認はOKです。