DUICUO

この記事では、Ansible Playbook の使い方を紹介し、説明します。

I. Ansibleの紹介

Ansible Playbook は、繰り返し利用でき、再利用性に優れたシンプルな構成管理と複数マシンへのデプロイシステムを提供し、複雑なアプリケーションのデプロイに最適です。Ansible Playbook は、複雑な IT 運用を自動化するための設計図であり、人的介入を最小限に抑え、あるいは全く必要とせずに実行できます。Ansible Playbook は、ホストのセット、グループ、またはカテゴリに対して実行され、全体として Ansible インベントリを形成します。

Ansible Playbook は基本的にフレームワークであり、開発者がアドホックテンプレートや出発点として使用できる、事前に記述されたコードです。Ansible Playbook は、IT インフラストラクチャ(オペレーティングシステムや Kubernetes プラットフォームなど)、ネットワーク、セキュリティシステム、開発者ロール(Git など)の自動化によく使用されます。

Ansible Playbook は、IT プロフェッショナルがアプリケーション、サービス、サーバーノード、その他のデバイスを、すべてをゼロから手作業で作成する手間をかけずにプログラミングするのに役立ちます。Ansible Playbook は、条件、変数、タスクとともに保存、共有、または無期限に再利用できます。

  • プレイブックは、1 つ以上のプレイのリストです。
  • プレイの主な機能は、ホストをAnsibleのタスクで定義されたロールセットにグループ化し、設定することです。基本的に、タスクとはAnsibleモジュールへの呼び出しです。複数のプレイをプレイブック内に整理することで、定められたオーケストレーションメカニズムに従って、プレイが相互に作用し、まとまりのある動作を実行できるようになります。
  • プレイブックは YAML で記述されています。

II. Ansible プレイブックはどのように機能しますか?

Ansibleモジュールはタスクを実行します。1つ以上のAnsibleタスクを組み合わせてゲームをプレイできます。2つ以上のプレイを組み合わせてAnsible Playbookを作成することもできます。Ansible Playbookは、ホストに対して自動的に実行されるタスクのリストです。ホストグループはAnsibleインベントリーを構成します。

Ansible Playbook の各モジュールは特定のタスクを実行します。各モジュールには、タスクの実行日時と場所、およびタスクを実行するユーザーを決定するメタデータが含まれています。他にも、多種多様な IT タスクを実行できる数千もの Ansible モジュールが存在します。

III. YAML とは何ですか?

YAMLは、データシーケンスを表現するための非常に可読性の高いフォーマットであり、本質的にはマークアップ言語です。YAMLは運用と開発の両方で広く利用されており、例えばKubernetesのデプロイメントマニフェストファイル、GitLab CI/CD、YAMLを使用したPython設定ファイル、JSONデータからYAML形式への変換などが挙げられます。この記事ではYAMLの構文については詳しく説明しません。詳細については、BaiduまたはGoogleを参照してください。

IV. YAML言語の特徴

  • YAML は非常に読みやすいです。
  • YAML はスクリプト言語との相互運用性が優れています。
  • YAML は実装言語のデータ型を使用します。
  • YAML には一貫した情報モデルがあります。
  • YAML は実装が簡単です。
  • YAML はストリームに基づいて処理できます。
  • YAML は非常に表現力と拡張性に優れています。

V. Ansible Playbookのコアコンポーネント

  • ホスト: 実行するリモート ホストのリスト。
  • タスク: タスクのセット。
  • 変数: 組み込み変数またはカスタム変数がプレイブック内で呼び出されます。
  • テンプレート: テンプレートは、テンプレート内の変数を置き換え、いくつかの簡単なロジックを実装できるファイルです。
  • ハンドラと通知:これら2つは、特定の条件によってトリガーされる操作を実行するために併用されます。操作は条件が満たされた場合にのみ実行され、そうでない場合は実行されません。
  • タグ:タグはタスクの実行を指定するために使用されます。ユーザーはプレイブック内のコードの一部を選択して実行します。Ansibleは冪等性を持つため、保護されていない部分は自動的にスキップされます。それでも、コードによっては変更の有無をテストするのに非常に長い時間がかかる場合があります。このような場合、変更されていないことが確実な場合は、タグを使用してこれらのコードスニペットをスキップできます。

(1) ansible-playbookのプロジェクトディレクトリ構造

 [ルート@ayunw ansible -プロジェクト] # ll
合計28
-rw -r --r -- . 1ルートルート122 7810 : 1400_セットアップ.yml
-rw -r --r -- . 1ルートルート84 7714:42 01_publish_ssh_key.yml
-rw -r --r -- . 1ルートルート787814 : 1102_共通.yml
-rw -r --r -- . 1rootroot857月810 : 3403_install_docker.yml
drwxr - xr - x.3ルートルート124 71109:15ファイル
drwxr - xr - x . 2ルートルート80 7月815:26在庫
- rw - r -- r -- . 1ルートルート778 7月7日15:16 README . md
drwxr - xr - x . 5ルートルート57 7月7 18 : 30役割

