Ansibleロールを使用してインフラストラクチャ環境を抽象化する方法
序章
Ansibleは、管理者と運用チームのサーバーの制御を自動化するように設計された構成管理ツールです。 Ansibleを使用すると、単一の中央サーバーを使用して、SSHとPythonを唯一の要件として使用して多くの異なるリモートシステムを制御および構成できます。
Ansibleは、タスク定義に基づいて管理するサーバー上でタスクを実行します。 これらのタスクは、タスクごとにYAMLの小さなスニペットを使用して、組み込みのコミュニティで維持されているAnsibleモジュールを呼び出します。
単一のAnsibleコントロールノードで管理するシステムの数と種類が複雑になるにつれて、タスクをAnsibleプレイブックにグループ化することは理にかなっています。 プレイブックを使用すると、リモートシステムで多くの個別のタスクを実行する必要がなくなり、代わりに1つのファイルで環境全体を一度に構成できます。
ただし、プレイブックは、システムごとに複数のタスクを使用して多くの異なるシステムを構成する必要がある場合、複雑になる可能性があるため、AnsibleではRoleと呼ばれるディレクトリ構造にタスクを整理することもできます。 この構成では、プレイブックはタスクではなくロールを呼び出すため、タスクをグループ化して、他のプレイブックでロールを再利用できます。 ロールを使用すると、テンプレート、静的ファイル、および変数をタスクとともに1つの構造化された形式で収集することもできます。
このチュートリアルでは、ロールを作成する方法と、テンプレート、静的ファイル、および変数をロールに追加する方法について説明します。 役割の構築の基本に慣れたら、 Ansible Galaxy を使用して、コミュニティが提供する役割をプレイブックに組み込みます。 このチュートリアルを終了するまでに、サーバー用に独自の環境固有の役割を作成し、それらを独自のプレイブックで使用して1つまたは複数のシステムを管理できるようになります。
前提条件
このチュートリアルに従うには、プレイブックを作成して実行できるように、Ansibleをインストールして構成する必要があります。 また、Ansibleプレイブックの書き方を理解する必要があります。
Ansibleの役割とは何ですか?
前提条件のチュートリアルでは、ターミナルでansible
コマンドを使用してコアAnsibleツールを実行する方法を学習しました。 また、タスクをプレイブックに収集し、ansible-playbook
コマンドを使用してそれらを実行する方法も学びました。 単一のコマンドの実行からタスク、プレイブックへの進行における次のステップは、Ansibleの役割を使用してすべてを再編成することです。
ロールは、タスクとプレイブックに加えて抽象化されたレベルであり、モジュール式で再利用可能な形式でAnsible構成を構造化できます。 プレイブックに機能と柔軟性を追加するにつれて、プレイブックは扱いにくくなり、保守が困難になる可能性があります。 ロールを使用すると、複雑なプレイブックを、中央のエントリポイントで調整できる個別の小さなチャンクに分割できます。 たとえば、このチュートリアルでは、使用するplaybook.yml
全体は次のようになります。
プレイブックの例
--- - hosts: all become: true roles: - apache vars: doc_root: /var/www/example
Apache Webサーバーを構成するために実行される一連のタスクはすべて、作成するapache
ロールに含まれます。 ロールは、構成管理101:Ansible Playbooks の前提条件で行ったように各タスクを個別にリストするのではなく、Apacheをインストールするために完了する必要のあるすべてのタスクを定義します。
Ansibleセットアップをロールに編成すると、異なるタイプのサーバー間で共通の構成手順を再利用できます。 これは、1つのプレイブックに複数のタスクファイルを含めることでも可能ですが、ロールは、既知のディレクトリ構造とファイル名の規則に依存して、プレイ内で使用されるファイルを自動的にロードします。
一般に、ロールの背後にある考え方は、一貫した構造を使用してタスクを共有および再利用できるようにすると同時に、すべてのインフラストラクチャのタスクを複製することなくタスクを簡単に維持できるようにすることです。
役割の作成
Ansibleロールを作成するには、特別にレイアウトされたディレクトリ構造が必要になります。 Ansibleがそれらを見つけて使用できるように、ロールには常にこのディレクトリレイアウトが必要です。
ここでは、ユーザーのホームディレクトリをAnsibleの作業ディレクトリとして使用していることを前提としています。 Ansible構成を別の場所に保持している場合は、(cd
)をそのディレクトリに変更する必要があります。
まず、roles
というディレクトリを作成しましょう。 このチュートリアルの後半でPlaybookで新しい役割を使用する場合は、Ansibleがここを参照します。
cd ~ mkdir roles cd roles
このディレクトリ内で、複数のプレイブックや異なるサーバー間で再利用できる役割を定義します。 作成する各ロールには、独自のディレクトリが必要です。 Configuration Management 101:Writing Ansible Playbooks チュートリアルからApacheプレイブックの例を取り上げ、再利用可能なAnsibleロールに変換します。
参考までに、これはそのチュートリアルのプレイブックです。
playbook.yml
--- - 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
まず、ロール用のApacheディレクトリを作成し、必要なディレクトリを設定します。
mkdir apache cd apache
次に、コンテンツをロールとして使用する必要があることをAnsibleに通知する必要なサブディレクトリのセットを作成します。 mkdir
コマンドを使用してこれらのディレクトリを作成します。
mkdir defaults files handlers meta templates tasks vars
これらのディレクトリには、私たちの役割を実装するためのすべてのコードが含まれます。 多くの役割は、関連するタスクの複雑さに応じて、これらのディレクトリの1つまたはいくつかのみを使用します。 独自の役割を作成する場合、これらのディレクトリのすべてを作成する必要はない場合があります。
各ディレクトリが表す内容は次のとおりです。
- defaults :このディレクトリでは、含まれる役割または依存する役割のデフォルト変数を設定できます。 ここで設定されたデフォルトは、プレイブックまたはインベントリファイルで上書きできます。
- files :このディレクトリには、リモートサーバーにコピーまたは実行される可能性のある静的ファイルとスクリプトファイルが含まれています。
- handlers :以前プレイブックにあったすべてのハンドラーをこのディレクトリに追加できるようになりました。
- meta :このディレクトリはロールメタデータ用に予約されており、通常は依存関係の管理に使用されます…たとえば、現在のロールが呼び出される前に適用する必要があるロールのリストを定義できます。
- templates :このディレクトリは、リモートホストでファイルを生成するテンプレート用に予約されています。 テンプレートは通常、
vars
ディレクトリにあるファイル、および実行時に収集されるホスト情報で定義された変数を使用します。 - tasks :このディレクトリには、通常のAnsibleプレイブックの
tasks
セクションで通常定義されるタスクを含む1つ以上のファイルが含まれています。 これらのタスクは、ファイルへのフルパスを指定しなくても、ロール内のそれぞれのディレクトリに含まれているファイルとテンプレートを直接参照できます。 - vars :ロールの変数は、このディレクトリ内のファイルで指定して、ロールの他の場所で参照できます。
main.yml
というファイルがディレクトリに存在する場合、その内容はロールを呼び出すプレイブックに自動的に追加されます。 ただし、files
およびtemplates
ディレクトリの内容は明示的に参照する必要があるため、これは適用されません。
プレイブックを役割に変える
Ansibleロールの各ディレクトリが何に使用されるかを理解したので、Apacheプレイブックをより適切に整理するためのロールに変えます。
前のセクションからroles/apache2/{subdirectories}
構造がすでに設定されているはずです。 次に、役割を定義するためにいくつかのYAMLファイルを作成する必要があります。
タスクのmain.ymlファイルの作成
まず、tasksサブディレクトリから始めます。 今すぐそのディレクトリに移動します。
cd ~/roles/apache/tasks
このディレクトリにmain.yml
ファイルを作成する必要があります。 Apacheプレイブックの内容全体を入力してから、タスクのみが含まれるように編集します。
nano main.yml
開始すると、ファイルは次のようになります。
main.yml
--- - 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
最初の---
行と、強調表示されているtasks
セクションの行のみを保持します。 タスクの左側にある余分なスペースを削除することもできます。 また、このチュートリアルの後半で構成するmodsecurity
というApacheモジュールを有効にするための新しいセクションを追加します。 これらの変更後、新しい~/roles/apache/tasks/main.yml
ファイルは次のようになります。
main.yml
--- - 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
これで、タスクファイルには、Apacheロールを使用するときに実行される実際のステップのみが含まれているため、追跡と理解が容易になります。
copy
行とtemplate
行がそれぞれsrc=index.html
とsrc=vhost.tpl
を使用して、先行パスなしでロール内のファイルを参照していることに注意してください。 私たちの役割のディレクトリ構造により、ファイルとテンプレートを名前で直接参照することができ、Ansibleはそれらを自動的に見つけます。
編集が終了したら、必ずファイルを保存して閉じてください。
ハンドラーの作成main.yml
ファイル
プレイブックの大部分がtasks/main.yml
ファイルにあるので、ハンドラーセクションをhandlers/main.yml
にあるファイルに移動する必要があります。
最初にcd
をhandlers
サブディレクトリに配置します。
cd ~/roles/apache/handlers
ここでも、テキストエディタでファイルを開き、元のplaybook.yml
の内容全体を貼り付けます。
nano main.yml
保持する必要のある部分が再び強調表示されます。
playbook.yml
--- - 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
ハンドラーの前からも空白を削除します。 最終的に、ファイルは次のようになります。
--- - name: restart apache service: name=apache2 state=restarted
終了したら、ファイルを保存して閉じます。
ファイルとテンプレートの追加
タスクとハンドラーが配置されたので、次のステップは、index.html
ファイルとvhost.tpl
テンプレートがあることを確認して、Ansibleがそれらを見つけてリモートサーバーに配置できるようにすることです。 これらのファイルはtasks/main.yml
ファイルで参照されているため、存在する必要があります。そうでない場合、Ansibleはロールを正しく実行できません。
まず、~/roles/apache/files
ディレクトリにindex.html
ファイルを作成します。
cd ~/roles/apache/files nano index.html
以下をエディターに貼り付けて、保存して閉じます。
<html> <head><title>Configuration Management Hands On</title></head> <h1>This server was provisioned using <strong>Ansible</strong></h1> </html>
次に、vhost.tpl
テンプレートを編集します。 テンプレートディレクトリに移動し、nanoでファイルを編集します。
cd ~/roles/apache/templates nano vhost.tpl
これらの行をエディターに貼り付けてから、保存して閉じます。
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot {{ doc_root }} <Directory {{ doc_root }}> AllowOverride All Require all granted </Directory> </VirtualHost>
メタディレクトリ
役割が別の役割に依存している場合は、meta
ディレクトリにmain.yml
というファイルを追加できます。 このファイルは、このロールが「apt」と呼ばれるロールに依存することを指定している場合があります。 作成したApacheロールでは、依存関係は必要ありません。 ただし、「apt」などの別の役割が必要であるという架空のケースでは、~/roles/apache/meta/main.yml
のファイルは次のようになります。
--- dependencies: - apt
これにより、「apt」ロールがApacheロールの前に実行されるようになります。 このような依存関係を作成すると、実際の役割を実行する前に他のソフトウェアまたは構成を配置する必要がある、より複雑な役割で役立ちます。
Varsディレクトリ
先ほど、ロールの変数を設定するために使用できる「vars」ディレクトリがあると述べました。 vars/main.yml
ファイルを使用して役割のデフォルトのパラメーターを構成することは可能ですが、これは通常、小さな役割にはお勧めしません。
「vars」ディレクトリを使用しない理由は、構成の詳細がロール階層内に存在するようにするためです。 役割は主に一般的なタスクと依存関係ですが、変数は構成データです。 この2つを組み合わせると、自分の役割を他の場所で再利用することが難しくなります。
代わりに、機密情報の公開を心配せずに役割を簡単に共有できるように、役割の外部で構成の詳細を指定することをお勧めします。 また、ロール内で宣言された変数は、他の場所の変数によって簡単にオーバーライドされます。 特定のタスクに使用されるプレイブックに変数データを配置することをお勧めします。
ただし、「vars」ディレクトリは、より複雑な役割で役立つため、ここで言及する価値があります。 たとえば、ロールがさまざまなLinuxディストリビューションをサポートする必要がある場合、変数のデフォルト値を指定すると、さまざまなパッケージ名、バージョン、および構成を処理するのに役立ちます。
他のファイルを含める
多くのタスク、依存関係、または条件付きロジックを使用してロールを作成すると、それらが大きくなり、理解しにくくなることがあります。 このような状況では、タスクを独自のファイルに分割して、tasks/main.yml
に含めることができます。
たとえば、Apacheサーバー用にTLSを構成するための追加のタスクのセットがある場合、それらを独自のファイルに分離することができます。 ファイルをtasks/tls.yml
と呼び、次のようにtasks/main.yml
ファイルに含めることができます。
. . . tasks: - include: roles/apache/tasks/tls.yml
スケルトンプレイブックを作成する
役割構造を構成したので、このチュートリアルの最初のモノリシックバージョンと比較して、最小限のプレイブックでそれを使用できます。
このようにロールを使用すると、プレイブックを使用して、サーバーが実行することになっていることを宣言できます。そのために、タスクの作成を常に繰り返す必要はありません。
Apacheの役割を含む最小限のプレイブックを作成するには、役割ディレクトリ(この例ではホームディレクトリ)からcd
を作成します。 これで、プレイブックファイルを作成できます。
cd ~ nano playbook.yml
ファイルを開いたら、以下を貼り付けて、ファイルを保存して閉じます。
--- - hosts: all become: true roles: - apache vars: - doc_root: /var/www/example
このファイルに必要な情報はほとんどありません。 まず、この役割を実行するサーバーを一覧表示するため、- hosts: all
を使用します。 webservers
というホストのグループがある場合は、代わりにそれらをターゲットにすることができます。 次に、使用している役割を宣言します。 この場合は1つしかないため、- apache
行を使用します。
これが私たちのプレイブック全体です。 それは非常に小さく、読んで理解するのが速いです。 プレイブックをこのように整理しておくと、個々のタスクの仕組みではなく、サーバーを構成するための全体的な目標に集中できます。 さらに良いことに、複数の役割要件がある場合は、プレイブックのroles
セクションにそれらをリストすると、表示されている順序で実行されます。
たとえば、ApacheとMySQLを使用してWordPressサーバーをセットアップする役割がある場合、次のようなプレイブックが作成される可能性があります。
--- - hosts: wordpress_hosts become: true roles: - apache - php - mysql - wordpress vars: - doc_root: /var/www/example
このプレイブック構造により、サーバーをどのように見せたいかを非常に簡潔にすることができます。 最後に、プレイブックはロールを呼び出すため、プレイブックを実行するコマンドは、すべてが1つのファイルにある場合とまったく同じです。
ansible-playbook playbook.yml
OutputPLAY [all] ****************************************************************************************** TASK [Gathering Facts] ****************************************************** ok: [64.225.15.1] TASK [apache : Update apt] ************************************************** ok: [64.225.15.1] TASK [apache : Install Apache] ********************************************** changed: [64.225.15.1] TASK [apache : Create custom document root] ********************************* changed: [64.225.15.1] TASK [apache : Set up HTML file] ******************************************** changed: [64.225.15.1] TASK [apache : Set up Apache virtual host file] ***************************** changed: [64.225.15.1] RUNNING HANDLER [apache : restart apache] *********************************** changed: [64.225.15.1] PLAY RECAP ****************************************************************** 64.225.15.1 : ok=7 changed=5 unreachable=0 failed=0
たとえば、playbook.yml
ファイルapache.yml
を呼び出して、ファイルの名前にそのファイルに含まれる役割を反映させることもできます。
Ansible Galaxy
Ansible Galaxy で利用できるリソースを調べないと、Ansibleの役割に関するチュートリアルは完了しません。 検索可能なGalaxyは、ユーザーが提供する役割のリポジトリであり、プレイブックに追加して、自分で作成しなくてもさまざまなタスクを実行できます。
たとえば、mod_security2
という便利なApacheモジュールをプレイブックに追加して、いくつかの追加のセキュリティ設定でApacheを構成できます。 apache_modsecurityと呼ばれるAnsibleGalaxyの役割を使用します。 この役割を使用するには、ローカルにダウンロードしてから、プレイブックに含めます。
まず、ansible-galaxy
ツールについて理解しましょう。 ツールを使用してGalaxyを検索し、検索コマンドから返されたリストから役割を選択します。
ansible-galaxy search "PHP for RedHat/CentOS/Fedora/Debian/Ubuntu"
検索コマンドは、次のようなものを出力します。
OutputFound 21 roles matching your search: Name Description ---- ----------- alikins.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. bpresles.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. entanet_devops.ansible_role_php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. esperdyne.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. fidanf.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. frogasia.ansible-role-php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. geerlingguy.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. icamys.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. jhu-sheridan-libraries.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. jibsan94.ansible_php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. KAMI911.ansible_role_php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. monsieurbiz.geerlingguy_php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. nesh-younify.ansible-role-php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. net2grid.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. thom8.ansible-role-php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. v0rts.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. vahubert.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. Vaizard.mage_php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. viasite-ansible.php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. vvgelder.ansible-role-php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu. (END)
Ansibleはless
コマンドを使用して、結果が多い場合に検索結果を出力します。これにより、q
を押して終了するまで端末がブロックされます。 これは、検索結果が広範囲に渡り、space
を押すことで検索結果をパジネートする必要がある場合に役立ちます。
プレイブックの役割geerlingguy.php
を選択します。 検索結果から返される役割について詳しく知りたい場合は、 Galaxy検索ページにアクセスして、詳細を知りたい役割名を貼り付けてください。
プレイブックで使用する役割をダウンロードするには、ansible-galaxy install
コマンドを使用します。
ansible-galaxy install geerlingguy.php
そのコマンドを実行すると、次のような出力が表示されます。
Output- downloading role 'php', owned by geerlingguy - downloading role from https://github.com/geerlingguy/ansible-role-php/archive/3.7.0.tar.gz - extracting geerlingguy.php to /home/sammy/.ansible/roles/geerlingguy.php - geerlingguy.php (3.7.0) was installed successfully
これで、playbook.yml
ファイルに役割を追加できます。
--- - hosts: all become: true roles: - apache - geerlingguy.php vars: - doc_root: /var/www/example - php_default_version_debian: "7.2"
apache
ロールの後にロールを配置することにより、geerlingguy.php
ロールプレースの構成の前に、リモートシステムでApacheがセットアップおよび構成されていることを確認します。 mysql
、およびwordpress
の役割を、リモートサーバーの動作に応じて選択した任意の順序で含めることもできます。
Galaxyの役割を追加してansible-playbook playbook.yml
を実行すると、次のような出力になります。
OutputPLAY [all] ********************************************************************* TASK [Gathering Facts] ********************************************************* ok: [64.225.15.1] TASK [apache : Update apt] ***************************************************** changed: [64.225.15.1] TASK [apache : Install Apache] ************************************************* changed: [64.225.15.1] TASK [apache : Install modsecurity] ******************************************** changed: [64.225.15.1] TASK [apache : Create custom document root] ************************************ changed: [64.225.15.1] TASK [apache : Set up HTML file] *********************************************** changed: [64.225.15.1] TASK [apache : Set up Apache virtual host file] ******************************** changed: [64.225.15.1] TASK [geerlingguy.php : Include OS-specific variables.] ************************ ok: [64.225.15.1] TASK [geerlingguy.php : Define php_packages.] ********************************** ok: [64.225.15.1] . . . PLAY RECAP ********************************************************************* 64.225.15.1 : ok=37 changed=15 unreachable=0 failed=0 (END)
結論
Ansibleロールは、サーバーがどのように見えるかを構造化および定義するための優れた方法です。 各サーバーのプレイブックだけに頼ることができたとしても、それらの使用方法を学ぶことは価値があります。 Ansibleを広範囲に使用することを計画している場合、ロールはホストレベルの構成をタスクから分離し、Ansibleコードがクリーンで読みやすいことを保証します。 最も重要なことは、ロールを使用すると、コードを簡単に再利用および共有し、制御されたモジュール方式で変更を実装できることです。