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 の例の詳細な説明

推薦する

コンピュータが予期せずシャットダウンした後、VMware で Linux がインターネットに接続できない問題の解決策

問題の説明: Linux システムのネットワーク カード ファイル /etc/sysconfig/n...

H5でクリックされたときにaタグの背景色をキャンセルする方法

1. モバイル端末でクリックされたときにタグの青色を解除する { -webkit-tap-highl...

Vueはユーザーログイン切り替えを実装します

この記事では、ユーザーのログイン切り替えを実現するためのVueの具体的なコードを例として紹介します。...

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

MySQL で指定した桁数の乱数を生成する方法と、バッチで乱数を生成する方法

1. まず、よく使われるMySQL関数をいくつか紹介しますRAND() は 0 から 1 (0<...

Docker データボリュームの一般的な操作コードの例

開発者が Dockerfile を使用してイメージをビルドする場合は、イメージをビルドするときにデー...

IE7 互換モードで IE8 を有効にするコード

最も人気のあるタグはIE8ですブラウザベンダーはバージョンアップデートのリリースに躍起になっている一...

ReactのsetStateがマクロタスクなのかマイクロタスクなのかについて詳しく話しましょう

目次序文面接官は適切な質問をしていますか? § React は setState をどのように制御し...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

mysqladmin を使用して MySQL インスタンスの現在の TPS と QPS を取得する方法

mysqladmin は管理と操作を行う公式の mysql クライアント プログラムです。MySQL...

JS はシンプルな todoList (メモ帳) 効果を実装します

メモ帳プログラムは、HTML + CSS + JavaScript の 3 つの主要なフロントエンド...

Vueプロジェクトをパッケージ化してリリースする手順

目次1. 開発環境から本番環境への移行2. 統一されたリクエストパスを設定する3. パッケージ化コマ...

MySQL 内部結合の使用例 (必読)

文法規則 列名を選択 テーブル名1から INNER JOIN テーブル名2 ON テーブル名1.列名...

Docker の 4 つのネットワーク タイプの主な例

4 つのネットワーク タイプ:なし: コンテナのネットワーク機能を一切設定しません。--net=no...

elementui の el-popover スタイルの変更が有効にならない問題の解決策

element-uiを使用する場合、el-popoverというよく使われるコンポーネントがありますが...