[ root @ayunw ansible -プロジェクト] #ツリーロール/ - L 3
役割/
├──ドッカー
├──デフォルト
└──メイン.yml
├──ハンドラー
└──メイン.yml
├──メタ
└──メイン.yml
├──タスク
└──メイン.yml
├──テンプレート
├──デーモン. json . j2
└── docker -ce .リポジトリ. j2
└──変数
└──メイン.yml

上記は、Dockerを用いたプロジェクトのバッチインストールについて説明しています。このディレクトリ形式は、私が推奨するインストールディレクトリ構造です。ただし、すべてのディレクトリ内のすべてのmain.ymlファイルにコンテンツが含まれているわけではありません。実際、default/main.ymlとmeta/main.ymlは、必ずしも必要ではないかもしれません。

(2)リモートホストのホストリスト

プレイブック内の各プレイの目的は、特定のホストが指定されたユーザーとしてタスクを実行できるようにすることです。hostsファイルは、指定されたタスクを実行するホストを指定するもので、事前にホストリストに定義しておく必要があります。例えば、前述のように、デフォルトでは通常「/etc/ansible/hosts」ファイルにあります。

 [ root @ayunw ansible -] # cat / etc / ansible / hosts
[ウェブサーバ]
10.10.108 . [ 30:33 ]

[ dbsrvs ]
10.10 .108 .30

[アプリ]
10.10.108 . [ 30:33 ]

(3) remote_user リモートユーザー

ホストとタスクの両方で使用でき、sudo経由でリモートホスト上のタスクを実行するように指定することもできます。グローバルに実行することも、特定のタスクに対して実行することもできます。さらに、sudo_user はsudo実行時に切り替え先のユーザーを指定するために使用できます。

 [root@ayunw ansible-example]# cat デモプレイブック.yml
- ホスト: dbsrvs
リモートユーザー: ルート
タスク:
- 名前: pingtest
ピン:
リモートユーザー: ayunw
sudo: yes # デフォルトのsudoはrootです
sudo_user: root # sudoはrootです

(4)タスク

簡単に言えば、タスクセットとは、Ansibleでサポートされている複数のモジュールを使用して組み合わせたタスクのグループです。Ansibleプレイブックでは、名前がタスクを指定すると考えることができます。各タスクは、hostsファイルに指定されたすべてのホスト上で順番に実行されます。つまり、最初のタスクがすべてのホストで完了してから、次のタスクが開始されます。ただし、非同期モードも使用できます。これについては、後の記事で説明します。

タスクの目的は、指定されたパラメータでモジュールを実行することです。モジュールパラメータでは変数を使用できます。モジュールの実行は冪等性があり、結果が常に一貫しているため、複数回実行しても安全です。

各タスクには、プレイブックの実行出力に対して独自の名前が必要です。わかりやすい名前を選択することをお勧めします。

タスクの 2 つの形式:

1 つの形式は key=value であり、もう 1 つは key: value です。

注:後者の場合、コロンの後にスペースが入ります。

 [ root @ ayunw ansible -プロジェクト]# cat install_httpd .yml
----
-ホスト: dbsrvs
リモートユーザー: root
タスク:
-名前: httpdをインストール# 説明
yum : name = httpd # yumモジュールを使用してhttpdサービスをインストールします

- name : start httpd # これも説明的なメッセージです
service : name = httpd state = started enabled = yes # サービス モジュールを呼び出して httpd サービスを開始し、起動時に自動的に開始するように設定します。
[ root @ ayunw ansible -プロジェクト]# cat copy_files .yml
----
-ホスト: dbsrvs
リモートユーザー: root
タスク:
-名前: httpdをインストール
yum :名前= httpd

-名前: httpdを起動
サービス
名前: httpd
状態:開始済み
有効:はい

上記の例では、空行を追加しました。空行や​#​コメント行があってもYAMLファイルの実行には影響しません。また、すべてのタスクが詰め込まれて雑然とした見た目になるのではなく、見た目も美しくなります。

(5)変数

通常、変数情報は、次の形式で roles/vars/main.yml に格納されます。

 [ root @ayunw ansible - project ] # cat roles / docker / vars / main . yml
EMQXNAME : emq_perf

依存パッケージ:
- yum -ユーティリティ
-デバイス-マッパー-永続的-データ
- lvm2
-ブリッジ-ユーティリティ

DOCKER_PKG :
- containerd.io - 1.6.6
- docker - ce - 20.10.17
-docker - ce - cli - 20.10.17

(6)テンプレート

