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ロールに変換します。
参考までに、これはそのチュートリアルのプレイブックです。
- ---
- - 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
ディレクトリ、および実行時に収集されるホスト情報。 - タスク:このディレクトリには、通常はで定義されるタスクを含む1つ以上のファイルが含まれています。
tasks
通常のAnsibleプレイブックのセクション。 これらのタスクは、ファイルへのフルパスを指定しなくても、ロール内のそれぞれのディレクトリに含まれているファイルとテンプレートを直接参照できます。 - vars :ロールの変数は、このディレクトリ内のファイルで指定して、ロールの他の場所で参照できます。
と呼ばれるファイルの場合 main.yml
ディレクトリに存在する場合、その内容はロールを呼び出すプレイブックに自動的に追加されます。 ただし、これは適用されません files
と templates
ディレクトリは、その内容を明示的に参照する必要があるためです。
プレイブックを役割に変える
Ansibleロールの各ディレクトリが何に使用されるかを理解したので、Apacheプレイブックをより適切に整理するためのロールに変えます。
私たちはすでに持っている必要があります roles/apache2/{subdirectories}
前のセクションから設定された構造。 次に、役割を定義するためにいくつかのYAMLファイルを作成する必要があります。
タスクのmain.ymlファイルの作成
まず、tasksサブディレクトリから始めます。 今すぐそのディレクトリに移動します。
- cd ~/roles/apache/tasks
を作成する必要があります main.yml
このディレクトリ内のファイル。 Apacheプレイブックの内容全体を入力してから、タスクのみが含まれるように編集します。
- nano 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
強調表示されているセクション。 タスクの左側にある余分なスペースを削除することもできます。 また、Apacheモジュールを有効にするための新しいセクションを追加します。 modsecurity
これは、このチュートリアルの後半で構成します。 これらの変更後、私たちの新しい ~/roles/apache/tasks/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
保持する必要のある部分が再び強調表示されます。
- ---
- - 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はロールを適切に実行できません。
まず、を作成します index.html
のファイル ~/roles/apache/files
ディレクトリ:
- 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は、ユーザーが提供する役割のリポジトリであり、プレイブックに追加して、自分で作成しなくてもさまざまなタスクを実行できます。
たとえば、次のような便利なApacheモジュールを追加できます。 mod_security2
いくつかの追加のセキュリティ設定で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
役割、Apacheがリモートシステムでセットアップおよび構成されていることを確認してから、 geerlingguy.php
役割の場所。 含めることもできます mysql
、 と wordpress
リモートサーバーの動作に応じて、任意の順序で役割を選択します。
ランニング ansible-playbook playbook.yml
Galaxyの役割を追加すると、次のような出力になります。
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コードがクリーンで読みやすいことを保証します。 最も重要なことは、ロールを使用すると、コードを簡単に再利用および共有し、制御されたモジュール方式で変更を実装できることです。