構成管理101:AnsiblePlaybookの作成
序章
簡単に言うと、サーバー構成管理(一般にIT自動化とも呼ばれます)は、インフラストラクチャ管理をコードベースに変換するソリューションであり、バージョン管理して簡単に再利用できる一連のプロビジョニングスクリプトでサーバーを展開するために必要なすべてのプロセスを記述します。 時間の経過とともに、サーバーインフラストラクチャの整合性を大幅に向上させることができます。
以前のガイドでは、サーバーインフラストラクチャに構成管理戦略を実装する主な利点、構成管理ツールの仕組み、およびこれらのツールに通常共通するものについて説明しました。
シリーズのこのパートでは、究極のシンプルさとミニマリズムの目標を維持しながら、完全な自動化フレームワークとオーケストレーション機能を提供する構成管理ツールであるAnsibleを使用してサーバープロビジョニングを自動化するプロセスについて説明します。 Apacheを使用してUbuntu18.04Webサーバーのデプロイを完全に自動化するための簡略化された例を作成するために必要な言語の用語、構文、および機能に焦点を当てます。
次のリストには、目標を達成するために自動化する必要のあるすべての手順が含まれています。
- を更新します
apt
キャッシュ - Apacheをインストールします
- カスタムドキュメントルートディレクトリを作成します
- を配置します
index.html
カスタムドキュメントルートのファイル - テンプレートを適用して、カスタム仮想ホストを設定します
- Apacheを再起動します
まず、Ansibleで使用される用語を見てから、プレイブックの作成に使用できる主な言語機能の概要を説明します。 ガイドの最後に、Ubuntu18.04でApacheをセットアップするために説明されている手順を自動化するための完全なプロビジョニング例の内容があります。
注:このガイドは、Ansible言語と、サーバープロビジョニングを自動化するためのプレイブックの作成方法を紹介することを目的としています。 このツールのインストールと開始に必要な手順、Ansibleコマンドとプレイブックの実行方法など、Ansibleの概要については、 Ubuntu18.04ガイドにAnsibleをインストールして構成する方法を確認してください。 。
入門
Ansibleのより実践的なビューに移る前に、このツールによって導入された重要な用語と概念を理解することが重要です。
用語
次のリストには、Ansibleで使用される最も関連性の高い用語の概要が含まれています。
- コントロールノード:Ansibleがインストールされているマシンで、管理しているサーバーでプロビジョニングを実行します。
- 在庫:
INI
管理しているサーバーに関する情報を含むファイル。 - プレイブック:a
YAML
自動化する必要のある一連の手順を含むファイル。 - タスク:実行する単一のプロシージャを定義するブロック。例:パッケージのインストール。
- Module :モジュールは通常、パッケージの処理やファイルの作成と変更などのシステムタスクを抽象化します。 Ansibleには多数の組み込みモジュールがありますが、カスタムモジュールを作成することもできます。
- Role :再利用と共有を容易にするために事前定義された方法で編成された、関連するプレイブック、テンプレート、およびその他のファイルのセット。
- Play :最初から最後まで実行されるプロビジョニングはplayと呼ばれます。
- 事実:ネットワークインターフェイスやオペレーティングシステムなど、システムに関する情報を含むグローバル変数。
- ハンドラー:サービスの再起動やリロードなどのサービスステータスの変更をトリガーするために使用されます。
タスク形式
タスクは、Ansibleによって実行される必要がある単一の自動化されたステップを定義します。 これには通常、モジュールの使用またはrawコマンドの実行が含まれます。 タスクは次のようになります。
- name: This is a task
apt: name=vim state=latest
The name
一部は実際にはオプションですが、タスクの実行時にプロビジョニングの出力に表示されるため、推奨されます。 The apt
一部は、Debianベースのディストリビューションでパッケージの管理を抽象化する組み込みのAnsibleモジュールです。 このサンプルタスクは、Ansibleにパッケージが vim
状態を次のように変更する必要があります latest
、これにより、パッケージマネージャーは、まだインストールされていない場合にこのパッケージをインストールします。
プレイブック形式
プレイブックは YAML
サーバーのプロビジョニングを自動化するための一連のディレクティブを含むファイル。 次の例は、2つのタスクを実行する簡単なプレイブックです。 apt
キャッシュとインストール vim
その後:
---
- hosts: all
become: true
tasks:
- name: Update apt-cache
apt: update_cache=yes
- name: Install Vim
apt: name=vim state=latest
YAML
データ構造をシリアル化するためにインデントに依存しています。 そのため、プレイブックを作成するとき、特に例をコピーするときは、正しいインデントを維持するために特に注意する必要があります。
このガイドが終了する前に、詳細に説明されている、より実際のプレイブックの例を見ていきます。 次のセクションでは、Ansibleプレイブックの作成に使用できる最も重要な要素と機能の概要を説明します。
プレイブックを書く
Ansibleの基本的な用語とプレイブックとタスクの全体的な形式に精通しているので、より用途の広い自動化を作成するのに役立ついくつかのプレイブック機能について学習します。
変数の操作
Ansibleで変数を定義する方法はいくつかあります。 最も簡単な方法は、 vars
プレイブックのセクション。 以下の例では、変数を定義しています package
後でタスク内で使用されます。
---
- hosts: all
become: true
vars:
package: vim
tasks:
- name: Install Package
apt: name={{ package }} state=latest
The package
変数にはグローバルスコープがあります。つまり、含まれているファイルやテンプレートからでも、プロビジョニングの任意のポイントからアクセスできます。
ループの使用
ループは通常、異なる入力値を使用してタスクを繰り返すために使用されます。 たとえば、10個の異なるパッケージをインストールするために10個のタスクを作成する代わりに、単一のタスクを作成し、ループを使用して、インストールするすべての異なるパッケージでタスクを繰り返すことができます。
タスク内にループを作成するには、オプションを含めます with_items
値の配列を使用します。 コンテンツはループ変数を介してアクセスできます item
、以下の例に示すように:
- name: Install Packages
apt: name={{ item }} state=latest
with_items:
- vim
- git
- curl
配列変数を使用してアイテムを定義することもできます。
---
- hosts: all
become: true
vars:
packages: [ 'vim', 'git', 'curl' ]
tasks:
- name: Install Package
apt: name={{ item }} state=latest
with_items: "{{ packages }}"
条件文の使用
条件を使用すると、たとえば、変数やコマンドからの出力に基づいて、タスクを実行するかどうかを動的に決定できます。
次の例では、Debianベースのシステムのみをシャットダウンします。
- name: Shutdown Debian Based Systems
command: /sbin/shutdown -t now
when: ansible_os_family == "Debian"
条件付き when
評価する式を引数として受け取ります。 式が次のように評価された場合にのみ、タスクが実行されます。 true
. この例では、 fact をテストして、オペレーティングシステムがDebianファミリのものであるかどうかを確認しました。
IT自動化における条件付きの一般的な使用例は、タスクの実行がコマンドの出力に依存する場合です。 Ansibleを使用してこれを実装する方法は、コマンド実行の結果を保持する変数を登録し、その後のタスクでこの変数をテストすることです。 コマンドの終了ステータスをテストできます(失敗または成功した場合)。 出力内の特定の内容を確認することもできますが、これには正規表現と文字列解析コマンドの使用が必要になる場合があります。
次の例は、からの出力に基づく2つの条件付きタスクを示しています。 php -v
指図。 PHPがこのサーバーにインストールされていない場合、コマンドの実行に失敗することがわかっているため、コマンドの終了ステータスをテストします。 The ignore_errors
タスクの一部は、コマンドの実行に失敗した場合でもプロビジョニングを継続するために重要です。
- name: Check if PHP is installed
register: php_installed
command: php -v
ignore_errors: true
- name: This task is only executed if PHP is installed
debug: var=php_install
when: php_installed|success
- name: This task is only executed if PHP is NOT installed
debug: msg='PHP is NOT installed'
when: php_installed|failed
The debug
ここで使用するモジュールは、変数の内容やデバッグメッセージを表示するのに便利なモジュールです。 文字列を印刷することもできます( msg
引数)または変数の内容を出力します(を使用する場合 var
口論)。
テンプレートの操作
テンプレートは通常、構成ファイルを設定するために使用され、これらのファイルをより用途が広く再利用可能にすることを目的とした変数やその他の機能を使用できるようにします。 AnsibleはJinja2テンプレートエンジンを使用します。
次の例は、このホストのドキュメントルートを設定するための変数を使用して、Apache仮想ホストを設定するためのテンプレートです。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot {{ doc_root }}
<Directory {{ doc_root }}>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
内蔵モジュール template
タスクからテンプレートを適用するために使用されます。 上記のテンプレートファイルに名前を付けた場合 vhost.tpl
、そしてそれをプレイブックと同じディレクトリに配置した場合、これはデフォルトのApache仮想ホストを置き換えるためにテンプレートを適用する方法です。
- name: Change default Apache virtual host
template:
src: vhost.tpl
dest: /etc/apache2/sites-available/000-default.conf
ハンドラーの定義とトリガー
ハンドラーは、restartやstopなどのサービスの状態変更をトリガーするために使用されます。 通常のタスクとかなり似ているように見えるかもしれませんが、ハンドラーは以前に notify
タスクのディレクティブ。 それらは通常、 handlers
プレイブックのセクションですが、別々のファイルに保存することもできます。
Apache仮想ホストをセットアップした以前のテンプレートの使用例を考慮に入れましょう。 仮想ホストの変更後にApacheが確実に再起動されるようにする場合は、最初にApacheサービスのハンドラーを作成する必要があります。 ハンドブック内でハンドラーを定義する方法は次のとおりです。
handlers:
- name: restart apache
service: name=apache2 state=restarted
- name: other handler
service: name=other state=restarted
The name
ここでのディレクティブは、このハンドラーの一意の識別子になるため、重要です。 タスクからこのハンドラーをトリガーするには、 notify
オプション:
- name: Change default Apache virtual host
template:
src: vhost.tpl
dest: /etc/apache2/sites-available/000-default.conf
notify: restart apache
Ansibleプレイブックの作成を開始するために使用できる最も重要な機能のいくつかを見てきました。 次のセクションでは、UbuntuへのApacheのインストールと構成を自動化するプレイブックの実際の例について詳しく説明します。
プレイブックの例
次に、このガイドの概要で説明されているように、Ubuntu18.04システム内でのApacheWebサーバーのインストールを自動化するプレイブックを見てみましょう。
Apacheを設定するためのテンプレートファイルとWebサーバーによって提供されるHTMLファイルを含む完全な例は、Githubのにあります。 このフォルダーには、 Vagrant によって管理される仮想マシンを使用して、簡単なセットアップでプレイブックをテストできるVagrantfileも含まれています。
プレイブックの内容
プレイブックの全内容は、あなたの便宜のためにここにあります:
- ---
- - hosts: all
- become: true
- vars:
- doc_root: /var/www/example
- tasks:
- - name: Update apt
- apt: update_cache=yes
-
- - name: Install Apache
- apt: name=apache2 state=latest
-
- - name: Create custom document root
- file: path={{ doc_root }} state=directory owner=www-data group=www-data
-
- - name: Set up HTML file
- copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
-
- - name: Set up Apache virtual host file
- template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
- notify: restart apache
- handlers:
- - name: restart apache
- service: name=apache2 state=restarted
-
このプレイブックの各部分をさらに詳しく調べてみましょう。
hosts:all プレイブックは、適用する必要があることを示すことから始まります all
インベントリ内のホスト(hosts: all
). プレイブックの実行を特定のホストまたはホストのグループに制限することができます。 このオプションは、実行時に上書きできます。
になる:true become: true
部分は、このプレイブックのすべてのタスクを実行するために特権昇格(sudo)を使用するようにAnsibleに指示します。 このオプションは、タスクごとに上書きできます。
vars変数を定義します。 doc_root
、後でタスクで使用されます。 このセクションには、複数の変数を含めることができます。
タスク実際のタスクが定義されているセクション。 最初のタスクはを更新します apt
キャッシュし、2番目のタスクがパッケージをインストールします apache2
.
3番目のタスクは、組み込みモジュール file を使用して、ドキュメントルートとして機能するディレクトリを作成します。 このモジュールは、ファイルとディレクトリを管理するために使用できます。
4番目のタスクは、モジュール copy を使用して、ローカルファイルをリモートサーバーにコピーします。 ApacheがホストするWebサイトとして提供される単純なHTMLファイルをコピーしています。
ハンドラー最後に、 handlers
セクション。サービスが宣言されます。 を定義します restart apache
Apacheテンプレートが適用される4番目のタスクから通知されるハンドラー。
プレイブックの実行
このプレイブックのコンテンツをAnsibleコントロールノードにダウンロードすると、次を使用できます。 ansible-playbook
インベントリから1つ以上のノードで実行します。 次のコマンドは、SSHキーペア認証を使用して現在のシステムユーザーとして接続し、デフォルトのインベントリファイルからすべてのホストでプレイブックを実行します。
- ansible-playbook playbook.yml
使用することもできます -l
インベントリからの単一のホストまたはホストのグループに実行を制限するには:
- ansible-playbook -l host_or_group playbook.yml
リモートサーバーに接続するために別のSSHユーザーを指定する必要がある場合は、引数を含めることができます -u user
そのコマンドに:
- ansible-playbook -l host_or_group playbook.yml -u remote-user
Ansibleコマンドとプレイブックの実行方法の詳細については、 Ubuntu18.04にAnsibleをインストールして構成する方法に関するガイドを参照してください。
結論
Ansibleは、学習曲線が低く、 YAML
プロビジョニングスクリプト用。 パッケージのインストールやテンプレートの操作などのタスクを抽象化するために使用できる多数の組み込みモジュールがあります。 その簡素化されたインフラストラクチャ要件とシンプルな言語は、構成管理を始めようとしている人にぴったりです。 ただし、PuppetやChefなどのより複雑なツールで見つけることができるいくつかの高度な機能が不足している可能性があります。
このシリーズの次のパートでは、Rubyに基づく表現力豊かで強力なカスタムDSLを使用してプロビジョニングスクリプトを作成する、人気のある定評のある構成管理ツールであるPuppetの実用的な概要を説明します。