Linux システムで httpd の自動インストールと構成を Ansible で実装する方法

Linux システムで httpd の自動インストールと構成を Ansible で実装する方法

1. Ansibleのプレイブックを使用してhttpdを自動的にインストールする

1) まず、Ansibleのhostsファイルを設定して、対応するホストがAnsibleで制御できるようにします。

ヒント: ホスト リストで制御ホスト アドレスを設定しましたが、ホストの生存を検出するために Ansible ping モジュールを直接使用しましたが、権限が拒否されたことが示されました。プロンプトでは、使用する認証を指定するように指示されます。デフォルトでは、Ansible は SSH キーで認証されるため、Ansible のホスト リストに制御ホストの IP アドレスを設定するだけでは不十分です。KEY 認証に基づいて SSH を設定する必要もあります。

2) SSHキーに基づいて認証できるように制御ホストを構成する

[root@test ~]# ip を enp2s0 とする
2: enp2s0: <BROADCAST、MULTICAST、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast 状態 UP グループ デフォルト qlen 1000
 リンク/イーサ 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.99/24 brd 192.168.0.255 スコープ グローバル noprefixroute enp2s0
 valid_lft 永久 preferred_lft 永久
 inet 172.16.1.2/16 brd 172.16.255.255 スコープ グローバル noprefixroute enp2s0:0
 valid_lft 永久 preferred_lft 永久
 inet6 fe80::230:18ff:fe51:af3c/64 スコープ リンク
 valid_lft 永久 preferred_lft 永久
[root@test ~]# ssh-keygen
公開/秘密 RSA キー ペアを生成しています。
キーを保存するファイル (/root/.ssh/id_rsa) を入力します。
ディレクトリ '/root/.ssh' を作成しました。
パスフレーズを入力してください (パスフレーズがない場合は空白):
同じパスフレーズをもう一度入力してください:
あなたの識別情報は /root/.ssh/id_rsa に保存されました。
公開鍵は /root/.ssh/id_rsa.pub に保存されました。
キーのフィンガープリントは次のとおりです。
SHA256:UORxi5JhiKDBOhZP3FsbsZfyCjqUcjwqdl1qcnTyGsw ルート@テスト
キーのランダムアート画像は次のとおりです。
+---[RSA 2048]----+
|+.....oo= . |
|.+.oo B.+.. |
|o + *o=o. |
|o.....++|
|.o * + oS. |
| = BB . |
|.o = E o |
|o . = o |
| . |
+----[SHA256]-----+
[root@test ~]# ssh-copy-id 192.168.0.99 -p 41319
/bin/ssh-copy-id: INFO: インストールされるキーのソース: "/root/.ssh/id_rsa.pub"
ホスト '[192.168.0.99]:41319 ([192.168.0.99]:41319)' の信頼性を確立できません。
ECDSA キーのフィンガープリントは SHA256:W2pD2PA2K9tGKGVK+weiINcVESkUaHjsTI263OVqBh4 です。
ECDSA キーのフィンガープリントは MD5:3a:f8:c9:b1:63:c6:c1:ae:e0:6e:e2:ca:17:4a:20:7a です。
本当に接続を続行しますか (はい/いいえ)? はい
/bin/ssh-copy-id: INFO: すでにインストールされているキーを除外するために、新しいキーでログインしようとしています
/bin/ssh-copy-id: INFO: インストールするキーが 1 つ残っています -- ここでプロンプトが表示された場合は、新しいキーをインストールしてください
[email protected]のパスワード:
 
追加されたキーの数: 1
 
ここで、「ssh -p '41319' '192.168.0.99'」を使用してマシンにログインしてみます。
必要なキーだけが追加されたことを確認します。
 
[root@test ~]# scp -r .ssh 192.168.0.10:~/
ホスト '192.168.0.10 (192.168.0.10)' の信頼性を確立できません。
ECDSA キーのフィンガープリントは SHA256:EG9nua4JJuUeofheXlgQeL9hX5H53JynOqf2vf53mII です。
ECDSA キーのフィンガープリントは MD5:57:83:e6:46:2c:4b:bb:33:13:56:17:f7:fd:76:71:cc です。
本当に接続を続行しますか (はい/いいえ)? はい
警告: '192.168.0.10' (ECDSA) が既知のホストのリストに永続的に追加されました。
[email protected]のパスワード:
id_rsa 100% 1675 677.0KB/秒 00:00 
id_rsa.pub 100% 391 207.6KB/秒 00:00 
既知のホスト 100% 356 12.2KB/秒 00:00 
承認されたキー 100% 391 12.6KB/秒 00:00 
[root@test ~]#

