構成管理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がインストールされているマシンで、管理しているサーバーでプロビジョニングを実行します。
- Inventory :管理しているサーバーに関する情報を含む
INI
ファイル。 - Playbook :自動化する必要のある一連の手順を含む
YAML
ファイル。 - タスク:実行する単一のプロシージャを定義するブロック。例:パッケージのインストール。
- Module :モジュールは通常、パッケージの処理やファイルの作成と変更などのシステムタスクを抽象化します。 Ansibleには多数の組み込みモジュールがありますが、カスタムモジュールを作成することもできます。
- Role :再利用と共有を容易にするために事前定義された方法で編成された、関連するプレイブック、テンプレート、およびその他のファイルのセット。
- Play :最初から最後まで実行されるプロビジョニングはplayと呼ばれます。
- 事実:ネットワークインターフェイスやオペレーティングシステムなど、システムに関する情報を含むグローバル変数。
- ハンドラー:サービスの再起動やリロードなどのサービスステータスの変更をトリガーするために使用されます。
タスク形式
タスクは、Ansibleによって実行される必要がある単一の自動化されたステップを定義します。 これには通常、モジュールの使用またはrawコマンドの実行が含まれます。 タスクは次のようになります。
- name: This is a task
apt: name=vim state=latest
name
の部分は実際にはオプションですが、タスクの実行時にプロビジョニングの出力に表示されるため、お勧めします。 apt
部分は、Debianベースのディストリビューションでのパッケージの管理を抽象化する組み込みのAnsibleモジュールです。 このサンプルタスクは、パッケージvim
の状態をlatest
に変更する必要があることをAnsibleに通知します。これにより、パッケージマネージャーは、まだインストールされていない場合にこのパッケージをインストールします。
プレイブック形式
プレイブックは、サーバーのプロビジョニングを自動化するための一連のディレクティブを含む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
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を使用してこれを実装する方法は、コマンド実行の結果を保持する変数を登録し、後続のタスクでこの変数をテストすることです。 コマンドの終了ステータスをテストできます(失敗または成功した場合)。 出力内の特定の内容を確認することもできますが、これには正規表現と文字列解析コマンドの使用が必要になる場合があります。
次の例は、php -v
コマンドからの出力に基づく2つの条件付きタスクを示しています。 PHPがこのサーバーにインストールされていない場合、コマンドの実行に失敗することがわかっているため、コマンドの終了ステータスをテストします。 タスクの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
ここで使用する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
ここでの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
)に適用する必要があることを示すことから始まります。 プレイブックの実行を特定のホストまたはホストのグループに制限することができます。 このオプションは、実行時に上書きできます。
become:true become: true
の部分は、このプレイブックのすべてのタスクを実行するために特権昇格(sudo)を使用するようにAnsibleに指示します。 このオプションは、タスクごとに上書きできます。
vars後でタスクで使用される変数doc_root
を定義します。 このセクションには、複数の変数を含めることができます。
タスク実際のタスクが定義されているセクション。 最初のタスクはapt
キャッシュを更新し、2番目のタスクはパッケージapache2
をインストールします。
3番目のタスクは、組み込みモジュール file を使用して、ドキュメントルートとして機能するディレクトリを作成します。 このモジュールは、ファイルとディレクトリを管理するために使用できます。
4番目のタスクは、モジュール copy を使用して、ローカルファイルをリモートサーバーにコピーします。 ApacheがホストするWebサイトとして提供される単純なHTMLファイルをコピーしています。
handlers 最後に、サービスが宣言されるhandlers
セクションがあります。 Apacheテンプレートが適用される4番目のタスクから通知されるrestart apache
ハンドラーを定義します。
プレイブックの実行
このプレイブックのコンテンツを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
を使用する、学習曲線が短い最小限のIT自動化ツールです。 パッケージのインストールやテンプレートの操作などのタスクを抽象化するために使用できる多数の組み込みモジュールがあります。 その簡素化されたインフラストラクチャ要件とシンプルな言語は、構成管理を始めようとしている人にぴったりです。 ただし、PuppetやChefなどのより複雑なツールで見つけることができるいくつかの高度な機能が不足している可能性があります。
このシリーズの次のパートでは、Rubyに基づく表現力豊かで強力なカスタムDSLを使用してプロビジョニングスクリプトを作成する、人気のある定評のある構成管理ツールであるPuppetの実用的な概要を説明します。