🔜Ansibleとは?🔚
Ansible は IT 自動化ツールです。主な適用シーンには、システムの構成、ソフトウェアのデプロイ、継続的なリリース、およびサービスを停止せずにスムーズにロールアウト更新するための高度なタスクオーケストレーションがあります。
Ansible はオープンソースの自動化を提供し、複雑さを軽減し、どこでも実行できます。Ansible を使用すると、ほぼすべてのタスクを自動的に実行できます。
アーキテクチャ#
Ansible
:Ansible のコアプログラム。
HostInventory
:Ansible が管理するホスト情報を記録し、ポート、パスワード、IP などを含みます。
Playbooks
:「プレイブック」YAML 形式のファイルで、複数のタスクが 1 つのファイルに定義され、ホストがどのモジュールを呼び出して機能を完了するかを定義します。
CoreModules
:コアモジュール、主な操作はコアモジュールを呼び出して管理タスクを完了することです。
CustomModules
:コアモジュールでは実行できない機能を完了するためのカスタムモジュールで、複数の言語をサポートします。
ConnectionPlugins
:接続プラグインで、Ansible とホスト間の通信に使用されます。
Ansible の重要な概念#
コントロールノード#
コントロールノードは Ansible CLI ツールを実行するマシンです。これは、管理対象ノード(被管理ノード)との通信を担当し、コマンドを発行し、タスクを実行します。
被管理ノード#
「ホスト」とも呼ばれ、Ansible によって管理されるターゲットデバイスです。Ansible コントロールノードはこれらのマシンでタスクを実行します。被管理ノードには、エージェントをインストールする必要はありません。
インベントリ#
管理対象のターゲットホストまたはノードのリストを含みます。これは、Ansible がターゲットホスト情報を定義するために使用する設定ファイルで、静的または動的なホストリストをサポートします。また、グループを割り当てるためにも使用され、これによりプレイブック内でノードを選択したり、変数を一括で割り当てたりできます。
プレイブック#
プレイブックは Ansible の構成管理の中心部分であり、タスクを自動化するための YAML ファイルのセットです。プレイブックは複数のステップ(ソフトウェアのインストール、サービスの起動など)を実行でき、実行順序やタスクを定義します。
モジュール#
モジュールは Ansible 内で実際のタスクを実行する単位です。これらは高度に再利用可能なコードブロックで、特定の操作(ソフトウェアパッケージのインストール、設定ファイルの変更など)を実行する責任があります。
ロール#
ロールはプレイブックの組織方法の一つで、複数のタスク、ファイル、テンプレート、変数などを完全な機能モジュールとして整理します。ロールは複雑な構成を再利用可能なコンポーネントに分割するのに役立ちます。プレイブック内で使用できる再利用可能な Ansible コンテンツです。
タスク#
タスクはプレイブック内で定義された具体的な操作です。各タスクは通常、特定の操作を実行するために Ansible モジュールを呼び出します。ad-hoc は、一時的にコマンドを実行するシナリオにより適しています。
プラグイン#
Ansible のコア機能を拡張するコードスニペットです。プラグインは、管理ノードへの接続方法(接続プラグイン)、データの操作(フィルタープラグイン)、さらにはコンソールに表示される内容を制御する(コールバックプラグイン)ことができます。
コレクション#
Ansible コンテンツの配布形式で、プレイブック、ロール、モジュール、プラグインを含むことができます。
Ansible タスク実行モード#
Ansible システムは、コントロールホストが被管理ノードに対して操作する方法に基づいて、ad-hoc
とplaybook
の 2 つのカテゴリに分けられます:
- ad-hoc モード(ポイントツーポイントモード)
単一のモジュールを使用し、単一のコマンドをバッチ実行することをサポートします。ad-hoc コマンドは迅速に入力でき、保存する必要のないコマンドです。 - playbook モード(プレイブックモード)
Ansible の主要な管理方法であり、Ansible の強力な機能の鍵です。プレイブックは複数のタスクの集合を通じて一つの機能を完了します。プレイブックは、複数の ad-hoc 操作の構成ファイルを組み合わせたものと理解できます。
Ansible のインストール(centos 7)#
システムのミラーソースを Aliyun ミラーソースに変更します。
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
方法 1:yum を使用してインストール#
epel-release
パッケージとAnsible
をインストールします。
yum install epel-release -y
yum install ansible -y
#バージョンを確認
ansible --version
方法 2:pip を使用してインストール#
yum install python3 python3-devel python3-pip -y
python3 -m pip install ansible
#バージョンを確認
ansible --version
Ansible の設定ファイル#
設定ファイルの読み取り優先順位は次のとおりです:
- 環境変数
ANSIBLE_CONFIG
が指すパスのファイルを確認します(export ANSIBLE_CONFIG=xxxx); - 現在のプロジェクトディレクトリ内の ansible.cfg 設定ファイルを確認します;
~/.ansible.cfg
、現在のディレクトリ内の ansible.cfg 設定ファイルを確認します;/etc/ansible/ansible.cfg
、etc ディレクトリの設定ファイルを確認します。
Ansible のパスワードなしログイン#
root ユーザー#
コントロールノードで ssh のパスワードなしログインを設定し、キーを受動ノードに送信します。
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
ssh-copy-id -i ~/.ssh/id_dsa.pub root@受動ホストip
一般ユーザー#
コントロールノードと被管理ノードの両方に一般ユーザーが必要です。ここではtest
ユーザーを例にします。
#testユーザーを追加し、パスワードを設定
useradd test
passwd test
コントロールノードで ssh のパスワードなしログインを設定し、キーを受動ノードに送信します。
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
ssh-copy-id -i ~/.ssh/id_dsa.pub test@受動ホストip
すべてのホストのtest
ユーザーの sudo 権限を変更します。
visudo
test ALL=(ALL) NOPASSWD: ALL
コントロールノードの設定ファイル/etc/ansible/ansible.cfg
を変更し、一般ユーザーの権限昇格を設定します。
vi /etc/ansible/ansible.cfg
#以下の内容のコメントを解除
[privilege_escalation]
become=True #権限昇格を有効にする
become_method=sudo #sudoを使用してrootユーザーの権限を昇格させる
become_user=root #rootユーザーとしてタスクを実行
become_ask_pass=False #パスワードプロンプトを無効にする
Ansible Ad-Hoc と一般的なモジュール#
Ad-Hoc#
ad-hoc はコマンドラインモードで、実行後に終了します。
コマンドの構文:
ansible 'groups' -m command -a 'df -h'
、その意味は以下の図の通りです:
実行プロセス:
- 設定ファイルを読み込み、デフォルトは
/etc/ansible/ansible.cfg
です; - 対応するホスト設定ファイルを探し、実行するホストまたはグループを見つけます;
- 対応するモジュールファイルを読み込みます。例えば
command
; ansible
を通じてモジュールまたはコマンドを生成し、対応する実行ユーザーの$HOME/.ansible/tmp/ansible-tmp-number/XXX.PY
にファイルを転送します;- リモートホストがそのファイルを実行します;
- 実行結果を返します;
- 一時的な
py
ファイルを削除し、sleep 0
で終了します;
実行状態:
ad-hoc を使用してリモートコマンドを一度実行し、返された結果の色を注意深く観察します:
- 緑:受動ノードが変更されていないことを示します
- 黄:受動ノードに変更が見つかったことを示します
- 赤:障害が発生したことを示し、メッセージを確認してください
一般的なモジュール#
command モジュール#
基本形式と一般的なパラメータ
ansible 'グループ/IP' -m command -a '[パラメータ] コマンド'
パラメータ | オプション | 意味 |
---|---|---|
chdir | chdir /opt | ansible 実行時に指定ディレクトリに切り替え |
creates | creates /data/file | ファイルが存在する場合、実行をスキップ |
removes | removes /data/file | ファイルが存在する場合、実行する |
[root@121 ~]# ansible webservers -m command -a 'ls /root'
192.168.1.122 | CHANGED | rc=0 >>
anaconda-ks.cfg
test.txt
192.168.1.121 | CHANGED | rc=0 >>
anaconda-ks.cfg
test[root@121 ~]# ansible webservers -m command -a 'creates=/root/test.txt hostname'
192.168.1.122 | SUCCESS | rc=0 >>
skipped, since /root/test.txt exists
192.168.1.121 | CHANGED | rc=0 >>
121
[root@121 ~]# ansible webservers -m command -a 'removes=/root/test.txt hostname'
192.168.1.122 | CHANGED | rc=0 >>
122
192.168.1.121 | SUCCESS | rc=0 >>
skipped, since /root/test.txt does not exist
[root@121 ~]#
shell モジュールはパイプをサポートし、command モジュールはサポートしません
shell モジュール#
基本形式と一般的なパラメータ
ansible 'グループ/IP/all' -m shell -a '[パラメータ] コマンド'
ansible webservers -m shell -a 'ps aux | grep sshd'
yum/apt モジュール#
一般的なパラメータ | 機能 |
---|---|
name | インストールするサービス名 |
state=present(デフォルト)/absent | 状態、absent はサービスをアンインストール |
#サービスをインストール
ansible webservers -m yum -a 'name=httpd'
#サービスをアンインストール
ansible webservers -m yum -a 'name=httpd state=absent'
copy モジュール#
基本形式と一般的なパラメータ
ansible < > -m copy -a 'src= dest= [owner= ] [mode=] '
一般的なパラメータ | 機能 | 注意事項 |
---|---|---|
src | 指定されたソースファイルのパス(ディレクトリまたはファイルをサポート) | ソースがディレクトリの場合、ターゲットもディレクトリである必要があります |
dest | 指定されたターゲットファイルの位置(絶対パスである必要があります) | 1. ソースがディレクトリの場合、ターゲットもディレクトリである必要があります 2. ターゲットファイルが既に存在する場合、元の内容が上書きされます |
mode | ターゲットファイルの権限を設定 | |
owner | ターゲットファイルの所有者を設定 | |
group | ターゲットファイルの属グループを設定 | |
content | ターゲットファイルの内容を直接指定 | src パラメータと同時に使用することはできません |
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls -l /opt'
ansible dbservers -a 'cat /opt/fstab.bak'
systemd モジュール#
一般的なパラメータ | 機能 |
---|---|
name | 制御する必要のあるサービス名 |
state | サービスの状態を指定、選択肢:stopped 、started 、reloaded 、restarted 、status |
enabled | サービスを起動時に開始するかどうかを設定、yes は開始、no は開始しない |
daemon_reload | yes に設定すると systemd サービスを再起動し、unit ファイルを有効にします |
ansible webservers -m systemd -a 'name=firewalld state=started'
file モジュール#
基本形式と一般的なパラメータ
ansible < > -m file -a ''
一般的なパラメータ | 機能 | 备注 |
---|---|---|
path | 指定されたリモートサーバーのパス | もdest またはname として書くことができます |
state | 操作の種類を定義:- directory :ディレクトリを作成 - touch :ファイルを作成 - link :シンボリックリンクを作成 - hard :ハードリンクを作成 - absent :ディレクトリ / ファイル / リンクを削除 | |
mode | ファイル / ディレクトリの権限を設定 | デフォルト値:- ファイル 644 - ディレクトリ 755 |
owner | 所有者を設定 | デフォルト root |
group | 属グループを設定 | デフォルト root |
recurse | 再帰的に変更 | yes または no |
src | ターゲットホスト上のソースファイル(copy モジュールとは異なります) |
#/data ディレクトリを作成し、test 属グループに権限を付与
ansible webservers -m file -a 'owner=test group=test mode=644 path=/data state=directory recurse=yes '
group モジュール#
基本形式と一般的なパラメータ
ansible <グループ/IP/all> -m group -a ' '
パラメータ | 機能 | 選択肢 / 説明 |
---|---|---|
name | 指定されたユーザー名(必須パラメータ) | |
state | アカウントの作成または削除を制御 | present :アカウントを作成absent :アカウントを削除 |
system | システムアカウントかどうかを指定 | yes :システムアカウントno :一般アカウント |
gid | グループ ID を指定(ユーザーの所属グループを変更) | 数値形式(例: 1001 ) |
ansible webservers -m group -a 'name=www gid=666 state=present '
user モジュール#
基本形式と一般的なパラメータ
ansible <グループ/IP/all> -m user -a ' '
パラメータ | 機能 | 選択肢 / 説明 |
---|---|---|
name | 指定されたユーザー名(必須) | |
state | アカウントの作成または削除 | present :作成absent :削除 |
system | システムアカウントかどうか | yes :システムアカウント(例: mysql )no :一般アカウント |
uid | ユーザー UID を指定 | 数値(例: 1001 )、一意である必要があります |
group | 基本グループを指定 | グループ名または GID(事前に存在する必要があります) |
groups | 所属する追加グループを指定 | グループ名リスト(例: groups=wheel,admin ) |
shell | デフォルトのシェルを設定 | パス(例: /bin/bash ) |
create_home | ホームディレクトリを作成するかどうか | yes :自動作成no :作成しない(デフォルトの動作はシステムに依存する可能性があります) |
password | ユーザーのパスワードを設定 | 暗号化された文字列を使用することをお勧めします(例: password="$6$暗号化文字列" ) |
remove | ユーザーを削除する際にホームディレクトリも削除するか(state=absent が必要) | yes :ホームディレクトリを削除no :保持 |
1、 www ユーザーを作成し、uid666、基本グループ www を指定
ansible webservers -m user -a 'name=www uid=666 group=www shell=/sbin/nologin create_home=no'
2、 db ユーザーを作成し、基本グループは root、追加グループは adm、sys
ansible webservers -m user -a 'name=db group=root groups=adm,sys append=yes shell=/bin/bash create_home=yes'
3、 ddd ユーザーを作成し、パスワード 123、システムに正常にログインできるようにします。
(1)パスワードを暗号化
ansible localhost -m debug -a "msg={{ '123' | password_hash('sha512', 'salt123') }}"
パラメータ | 効果 | 注意事項 |
---|---|---|
sha512 | ハッシュアルゴリズムを指定(推奨) | sha256 /md5 などをサポートしていますが、sha512 がより安全です 2 |
salt123 | カスタムソルト | ソルトは文字や数字でなければならず、- または_ を含むとハッシュが失敗します(*0 が返されます) 5 |
password_hash フィルター | プレーンテキストのパスワードを暗号化された文字列に変換 | {{ }} を通じて呼び出す必要があり、変数と一緒に使用する必要があります |
localhost | SUCCESS => {
"msg": "$6$salt123$c806NQq6Oqk29MjZdmHxTw7sK3BB1K498o7sZC47UiwQmjx5NJyi5ZhWWGngXf3UfyELHQ1wRJ//oW/Y94azv0"
}
(2)作成コマンドを作成し、作成を完了します。
ansible webservers -m user -a "name=ddd password=最初のステップで取得した暗号化パスワード shell=/bin/bash create_home=yes"
4、 dev ユーザーを作成し、対応する SSH キーを生成します。
ansible webservers -m user -a 'name=dev generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'
mount モジュール#
一般的なパラメータ | 機能 |
---|---|
src | マウントするデバイスまたはパーティションのパスを指定。 |
path | マウント先のターゲットパスを指定。 |
fstype | マウントするファイルシステムのタイプを指定。 |
state | マウント状態を指定、選択肢は mounted 、(一時的なマウント)present (永続的なマウント)、unmounted (一時的なアンマウント)または absent (アンマウント)。 |
opts | マウントオプションやパラメータを指定。 |
#192.168.1.121 の /nfs ディレクトリを 192.168.1.122 の /nfs ディレクトリにマウント
ansible 192.168.1.122 -m mount -a 'src=192.168.1.121:/nfs path=/nfs fstype=nfs opts=defaults state=present '
cron モジュール#
基本形式と一般的なパラメータ
ansible <グループ/IP/all> -m cron -a ' '
一般的なパラメータ | 機能 |
---|---|
minute/hour/day/month/weekday | 分 / 時 / 日 / 月 / 週 |
job | タスクスケジュールが実行するコマンド |
name | タスクスケジュールの名前 |
user | スケジュールタスクがどのユーザーに属するかを指定、デフォルトは root ユーザー |
state | present は追加(省略可能)、absent は削除を示します。 |
#毎日 19 時に /data/test.sh スクリプトを実行する定期タスクを追加し、タスク名を script-test にします。
ansible webservers -m cron -a 'name="script-test" hour=19 minute=00 job="/bin/bash /data/test.sh" '
#この定期タスクをコメントアウトします
ansible webservers -m cron -a 'name="script-test" hour=19 minute=00 job="/bin/bash /data/test.sh" disabled=yes '
#この定期タスクを削除します
ansible webservers -m cron -a 'name="script-test" hour=19 minute=00 job="/bin/bash /data/test.sh" state=absent '
archive モジュール#
一般的なパラメータ | 機能 |
---|---|
path | パッケージするソースディレクトリまたはファイルのパスを指定。 |
dest | パッケージファイルの出力パスを指定。 |
format | パッケージファイルの形式を指定、zip、tar、gz または bzip2 が可能。デフォルトは tar 形式。 |
remove | パッケージファイルの後にソースディレクトリまたはファイルを削除するかどうかを指定。選択肢は yes または no。デフォルトは no、すなわちソースディレクトリまたはファイルを削除しない。 |
unarchive モジュール#
一般的なパラメータ | 機能 |
---|---|
copy | パッケージファイルをリモートノードにコピーして解凍するかどうかを指定。 |
remote_src | (廃止)copy パラメータを使用します。 |
src | 解凍するパッケージファイルのパスを指定、ローカルパスまたはリモートパスが可能。 |
dest | ファイルを解凍するターゲットディレクトリを指定。 |
creates | 既に存在するファイルのパスを指定、存在する場合は解凍操作を行わない。 |
remote_tmp | リモートノード上の一時ディレクトリを指定。デフォルトは /tmp 。 |
1、 コントロール側の圧縮ファイルを、被管理側に解凍します:
ansible webservers -m unarchive -a 'src=./test.tar.gz dest=/mnt'
2、 被管理側の圧縮ファイルを被管理側に解凍します:ansible webservers -m unarchive -a 'src=/tmp/config_vpn_new.zip dest=/mnt remote_src=yes'
lineinfile モジュール#
意味:置換 | 追加 | 削除
パラメータ | オプション | 意味 |
---|---|---|
path | 無 | 操作するターゲットファイルのパスを指定 |
regexp | 無 | 正規表現を使用してファイル内の行をマッチさせる |
line | 無 | 修正または挿入する新しいテキスト内容を指定 |
insertafter | 無 | テキストを「正規表現にマッチした行」の後に挿入 |
insertbefore | 無 | テキストを「正規表現にマッチした行」の前に挿入 |
state | absent /present (デフォルト) | absent はマッチ行を削除し、present はテキストが存在することを保証 |
backrefs | yes / no | yes は正規表現の後方参照を有効にし、no はマッチしない場合はファイルを操作しない |
backup | 無 | 修正前にバックアップファイルを作成するかどうか(ブール値) |
create | 無 | ターゲットファイルが存在しない場合に新しいファイルを作成するかどうか(ブール値) |
1、 httpd.conf ファイル内の Listen を Listen8080 に置き換えます;
ansible webservers -m lineinfile -a 'path=/etc/httpd/conf/httpd.conf regexp="^Listen" line="Listen 8080"'
2、 ホストにゲートウェイを追加します:
ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-eth1 line="GATEWAY=172.16.1.200"'
3、 ホストのゲートウェイを削除します:ansible webservers -m lineinfile -a 'path=/etc/sysconfig/network-scripts/ifcfg-ethl regexp="^GATEWAY" state=absent'
Ansible プレイブック#
プレイブックは yml 構文で書かれたテキストファイルで、play
とtask
の 2 つの部分で構成されています。
play
:操作するホストまたはホストグループを主に定義します。
task
:ホストまたはホストグループに対して具体的に実行するタスクを主に定義します。1 つのタスクでも、複数のタスク(モジュール)でも構いません。
プレイブックは 1 つ以上のプレイで構成されており、1 つのプレイは複数のタスクを含むことができます。
複数の異なるモジュールを使用して、1 つのことを共同で完了することができると理解できます。
プレイブックの書き方#
プレイブックは yml 構文で書かれ、構造が明確で可読性が高いです。
構文 | 説明 |
---|---|
インデント | YAMLは固定のインデントスタイルを使用して階層構造を表現し、各インデントは2 つの空白で構成され、タブを使用してはいけません |
コロン | コロンで終わるものを除き、他のすべてのコロンの後には空白が必要です |
短横線 | リスト項目を示し、1 つの短横線と 1 つの空白を使用します。複数の項目は同じインデントレベルを使用して同じリストにします |
プレイブックの適用例:#
nginx のインストール#
(1)プレイブックファイルを作成します。
vi nginx.yml
- hosts: webservers
tasks:
- name: nginxのインストール
yum:
name: nginx
state: present
- name: nginxの起動
systemd:
name: nginx
state: started
enabled: yes
(2)ファイルに構文エラーがないか確認します。
ansible-playbook --syntax nginx.yml
または
ansible-playbook --syntax-check nginx.yml
[root@121 data]# ansible-playbook --syntax nginx.yml
playbook: nginx.yml
(3)シミュレーション実行を行います。
ansible-playbook -C nginx.yml
[root@121 data]# ansible-playbook -C nginx.yml
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.122]
ok: [192.168.1.121]TASK [nginx のインストール] *****************************************************************
changed: [192.168.1.122]
changed: [192.168.1.121]TASK [nginx の起動] *****************************************************************
changed: [192.168.1.121]
changed: [192.168.1.122]PLAY RECAP *********************************************************************
192.168.1.121 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.122 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(4)実際に実行します。
ansible-playbook nginx.yml
[root@121 data]# ansible-playbook nginx.yml
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.122]
ok: [192.168.1.121]TASK [nginx のインストール] *************************************************************** **
changed: [192.168.1.121]
changed: [192.168.1.122]TASK [nginx の起動] *****************************************************************
changed: [192.168.1.122]
changed: [192.168.1.121]PLAY RECAP *********************************************************************
192.168.1.121 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.1.122 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
NFS サービスのインストール#
タスクの順序:
- nfs プログラムをダウンロード
- nfs 設定ファイルをマウント(トリガーを設定し、設定ファイルを変更後、設定を再起動させる)
- nfs の初期設定(ユーザー、グループ、権限を設定)
- nfs を起動
設定したトリガーは handles で、2 番目のステップで notify 情報を追加し、設定ファイルが変更されたときに handles が notify の情報を取得し、nfs サービスを再起動して設定を再適用します。
ファイルの準備:
#プロジェクトファイルを保存するディレクトリを作成
mkdir nfs
#nfs設定ファイルを作成し、以下の内容を書き込みます
vi exports.j2
/ansible_test 192.168.1.0/24(rw,all_squash,anonuid=7777,anongid=7777)
Ansible の設定ファイル
ansible.cfg
とhosts
を事前にこのプロジェクトディレクトリに配置します。
nfs プレイブックを作成します。
vi nfs.yml
- hosts: webservers
tasks:
- name: nfsをダウンロード
yum:
name: nfs-utils
state: present
- name: nfsを設定
copy:
src: ./exports.j2
dest: /etc/exports
notify: nfsを再起動 #トリガー情報
- name: グループを初期化
group:
name: bbb
gid: 7777
- name: ユーザーを初期化
user:
name: bbb
uid: 7777
group: bbb
shell: /sbin/nologin
create_home: no
- name: ディレクトリを初期化
file:
path: /ansible_test
state: directory
owner: bbb
group: bbb
mode: "0755"
- name: nfsを起動
systemd:
name: nfs
state: started
enabled: yes
handlers: #トリガー
- name: nfsを再起動
systemd:
name: nfs
state: restarted
実行して検証します。
ansible-playbook --syntax-check nfs.yml
ansible-playbook -C nfs.yml
ansible-playbook nfs.yml
#nfsサービスを確認
showmount -e 192.168.1.121
showmount -e 192.168.1.122
#マウントテスト
mount -t nfs 192.168.1.121:/ansible_test /data/test
mount -t nfs 192.168.1.122:/ansible_test /data/test1
[root@121 ~]# df -h
ファイルシステム 容量 已用 可用 已用 % 挂载点
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.7M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 1.7G 16G 10% /
/dev/sda1 1014M 153M 862M 16% /boot
tmpfs 182M 0 182M 0% /run/user/0
192.168.1.121:/ansible_test 17G 1.7G 16G 10% /data/test
192.168.1.122:/ansible_test 17G 2.2G 15G 13% /data/test1
rsync サービスのインストール#
rsync サーバー:#
タスクの順序:
- rsync プログラムをダウンロード
- rsync 設定ファイルをマウント(トリガーを設定し、設定ファイルを変更後、設定を再起動させる)
- rsync の初期設定(ユーザー、グループ、権限を設定)
- 仮想ユーザーとパスワードを作成
- rsync を起動
設定したトリガーは handles で、設定ファイルまたは仮想ユーザーのパスワードが変更されたときに handles が notify の情報を取得し、rsync サービスを再起動して設定を再適用します。
ファイルの準備:
#プロジェクトファイルを保存するディレクトリを作成
mkdir rsync
#rsync設定ファイルrsyncd.confをコピーし、変更します(手動でrsyncをダウンロードし、設定ファイルをコピーしてからアンインストールすることもできますし、以下の内容を直接使用することもできます)
uid = ansible_www
gid = ansible_www
port = 873
fake super = yes
use chroot = yes
max connections = 4
timeout = 900
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
path = /backup
Ansible の設定ファイル
ansible.cfg
とhosts
を事前にこのプロジェクトディレクトリに配置します。
rsync プレイブックを作成します。
vi rsync.yml
- hosts: webservers
tasks:
- name: rsyncをダウンロード
yum:
name: rsync
state: present
- name: rsyncを設定
copy:
src: ./rsyncd.conf
dest: /etc/rsyncd.conf
owner: root
group: root
mode: "0644"
notify: rsyncを再起動
- name: グループを初期化
group:
name: ansible_www
gid: 8888
- name: ユーザーを初期化
user:
name: ansible_www
uid: 8888
group: ansible_www
shell: /sbin/nologin
create_home: no
- name: ディレクトリを初期化
file:
path: /backup
state: directory
owner: ansible_www
group: ansible_www
mode: "0755"
recurse: yes
- name: rsyncユーザーのパスワードを初期化
copy:
content: "rsync_backup:123456"
dest: /etc/rsync.passwd
owner: root
group: root
mode: 0600
notify: rsyncを再起動
- name: rsyncを起動
systemd:
name: rsyncd
state: started
enabled: yes
handlers:
- name: rsyncを再起動
systemd:
name: rsyncd
state: restarted
実行して検証します。
ansible-playbook --syntax-check rsync.yml
ansible-playbook -C rsync.yml
ansible-playbook rsync.yml
#検証
rsync -avz host_group [email protected]::backup
rsync クライアント:#
タスクの順序:
- スクリプトを被管理側の指定されたパスにプッシュ
- 定期タスクを設定
rsync-client プレイブックを作成します。
vi rsync-client.yml
- hosts: localhost
tasks:
- name: スクリプトのパスを作成
file:
path: /scripts
owner: root
group: root
state: directory
mode: 0755
- name: スクリプトをプッシュ
copy:
src: test.sh
dest: /scripts/test.sh
owner: root
group: root
mode: 0755
- name: 定期的なジョブ
cron:
name: "バックアップデータをプッシュ"
minute: "*/1"
job: "/bin/bash /scripts/test.sh &>/dev/null"
テスト用の test.sh を作成します。
#!/bin/bash
RSYNC_PASSWORD="123456" rsync -avz /backup/ [email protected]::backup
定期タスクがあるかどうかを確認します。
crontab -l
#Ansible: バックアップデータをプッシュ
*/1 * * * * /bin/bash /scripts/test.sh &>/dev/null
Ansible を使用して複数ノードの phpmyadmin をデプロイ#
プロジェクトの要件#
- LNMP を使用して phpmyadmin をデプロイ
- nginx(Haproxy)を負荷分散として使用
- Redis でセッションを保持
ホストの計画#
ホスト名 | ip | 用途 |
---|---|---|
121 | 192.168.1.121 | Ansible コントロールノード、nginx+PHP |
122 | 192.168.1.122 | Ansible 受動ノード、nginx+PHP |
123 | 192.168.1.123 | Ansible 受動ノード、nginx(Haproxy) |
124 | 192.168.1.124 | Ansible 受動ノード、nginx(Haproxy) |
125 | 192.168.1.125 | Ansible 受動ノード、Redis |
デプロイ手順#
環境準備
121 ノードに Ansible を準備し、上記の 5 台のマシンでパスワードなしログインを設定します。具体的な設定手順は上記の構成プロセスを参照してください。
#プロジェクトファイルを保存するディレクトリを作成
mkdir /data/phpmyadmin
#Ansibleの設定ファイル`ansible.cfg`と`hosts`をこのphpmyadminディレクトリにコピーし、設定を変更します。
cp /etc/ansible/ansible.cfg /data/phpmyadmin/ansible.cfg
#設定ファイル内のパスを変更し、コメントを解除します。
inventory = /data/phpmyadmin/host_group
cp /etc/ansible/hosts /data/phpmyadmin/host_group
#ホストグループを変更します。
[webservers]
192.168.1.121
192.168.1.122
[dbservers]
192.168.1.125
[lbservers]
192.168.1.123
192.168.1.124
設定ファイルの読み取りパスが現在のプロジェクトの/data/phpmyadmin/ansible.cfg
であることを確認します。
[root@121 phpmyadmin]# ansible --version
ansible 2.9.27
config file = /data/phpmyadmin/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
すべてのホストが ping 可能かどうかを確認します。
[root@121 phpmyadmin]# ansible all -m ping
192.168.1.122 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.124 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.123 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.125 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.1.121 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Redis のインストール
タスクの順序:
- redis プログラムをダウンロード
- redis 設定ファイルをマウント(トリガーを設定し、設定ファイルを変更後、設定を再起動させる)
- redis を起動
設定したトリガー handles で、redis サービスを再起動します。
(1)redis の設定ファイルredis.conf
を/data/phpmyadmin/files
ディレクトリにコピーします。
mkdir /data/phpmyadmin/files
#redis.confファイルがない場合は、コントロールノードでyum -y install redisを使用してダウンロードしてからコピーします。
cp /etc/redis.conf /data/phpmyadmin/files
#設定ファイルを変更し、redisをインストールするホストのIPを追加します。
bind 127.0.0.1 192.168.1.125
(2)
vi redis.yml
- hosts: dbservers
tasks:
- name: redisをダウンロード
yum:
name: redis
state: present
- name: redisを設定
copy:
src: ./files/redis.conf
dest: /etc/redis.conf
owner: redis
group: root
mode: 0640
notify: redisを再起動
- name: redisを起動
systemd:
name: redis
state: started
enabled: yes
handlers:
- name: redisを再起動
systemd:
name: redis
state: restarted
(3)インストールしてテストします。
ansible-playbook --syntax-check redis.yml
ansible-playbook -C redis.yml
ansible-playbook redis.yml
#テスト、以前にコントロールノード121でredisをインストールしたので、121で直接テストできます。
#ファイアウォールのポートに注意
redis-cli -h 192.168.1.125
[root@121 phpmyadmin]# redis-cli -h 192.168.1.125
192.168.1.125:6379>
Mariadb のインストール
192.168.1.125 で Mariadb をインストールします。
yum -y install mariadb-server
systemctl start mariadb
systemctl enable mariadb
#rootユーザーのパスワードを設定
mysqladmin -uroot password '123456'
#ログインしてユーザーを作成
mysql -uroot -p123456
#データベースを作成
create database php_db;
#データベースユーザーを作成
grant all on php_db.* to php_user@'%' identified by '123456';
nginx、PHP のインストール
タスクの順序:
- nginx、PHP プログラムをダウンロード
- nginx、PHP 設定ファイルをマウント(トリガーを設定し、設定ファイルを変更後、設定を再起動させる)
- nginx を初期設定(ユーザー、グループ、権限を設定)
- nginx、PHP を起動
設定したトリガー handles で、nginx、PHP サービスを再起動します。
(1)php7 のダウンロードソースを 121、122 で実行します。
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
(2)nginx、php の設定ファイルを/data/phpmyadmin/files
ディレクトリにコピーし、設定を変更します。
#nginx設定ファイル
cp /etc/nginx/nginx.conf /data/phpmyadmin/files
#php設定ファイル
cp /etc/php.ini /data/phpmyadmin/files
cp /etc/php-fpm.d/www.conf /data/phpmyadmin/files
nginx 設定ファイルでユーザーをwww
に変更します。
vi nginx.conf
user www;
/data/phpmyadmin/files
ディレクトリに、phpmyadmin の nginx プロキシファイルを新規作成します。
vi phpmyadmin.conf
server {
listen 80;
server_name ansible.phpmyadmin.local;
# 確保するパスはphpMyAdminの実際のパスと完全に一致する必要があります
root /code/phpmyadmin;
index index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
# 絶対パスは完全に正確でなければなりません
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
# 重要なパラメータを追加
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_intercept_errors on;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
php 設定ファイルphp.ini
を変更し、redis 接続を設定します。
vi php.ini
[Session]
session.save_handler = redis
session.save_path = "tcp://192.168.1.125:6379?weight=1&timeout=2.5"
php 設定ファイルwww.conf
を変更し、ユーザーとグループを設定し、一部の設定をコメントアウトします。
vi www.conf
[www]
user = www
group = www
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
(3)phpmyadmin をダウンロードします。
#phpmyadminプログラムを/data/phpmyadmin/filesディレクトリにダウンロードします。
curl -O https://files.phpmyadmin.net/phpMyAdmin/5.2.2/phpMyAdmin-5.2.2-all-languages.zip
#プログラムを解凍します。
unzip phpMyAdmin-5.2.2-all-languages.zip
#設定ファイルをコピーし、mariadbデータベースに接続します。
cp phpMyAdmin-5.2.2-all-languages/config.sample.inc.php config.inc.php
#localhostを192.168.1.125に変更します。
$cfg['Servers'][$i]['host'] = '192.168.1.125';
(4)nginx-php プレイブックを作成します。
vi nginx-php.yml
- hosts: webservers
tasks:
- name: nginxをダウンロード
yum:
name: nginx
state: present
- name: phpをダウンロード
yum:
name: "{{ packages }}"
vars:
packages:
- php72w
- php72w-cli
- php72w-common
- php72w-devel
- php72w-embedded
- php72w-fpm
- php72w-gd
- php72w-mbstring
- php72w-mysqlnd
- php72w-opcache
- php72w-pdo
- php72w-xml
- php72w-ldap
- php72w-pecl-redis
- name: nginxを設定
copy:
src: ./files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify: nginxを再起動
- name: wwwグループを初期化
group:
name: www
gid: 666
- name: wwwユーザーを初期化
user:
name: www
uid: 666
group: www
shell: /sbin/nologin
create_home: no
- name: nginxを起動
systemd:
name: nginx
state: started
enabled: yes
- name: php.iniを設定
copy:
src: ./files/php.ini
dest: /etc/php.ini
owner: root
group: root
mode: 0644
notify: phpを再起動
- name: www.confを設定
copy:
src: ./files/www.conf
dest: /etc/php-fpm.d/www.conf
owner: root
group: root
mode: 0644
notify: phpを再起動
- name: phpを起動
systemd:
name: php-fpm
state: started
enabled: yes
- name: nginx confをコピー
copy:
src: ./files/phpmyadmin.conf
dest: /etc/nginx/conf.d/phpmyadmin.conf
notify: nginxを再起動
- name: コードディレクトリを作成
file:
path: /code
state: directory
owner: www
group: www
mode: "0755"
recurse: yes
- name: phpmyadminを解凍 #phpmyadminを解凍します。
unarchive:
src: ./files/phpMyAdmin-5.2.2-all-languages.zip
dest: /code/
owner: www
group: www
creates: /code/phpMyAdmin-5.2.2-all-languages/config.inc.php
- name: リンクを作成 #シンボリックリンクを作成します。
file:
src: /code/phpMyAdmin-5.2.2-all-languages/
dest: /code/phpmyadmin
state: link
- name: phpmyadminの設定を変更
copy:
src: ./files/config.inc.php
dest: /code/phpMyAdmin-5.2.2-all-languages/config.inc.php
handlers:
- name: nginxを再起動
systemd:
name: nginx
state: restarted
- name: phpを再起動
systemd:
name: php-fpm
state: restarted
(5)インストールしてテストします。
ansible-playbook --syntax-check nginx-php.yml
ansible-playbook -C nginx-php.yml
ansible-playbook nginx-php.yml
(6)ローカルコンピュータのC:\Windows\System32\drivers\etc\hosts
に hosts を設定します。
#それぞれ121、122のhostsを設定してアクセステストを行います。
192.168.1.121 ansible.phpmyadmin.local
192.168.1.122 ansible.phpmyadmin.local
(7)ブラウザでansible.phpmyadmin.local
にアクセスし、ユーザー名とパスワードはインストールした Mariadb データベースのユーザーphp_user
とそのパスワード123456
です。
負荷分散方式 1:nginx
(1)nginx の設定ファイルnginx.conf
を/data/phpmyadmin/files
ディレクトリにコピーし、nginx.conf.lb
と名付けます。
cp /etc/nginx.conf /data/phpmyadmin/files/nginx.conf.lb
(2)/data/phpmyadmin/files
ディレクトリに負荷分散用の設定ファイルproxy.conf
を作成します。
vi proxy.conf
upstream ansible {
server 192.168.1.121;
server 192.168.1.122;
}
server {
listen 80;
server_name ansible.phpmyadmin.local;
location / {
proxy_pass http://ansible;
proxy_set_header Host $http_host;
}
}
(3)lb-nginx プレイブックを作成します。
vi lb-nginx.yml
- hosts: lbservers
tasks:
- name: nginxをダウンロード
yum:
name: nginx
state: present
- name: nginxを設定
copy:
src: ./files/nginx.conf.lb
dest: /etc/nginx/nginx.conf
notify: nginxを再起動
- name: nginx confをコピー
copy:
src: ./files/proxy.conf
dest: /etc/nginx/conf.d/proxy.conf
notify: nginxを再起動
- name: nginxを起動
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: nginxを再起動
systemd:
name: nginx
state: restarted
(4)インストールしてテストします。
ansible-playbook --syntax-check lb-nginx.yml
ansible-playbook -C lb-nginx.yml
ansible-playbook lb-nginx.yml
(5)ローカルコンピュータのC:\Windows\System32\drivers\etc\hosts
に hosts を設定します。
192.168.1.123 ansible.phpmyadmin.local
192.168.1.124 ansible.phpmyadmin.local
(6)ブラウザでansible.phpmyadmin.local
にアクセスし、データベースサーバー
-ユーザー
を観察し、リフレッシュして 121 と 122 が切り替わって表示されるか確認します。
負荷分散方式 2:haproxy
(1)haproxy のダウンロードソースを設定します。
rpm -Uvh https://repo.ius.io/ius-release-el7.rpm
(2)/etc/haproxy/haproxy.cfg
を/data/phpmyadmin/files
ディレクトリにコピーします。
cp /etc/haproxy/haproxy.cfg /data/phpmyadmin/files
任意のサーバーに haproxy をインストールし、
/etc/haproxy/haproxy.cfg
ファイルを取得することができます。
(3)haproxy.cfg
設定ファイルを変更し、以下の内容を追加します。
frontend web
bind *:8080
mode http
acl ansible_domain hdr_reg(host) -i ansible.phpmyadmin.local
use_backend ansible_cluster if ansible_domain
backend ansible_cluster
balance roundrobin
option httpchk HEAD / HTTP/1.1\r\nHost:\ ansible.phpmyadmin.local
server server1 192.168.1.121:80 check port 80 inter 3s rise 2 fall 3
server server2 192.168.1.122:80 check port 80 inter 3s rise 2 fall 3
(4)lb-haproxy プレイブックを作成します。
vi lb-haproxy.yml
- hosts: lbservers
tasks:
- name: haproxyをダウンロード
yum:
name: haproxy22
state: present
- name: haproxyを設定
copy:
src: ./files/haproxy.cfg
dest: /etc/haproxy/haproxy.cfg
owner: root
group: root
mode: 0644
notify: haproxyを再起動
- name: haproxyを起動
systemd:
name: haproxy
state: started
enabled: yes
handlers:
- name: haproxyを再起動
systemd:
name: haproxy
state: restarted
(5)インストールしてテストします。
ansible-playbook --syntax-check lb-haproxy.yml
ansible-playbook -C lb-haproxy.yml
ansible-playbook lb-haproxy.yml
(5)ローカルコンピュータのC:\Windows\System32\drivers\etc\hosts
に hosts を設定します。
192.168.1.123 ansible.phpmyadmin.local
192.168.1.124 ansible.phpmyadmin.local
(6)ブラウザでansible.phpmyadmin.local:8080
にアクセスし、データベースサーバー
-ユーザー
を観察し、リフレッシュして 121 と 122 が切り替わって表示されるか確認します。
本記事の知識は Bilibili の動画 BV11JZcYwEDd に基づいています。