ヒント: SSH キーベースの認証は、Ansible ホストで実行する必要があります。Ansible ホストで SSH キーのペアを生成し、ssh-copy-id を使用して公開キーをローカル マシンにコピーして authorized_keys ファイルを生成し、.ssh ディレクトリをリモート クライアントにコピーします。このようにして、Ansible ホストはパスワードなしでキーに基づいて SSH 経由でリモート クライアントにログインでき、リモート クライアントもパスワードなしで SSH 経由で Ansible ホストにログインできるため、双方向の SSH キーベースの認証が実現します。一方向の SSH キーベースの認証のみが必要な場合は、Ansible ホストでキー ペアを生成し、公開キーを相手に送信できます。 SSHキーベースの認証の詳細については、私のブログhttps://www.jb51.net/article/180381.htmを参照してください。

テスト: Ansible ホストを使用して SSH 経由でリモート クライアント ホストに接続する

[root@test ~]# ssh 192.168.0.10
最終ログイン: 2020年1月27日月曜日 04:58:46 192.168.0.99から
[root@test-centos7-node1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 状態 UNKNOWN qlen 1
 リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 スコープ ホスト lo
 valid_lft 永久 preferred_lft 永久
 inet6 ::1/128 スコープホスト
 valid_lft 永久 preferred_lft 永久
2: ens33: <BROADCAST、MULTICAST、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast 状態 UP qlen 1000
 リンク/イーサ 00:0c:29:f2:82:0c brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.10/24 brd 192.168.0.255 スコープ グローバル ens33
 valid_lft 永久 preferred_lft 永久
 inet6 fe80::20c:29ff:fef2:820c/64 スコープ リンク
 valid_lft 永久 preferred_lft 永久
[root@test-centos7-node1 ~]# 終了
192.168.0.10 へのログアウト接続が閉じられました。
[root@test ~]#

ヒント: Ansible ホストはパスワードなしでリモート ホストに正常にログインできることがわかります。次に、Ansible ping モジュールを使用して、制御対象ホストの生存を検出します。

ヒント: Ansible の ping モジュールを使用して、リモート ホストの生存を検出していることがわかります。返されるステータスは SUCCESS で、データは pong であり、これはリモート ホストが生存していることを意味します。

この時点で、Ansible環境は準備完了です。次に、httpdをインストールするためのプレイブックを作成します。

[root@test ~]# cat install_httpd.yml
---
 - ホスト: ウェブサーズ
 リモートユーザー: ルート
 
 タスク:
 - 名前: epel ファイルをコピー
 コピー: src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo
 - 名前: httpd をインストール
 yum: 名前=httpd
 - 名前: httpdを起動する
 サービス: 名前=httpd 状態=開始 有効=はい
 
 
[root@test ~]# ansible-playbook -C install_httpd.yml
 
PLAY [websers] ****************************************************************************************************************************
 
タスク [epel ファイルをコピー] *****************************************************************************************************************
変更: [192.168.0.10]
 
タスク [httpd をインストールする] ****************************************************************************************************************
変更: [192.168.0.10]
 
タスク [httpd を起動] ************************************************************************************************************************
変更: [192.168.0.10]
 
プレイの要約 ********************************************************************************************************************************
192.168.0.10 : 正常=3 変更=3 到達不能=0 失敗=0 
 
[root@test ~]#

ヒント: 上記のプレイブックの主な内容は、ローカルのyumソースをリモートサーバーにコピーし、次にyumを介してhttpdパッケージをインストールし、最後にhttpdを起動することです。プレイブックを書いた後、ansible-playbook -C install_httpd.ymlコマンドを使用して、書いたプレイブックをテストします。問題はありません。次に、ansible-playbookを使用してhttpdをインストールします。

[root@test ~]# ansible-playbook install_httpd.yml 
 
PLAY [websers] ****************************************************************************************************************************
 
タスク [epel ファイルをコピー] *****************************************************************************************************************
変更: [192.168.0.10]
 
タスク [httpd をインストールする] ****************************************************************************************************************
変更: [192.168.0.10]
 
タスク [httpd を起動] ************************************************************************************************************************
変更: [192.168.0.10]
 
プレイの要約 ********************************************************************************************************************************
192.168.0.10 : 正常=3 変更=3 到達不能=0 失敗=0 
 
[root@test ~]#

ヒント: playbook 上の ansible-playbook の実行ステータスから、成功しています。次に、ブラウザを使用して 192.168.0.10 に直接アクセスし、httpd に正常にアクセスできるかどうかを確認します。正常にアクセスできる場合は、httpd がインストールされていることを意味します。

ヒント: ブラウザで 192.168.0.10 のテストページに直接アクセスできることがわかります。これは、httpd が 192.168.0.10 に正常にインストールされていることを示しています。

2. 2 つの名前ベースの仮想ホストを必要とする httpd サーバーを確立します。

(1)www.X.comの場合、ページファイルディレクトリは/web/vhosts/x、エラーログは/var/log/httpd/x.err、アクセスログは/var/log/httpd/x.accessです。

仮想ホストwww.X.comの新しい設定ファイルを作成します。

[root@test ~]# cat x_com.conf
<仮想ホスト *:80>
 サーバー名 www.X.com
 ドキュメントルート「/web/vhosts/x」
 <ディレクトリ "/web/vhosts/x">
 オプションなし
 上書きを許可しない
 すべて許可が必要
 </ディレクトリ>
 エラーログ "logs/x.err"
 CustomLog "logs/x.access" を組み合わせたもの
</仮想ホスト>
[root@test ~]#

ヒント: Ansible ホスト上に構成ファイルを作成し、Ansible を使用して、対応するホストの対応するディレクトリにファイルをプッシュします。

(2)www.Y.comの場合、ページファイルディレクトリは/web/vhosts/y、エラーログは/var/log/httpd/www2.err、アクセスログは/var/log/httpd/y.accessです。

仮想ホストwww.Y.comの新しい設定ファイルを作成します。

[root@test ~]# cat y_com.conf
<仮想ホスト *:80>
 サーバー名 www.Y.com
 ドキュメントルート「/web/vhosts/y」
 <ディレクトリ "/web/vhosts/y">
 オプションなし
 上書きを許可しない
 すべて許可が必要
 </ディレクトリ>
 エラーログ "logs/www2.err"
 CustomLog "logs/y.access" を組み合わせたもの
</仮想ホスト>
[root@test ~]#

(3)2つの仮想ホストごとにホームページファイルindex.htmlを作成し、その内容を対応するホスト名にします。

[root@test ~]# cat x_index.html
<h1>www.X.com</h1>
[root@test ~]# cat y_index.html 
<h1>www.Y.com</h1>
[root@test ~]#

ヒント: 上記のファイルが Ansible ホスト上で準備されたら、対応するファイルをリモート ホストに直接プッシュするプレイブックを作成します。

[root@test ~]# cat set_virtualhost_conf_file.yml
---
 - ホスト: ウェブサーズ
 リモートユーザー: ルート
 
 タスク:
 - 名前: mkdir virtualhost documentroot ディレクトリ
 シェル: mkdir -p /web/vhosts/{x,y}
 
 - 名前: x_com.conf をリモートホストにコピーする
 コピー: src=/root/x_com.conf dest=/etc/httpd/conf.d/x_com.conf
 - 名前: x_com インデックス ファイルをコピー
 コピー: src=/root/x_index.html dest=/web/vhosts/x/index.html
 
 - 名前: y_com.conf をリモートホストにコピーする
 コピー: src=/root/y_com.conf dest=/etc/httpd/conf.d/y_com.conf
 - 名前: y_com インデックス ファイルをコピー
 コピー: src=/root/y_index.html dest=/web/vhosts/y/index.html
 
[root@test ~]#

ヒント: 上記のファイルの内容は、主に、作成した構成ファイルを対応するホストの対応するディレクトリにプッシュします。次に、作成したプレイブックに構文上の問題がないか確認しましょう。

[root@test ~]# ansible-playbook -C set_virtualhost_conf_file.yml 
 
PLAY [websers] ****************************************************************************************************************************
 
タスク [mkdir virtualhost documentroot ディレクトリ] ************************************************************************************
スキップ: [192.168.0.10]
 
タスク [x_com.conf をリモートホストにコピー] *********************************************************************************************
変更: [192.168.0.10]
 
タスク [x_com インデックス ファイルをコピー] ********************************************************************************************************
変更: [192.168.0.10]
 
タスク [y_com.conf をリモートホストにコピーする] *********************************************************************************************
変更: [192.168.0.10]
 
タスク [y_com インデックス ファイルをコピー] *********************************************************************************************************
変更: [192.168.0.10]
 
プレイの要約 ********************************************************************************************************************************
192.168.0.10 : 正常=4 変更=4 到達不能=0 失敗=0 
 
[root@test ~]#

ヒント: プレイブックをテストしても問題ありません。次に、プレイブックを実行し、対応するファイルを httpd サーバーにプッシュして、サーバー上で作成した構成ファイルが正しいかどうかを確認します。

[root@test ~]# ansible-playbook set_virtualhost_conf_file.yml
 
PLAY [websers] ****************************************************************************************************************************
 
タスク [mkdir virtualhost documentroot ディレクトリ] ************************************************************************************
 [警告]: mkdir を実行するのではなく、state=directory のファイル モジュールを使用することを検討してください。
 
変更: [192.168.0.10]
 
タスク [x_com.conf をリモートホストにコピー] *********************************************************************************************
変更: [192.168.0.10]
 
タスク [x_com インデックス ファイルをコピー] ********************************************************************************************************
変更: [192.168.0.10]
 
タスク [y_com.conf をリモートホストにコピーする] *********************************************************************************************
変更: [192.168.0.10]
 
タスク [y_com インデックス ファイルをコピー] *********************************************************************************************************
変更: [192.168.0.10]
 
プレイの要約 ********************************************************************************************************************************
192.168.0.10 : 正常=5 変更=5 到達不能=0 失敗=0 
 
[root@test ~]#

ヒント: 上記の戻りステータスから、すべてが成功していることがわかりますが、最初のタスクでは、ファイル モジュールを使用してディレクトリを作成するように求められます。これはより適切です。次に、ansible シェル モジュールを使用して、リモート サーバー上の構成ファイルの構文が正しいかどうかを確認します。

[root@test ~]# ansible websers -m shell -a 'httpd -t'
192.168.0.10 | 成功 | rc=0 >>
AH00558: httpd: fe80::20c:29ff:fef2:820c を使用して、サーバーの完全修飾ドメイン名を確実に特定できませんでした。このメッセージを抑制するには、'ServerName' ディレクティブをグローバルに設定してください。
構文OK
 
[root@test ~]#

ヒント: リモート ホスト上の httpd 構成ファイルの構文をチェックするために、Ansible を使用します。servername がないというプロンプトが表示されます。このプロンプトは無視できます。対処する必要がある場合は、httpd のメイン構成ファイルで ServerName を見つけて、対応する servername を構成します。次に、httpd を再起動して、クライアント上の 2 つの仮想ホストにアクセスします。

[root@test ~]# ansible websers -m shell -a 'systemctl restart httpd'
192.168.0.10 | 成功 | rc=0 >>
 
 
[root@test ~]#

www.X.com と www.Y.com がリモート ホストに解決されるように、クライアントの /etc/hosts ファイルを変更します。

[root@test ~]# cat /etc/hosts
127.0.0.1 ローカルホスト ローカルホスト.ローカルドメイン ローカルホスト4 ローカルホスト4.ローカルドメイン4
::1 ローカルホスト ローカルホスト.ローカルドメイン ローカルホスト6 ローカルホスト6.ローカルドメイン6
192.168.0.10 www.X.com www.Y.com
[root@test ~]#

テスト: curl を使用して 2 つの仮想ホストにそれぞれアクセスし、対応するホームページ ファイルの内容が異なるかどうかを確認します。

[root@test ~]# curl http://www.X.com/index.html
<h1>www.X.com</h1>
[root@test ~]# curl http://www.Y.com/index.html
<h1>www.Y.com</h1>
[root@test ~]#

ヒント: curl を使用してそれぞれの仮想ホストのホームページ ファイルにアクセスし、対応するホームページ ファイルの内容を確認できます。もちろん、Windows ホスト ファイルを変更し、対応する解析済みコンテンツをそこに書き込んでから、次に示すように Windows ブラウザーを使用することもできます。

ヒント: Windowsでhostsファイルを見つけて、対応するレコードを次のように追加します。

ヒント: 次に、Windowsブラウザを使用して次の2つの仮想ホストにアクセスします。

次に、httpd サーバーのログが生成されたかどうかを確認しましょう。

[root@test ~]# ansible websers -m shell -a 'ls -l /var/log/httpd' 
192.168.0.10 | 成功 | rc=0 >>
総投与量 16
-rw-r--r--。1 ルート ルート 2668 1月 27 06:30 access_log
-rw-r--r--。1 ルート ルート 2940 1月 27 07:34 error_log
-rw-r--r--. 1 ルート ルート 0 1月27日 07:38 www2.err
-rw-r--r--. 1 ルート ルート 500 1月27日 07:52 x.access
-rw-r--r--. 1 ルート ルート 0 1月27日 07:38 x.err
-rw-r--r--. 1 ルート ルート 500 1月27日 07:52 y.access
 
[root@test ~]# ansible websers -m shell -a 'cat /var/log/httpd/x.access'
192.168.0.10 | 成功 | rc=0 >>
192.168.0.99 - - [2020年1月27日:07:39:15 -0500] "GET /index.html HTTP/1.1" 200 20 "-" "curl/7.29.0"
192.168.0.232 - - [2020 年 1 月 27 日:07:52:31 -0500] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36"
192.168.0.232 - - [2020 年 1 月 27 日:07:52:31 -0500] "GET /favicon.ico HTTP/1.1" 404 209 "http://www.x.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36"
 
[root@test ~]# ansible websers -m shell -a 'cat /var/log/httpd/y.access'
192.168.0.10 | 成功 | rc=0 >>
192.168.0.99 - - [2020年1月27日:07:39:19 -0500] "GET /index.html HTTP/1.1" 200 20 "-" "curl/7.29.0"
192.168.0.232 - - [2020 年 1 月 27 日:07:52:48 -0500] "GET / HTTP/1.1" 200 20 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36"
192.168.0.232 - - [2020 年 1 月 27 日:07:52:48 -0500] "GET /favicon.ico HTTP/1.1" 404 209 "http://www.y.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML、Gecko など) Chrome/69.0.3497.100 Safari/537.36"
 
[root@test ~]#

ヒント: 対応する名前のログ ファイルが httpd サーバー上に生成されていることがわかります。

要約する

上記は、Linux システム上で ansible による httpd の自動インストールと構成を実現するためにエディターが紹介した方法です。皆様のお役に立てれば幸いです。

以下もご興味があるかもしれません:
  • LinuxシステムのAnsible自動運用保守導入方法
  • Linux軽量自動運用・保守ツールAnsibleを徹底分析
  • Linuxの自動運用・保守ツールAnsibleの使い方を詳しく解説

<<:  React Nativeでaxiosを使用してネットワークリクエストを行う方法

>>:  MySQL マスタースレーブ同期における server-id の例の詳細な説明

推薦する

vite2.0 設定学習の詳しい説明(typescript 版)

導入悠宇希の原文です。 vite は Vue CLI に似ています。vite も、基本的なプロジェク...

Javascript 構造化代入の詳細

目次1. 配列の分解2. オブジェクトの分解3. 不完全な解体4. 分割代入を使用して変数交換を実装...

Linux システムの最適化 (カーネルの最適化) に関するいくつかの提案

スワップを無効にするサーバーがデータベース サービスまたはメッセージ ミドルウェア サービスを実行し...

MySQL 5.7 でブロックポジショニング DDL の問題を解決する

前回の記事「MySQL テーブル構造の変更、メタデータ ロックを知っておく必要があります」では、MD...

Dockerはmacvlanをベースにホスト間コンテナ通信を実装する

2 台のテスト マシンを見つけます。 [root@docker1 centos_zabbix]# d...

ページングのどのページでMySQLのレコードをクエリするか

序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...

MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...

CSS最適化スキルの自己実践体験

1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...

ホストがアクセスできるようにMySQLの権限を変更する方法

mysqlのリモートアクセス権を有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

JavaScript の基本演算子

目次1. オペレーター要約する1. オペレーター演算子は、代入、比較、算術演算などの機能を実装するた...

Navicat Premium15 でクラウド サーバーに接続する際のデータベースの問題と落とし穴

クラウドサーバーを使用するとデータベースに接続できる場合もありますが、Navicat Premium...

MySQLの認証コマンドgrantの使い方

この記事の例は MySQL 5.0 以降で実行されます。ユーザー権限を付与するための MySQL コ...

Vue の基本 MVVM、テンプレート構文、データバインディング

目次1. Vueの概要Vue公式サイトMVVM アーキテクチャ パターンVue の紹介2. Vueを...

Vue のリスナーの基本的な使用例

目次序文1. リスナーの基本的な使い方2. リスナー形式3. ページに入るとすぐに監視とディープモニ...

GZIP 圧縮 Tomcat と Web パフォーマンスの改善プロセス図

1. はじめに最近、あるプロジェクトに取り組んでいたのですが、サーバーからクライアントに返される J...