テンプレートは主にJinjia2テンプレート言語(拡張子は.j2)を使用し、基本的には設定ファイルです。例えば:

 [root@ayunw ansible-project]# cat roles/docker/templates/daemon.json.j2
{
"exec-opts": ["native.cgroupdriver=systemd"],
"ログドライバー": "jsonファイル",
「ログレベル」:「警告」
「ログオプション」: {
"最大サイズ": "1g",
"最大ファイル": "4"
},
「データルート」: 「/data/docker」
「ストレージドライバー」:「オーバーレイ2」
}

(7)ハンドラーと通知

これら2つは通常、一緒に使用されます。例えば、サービス設定の変更に再起動が必要な場合、設定変更後に「notify」関数を設定する必要があります。そうすることで、ハンドラーはプレイブックが終了する前にサービスの再起動操作を実行します。サービスを再起動するハンドラーが定義されているものの、「notify」関数が定義されていない場合、すべてのタスクが完了した後にもサービスの再起動操作がトリガーされます。

典型的な例を 2 つ挙げます。

例は https://docs.ansible.com/ansible/latest/user_guide/playbooks_handlers.html から引用されています。

例1:

 ---
- name : Apacheのインストールを確認する
ホスト:ウェブサーバー
変数:
http_port : 80
最大クライアント数: 200
リモートユーザー: root
タスク:
- name : Apacheが最新バージョンあることを確認する
ansible.builtin.yum :
名前: httpd
状態:最新

- name : Apache設定ファイル書き込む
ansible .組み込み.テンプレート:
ソース: /srv/httpd.j2
dest : /etc/httpd.conf
通知:
- Apacheを再起動します

- name : Apache動作していることを確認する
ansible.builtin.service :
名前: httpd
状態:開始済み

ハンドラー:
- name : Apacheを再起動します
ansible.builtin.service :
名前: httpd
状態:再起動

例2:

タスク:
- name :テンプレート設定ファイル
ansible .組み込み.テンプレート:
ソース:テンプレート.j2
保存先: /etc/foo.conf
通知:
- Apacheを再起動します
- memcachedを再起動する

ハンドラー:
- name : memcachedを再起動する
ansible.builtin.service :
名前: memcached
状態:再起動

- name : Apacheを再起動します
ansible.builtin.service :
名前: Apache
状態:再起動

(8) タグ

Ansible Playbookでは、各タスクにタグを付けることで、特定の種類の他のタスクと区別することができます。固有のタグが付いたタスクを実行したい場合は、`ansible playbook`コマンドに`-t`パラメータを追加することで、そのタグの実行Playbookを指定できます。例えば、以下のようになります。

 Ansible -プレイブック- t ayunw install_docker .yml

VI. Ansible-playbook コマンド

コマンド形式: ansible-playbook <filename.yml>...[options]

一般的なオプション:

 -C --check # 潜在的な変更のみをチェックし、実際には操作は実行しません。
--list-hosts # タスクを実行しているホストを一覧表示します
--limit # ホストリスト内のホストで実行
-v -vv -vvv # プロンプトプロセス

例:

 ansible-playbook -C install_httpd.yaml

簡単な例:

 [ root @ayunw ansible -プロジェクト] # cat copy_files . yml
---
-ホスト: dbsrvs
タスク:
-名前:複数のファイルをコピー
コピー: src = {{ item }} dest = "/etc/yum.repos.d/"所有者= rootグループ= rootモード= 0644
アイテム付き:
- 「files/CentOS-Base.repo
- "files/epel.repo
#さらに推奨される方法:
[ root @ayunw ansible -プロジェクト] # cat copy_files . yml
---
-ホスト: dbsrvs
タスク:
-名前:複数のファイルをコピー
コピー
ソース: "{{ item }}"
保存先: "/etc/yum.repos.d/"
所有者:ルート
グループ:ルート
モード: 0644
アイテム付き:
- 「files/CentOS-Base.repo
- "files/epel.repo

実行スクリプト:

 [ root @ayunw ansible -プロジェクト] # ansible -プレイブック- C cf . yml

再生[ dbsrvs ] *****************************************************************************************************************************************************************************************

タスク[事実の収集] ****************************************************************************************************************************************************************************
大丈夫: [ 10.10.108.30 ]

タスク[複数のファイルをコピー] *************************************************************************************************************************************************************************************
ok : [ 10.10 .108 .30 ] => ( item = files / CentOS - Base . repo )
ok : [ 10.10 .108 .30 ] => ( item = files / epel . repo )

プレイ概要********************************************************************************************************************************************************************************************************
10.10 .108 .30 :正常= 2、変更= 0 、到達不能= 0 、失敗= 0、スキップ= 0、復旧= 0 無視= 0

[ root @ayunw ansible -プロジェクト] # ansible -プレイブックcopy_files . yml

上記の内容は、Ansible Playbookスクリプトの概要と基本的な使用方法を示したものです。もちろん、その機能はこれにとどまらず、より高度な用途にも活用できます。