banner
云野阁

云野阁

闲云野鹤,八方逍遥

Ansibleの知識整理

🔜Ansibleとは?🔚

Ansible は IT 自動化ツールです。主な適用シーンには、システムの構成、ソフトウェアのデプロイ、継続的なリリース、およびサービスを停止せずにスムーズにロールアウト更新するための高度なタスクオーケストレーションがあります。

Ansible はオープンソースの自動化を提供し、複雑さを軽減し、どこでも実行できます。Ansible を使用すると、ほぼすべてのタスクを自動的に実行できます。

アーキテクチャ#

Ansible:Ansible のコアプログラム。
HostInventory:Ansible が管理するホスト情報を記録し、ポート、パスワード、IP などを含みます。
Playbooks:「プレイブック」YAML 形式のファイルで、複数のタスクが 1 つのファイルに定義され、ホストがどのモジュールを呼び出して機能を完了するかを定義します。
CoreModulesコアモジュール、主な操作はコアモジュールを呼び出して管理タスクを完了することです。
CustomModules:コアモジュールでは実行できない機能を完了するためのカスタムモジュールで、複数の言語をサポートします。
ConnectionPlugins:接続プラグインで、Ansible とホスト間の通信に使用されます。

1

Ansible の重要な概念#

コントロールノード#

コントロールノードは Ansible CLI ツールを実行するマシンです。これは、管理対象ノード(被管理ノード)との通信を担当し、コマンドを発行し、タスクを実行します。

被管理ノード#

「ホスト」とも呼ばれ、Ansible によって管理されるターゲットデバイスです。Ansible コントロールノードはこれらのマシンでタスクを実行します。被管理ノードには、エージェントをインストールする必要はありません。

インベントリ#

管理対象のターゲットホストまたはノードのリストを含みます。これは、Ansible がターゲットホスト情報を定義するために使用する設定ファイルで、静的または動的なホストリストをサポートします。また、グループを割り当てるためにも使用され、これによりプレイブック内でノードを選択したり、変数を一括で割り当てたりできます。

プレイブック#

プレイブックは Ansible の構成管理の中心部分であり、タスクを自動化するための YAML ファイルのセットです。プレイブックは複数のステップ(ソフトウェアのインストール、サービスの起動など)を実行でき、実行順序やタスクを定義します。

モジュール#

モジュールは Ansible 内で実際のタスクを実行する単位です。これらは高度に再利用可能なコードブロックで、特定の操作(ソフトウェアパッケージのインストール、設定ファイルの変更など)を実行する責任があります。

ロール#

ロールはプレイブックの組織方法の一つで、複数のタスク、ファイル、テンプレート、変数などを完全な機能モジュールとして整理します。ロールは複雑な構成を再利用可能なコンポーネントに分割するのに役立ちます。プレイブック内で使用できる再利用可能な Ansible コンテンツです。

タスク#

タスクはプレイブック内で定義された具体的な操作です。各タスクは通常、特定の操作を実行するために Ansible モジュールを呼び出します。ad-hoc は、一時的にコマンドを実行するシナリオにより適しています。

プラグイン#

Ansible のコア機能を拡張するコードスニペットです。プラグインは、管理ノードへの接続方法(接続プラグイン)、データの操作(フィルタープラグイン)、さらにはコンソールに表示される内容を制御する(コールバックプラグイン)ことができます。

コレクション#

Ansible コンテンツの配布形式で、プレイブック、ロール、モジュール、プラグインを含むことができます。

Ansible タスク実行モード#

Ansible システムは、コントロールホストが被管理ノードに対して操作する方法に基づいて、ad-hocplaybookの 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 の設定ファイル#

設定ファイルの読み取り優先順位は次のとおりです:

  1. 環境変数ANSIBLE_CONFIGが指すパスのファイルを確認します(export ANSIBLE_CONFIG=xxxx);
  2. 現在のプロジェクトディレクトリ内の ansible.cfg 設定ファイルを確認します;
  3. ~/.ansible.cfg、現在のディレクトリ内の ansible.cfg 設定ファイルを確認します;
  4. /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'、その意味は以下の図の通りです:

2

実行プロセス:

  1. 設定ファイルを読み込み、デフォルトは/etc/ansible/ansible.cfgです;
  2. 対応するホスト設定ファイルを探し、実行するホストまたはグループを見つけます;
  3. 対応するモジュールファイルを読み込みます。例えばcommand
  4. ansibleを通じてモジュールまたはコマンドを生成し、対応する実行ユーザーの$HOME/.ansible/tmp/ansible-tmp-number/XXX.PYにファイルを転送します;
  5. リモートホストがそのファイルを実行します;
  6. 実行結果を返します;
  7. 一時的なpyファイルを削除し、sleep 0で終了します;

実行状態:

ad-hoc を使用してリモートコマンドを一度実行し、返された結果の色を注意深く観察します:

  • 緑:受動ノードが変更されていないことを示します
  • 黄:受動ノードに変更が見つかったことを示します
  • 赤:障害が発生したことを示し、メッセージを確認してください

一般的なモジュール#

command モジュール#

基本形式と一般的なパラメータ

ansible 'グループ/IP' -m command -a '[パラメータ] コマンド'
パラメータオプション意味
chdirchdir /optansible 実行時に指定ディレクトリに切り替え
createscreates /data/fileファイルが存在する場合、実行をスキップ
removesremoves /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サービスの状態を指定、選択肢:stoppedstartedreloadedrestartedstatus
enabledサービスを起動時に開始するかどうかを設定、yesは開始、noは開始しない
daemon_reloadyesに設定すると 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:システムアカウント(例: mysqlno:一般アカウント
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 ユーザー
statepresent は追加(省略可能)、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テキストを「正規表現にマッチした行」の前に挿入
stateabsent /present (デフォルト)absentはマッチ行を削除し、presentはテキストが存在することを保証
backrefsyes / noyesは正規表現の後方参照を有効にし、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 構文で書かれたテキストファイルで、playtaskの 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.cfghostsを事前にこのプロジェクトディレクトリに配置します。

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.cfghostsを事前にこのプロジェクトディレクトリに配置します。

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用途
121192.168.1.121Ansible コントロールノード、nginx+PHP
122192.168.1.122Ansible 受動ノード、nginx+PHP
123192.168.1.123Ansible 受動ノード、nginx(Haproxy)
124192.168.1.124Ansible 受動ノード、nginx(Haproxy)
125192.168.1.125Ansible 受動ノード、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です。

3

4

負荷分散方式 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 に基づいています。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。