Ansible 入門 - 基本操作(チュートリアル)
Contents
こちらの記事はではAnsibleを紹介するための文章で、元Red Hat社員のJingjing Shiが作成し、Wenhan Shiが日本語に翻訳しました。内容の校正はHideki SaitoとKento Yagisawaが協力しています。Ansibleの基礎知識から、実際の現場で利用できる実運用まで紹介しています。
本文内にあるすべてのansible playbookの例は、以下のgithubのURLから利用できる。 https://github.com/ansible-book/ansible-first-book-examples もし不備やコメントがありましたら、作者[email protected]または翻訳者[email protected] に連絡してください。
詳細の内容を下記三つに分けて説明します。
Ansible 入門 - 紹介 Ansible 入門 - 基本 Ansible 入門 - 応用
本章では、簡単な例を使ってAnsibleの基本的な使い方を説明する。
- インストール
- 管理対象のサーバー(サーバリストの管理)
- コマンドラインによるサーバー管理(Ad-hoc command)
- スクリプトによるサーバー管理(スクリプト言語 Playbook)
- モジュール
インストール
ここでは Red Hat 系 Linux でのインストールを前提に解説にする。他のOSに関していAnsibleのWebページをご参照ください。
管理者ノード
Ansible パッケージをインストール
|
|
管理者ノードからリモートノードの接続設定
SSH keyによる認証パスワードレス)方式を設定する。
|
|
設定確認
管理者ノードで下記コマンドを実行し、パスワードの入力とSSH keyの保存確認がなかったら設定完了。
|
|
リモートノード
Python 2.4以上が必要だが、通常はデフォルトでインストールされている。そのため、別途パッケージのインストールは必要ない。
管理対象のサーバー(サーバーリストの管理)
サーバリスト(Host Inventory)とは
Host InventoryはAnsibleの設定ファイルであり、管理対象となるリモートノードの一覧をAnsibleに教える。 また、下記のように状況に応じてリモートノードのカテゴリ化もできる。 使い道によってカテゴリ化する:データベースノード、サービスノード。 ロケーションによってカテゴリ化する:中部データセンター、西部データセンター
Host Inventoryファイル
デフォルトのファイルパス: /etc/ansible/hosts
他のファイルパスへ変更することもできる、詳細については後程紹介する。
例:
一番シンプルのhosts ファイル
|
|
カテゴリを持つhosts ファイル
|
|
コマンドラインによるサーバー管理(Ad-hoc command)
Ansibleではコマンドラインツールを提供していて、オフィシャルドキュメントでは Ad-Hoc Commandsと名付けている。ansibleコマンドのフォーマットを以下に示す。
|
|
Ansible コマンドができること
コマンドの構文の詳細を置いといて、”命令”モジュールの説明が終わったら構文の理解が深まりにいく。ここでは、下記のコマンドの例を通して、ansibleコマンドの役割を体感しましょう
環境を確認する
ansible管理者ノードからユーザ bruce で各リモートノードをアクセスすることを確認する。
|
|
コマンド実行
現在bash ユーザと同名のユーザがすべてのリモートノードに対し”echo”コマンドを実行する。
|
|
ファイルコピー
/etc/hosts
ファイル を全リモートノードのweb グループにコピーし、コピー先は/tmp/hosts
|
|
パッケージインストール
全リモートノードのweb グループのマシンにyum でacmeパッケージをインストール
|
|
ユーザ追加
|
|
パッケージダウンロード
|
|
サービス起動
|
|
並列実行
リブート命令を10並列で実行する。
|
|
リモートノード情報取得
|
|
スクリプトによるサーバー管理
重複な入力を避けるため、Ansibleをスクリプトの実行に対応する。AnsibleのスクリプトはPlaybookと読んで、YAML形式で、拡張子はymlである。Note: YAMLとJSONは似ていて、データを表示するフォーマットである。
Playbookの実行方法
|
|
Playbookの例
Playbook deploy.ymlを通して、webグループのリモートサーバに対しapacheをデプロイする。ステップとしては
- Apacheパッケージをインストール
- 設定ファイルhttpdをコピーし、コピー完了後apacheサービスを再起動することを保証
- デフォルトweb pageのindex.htmlをコピー
- Apacheサービスを起動
このPlaybook deploy.yml 内では以下のキーワードを含まれている。
キーワード | 内容 | 備考 |
---|---|---|
hosts | リモートノードのIP、またはグループ名、またはキーワードall | |
remote_user | 実行ユーザ | |
vars | 変数 | |
tasks[^1] | Playbookのコア部分、処理内容actionを順番通りに実行する。各actionはansible moduleを利用する。 | action の構文:module: module_parameter=module_value。 |
handers | Playbookのイベントで、デフォルトでは実行されず、action内でトリガーの条件に満足したら実行する。複数のトリガー条件にマッチしても1回のみ実行する。 |
[^1]よく利用するモジュールはyum, copy, templateなど。Ansibleの中のmodule は、bash の中のyum, copyの命令に似ている。詳細は後程紹介する。
以下はdeploy.ymlの内容を示す。
|
|
YAMLが分からなかったら、上記deploy.ymlをJSON形式に変換することも可能だ。
|
|
JSON と YAMLをお互いに変換するオンラインツール:http://www.json2yaml.com/
Play vs. Playbook
Playbookは Ansibleで実行可能な YAMLファイルである。一般的な構文を以下の例に示す。
|
|
一つのPlaybookファイルの中で、二つのリモートノードグループに対しそれぞれ異る操作を存在することができる。例えば、webノードにhttpdパッケージのインストールと、lbノードにmysqlパッケージのインストール処理を一つのPlaybook ファイルに設定することができる。
|
|
上記の例では、一つのサーバに対する操作処理は、一つのPlayになる。一般的には一つのPlaybookでは一つのPlayしか実行しないため、その場合にはPlaybookとPlayは同じである。
Ansibleのモジュール
Ansibleのモジュールとは
Bashを利用する時、コマンドラインでもスクリプト内でも、cd, ls, copy, yumなどの命令を実行する必要がある。AnsibleのモジュールはAnsibleの命令であり、Ansibleのコマンドラインやスクリプト上にて実行されている。よく使うモジュールとしてyum, copy, templateなどがある。
Bashでのコマンドを利用するときに、さまざまなオプションが利用できて、このオプションはコマンドごとに定義されている。それと同じように、Ansibleのモジュールを実行する時に複数のオプションをつけることができて、各モジュールのオプションはモジュール内に定義されている。
モジュールの利用方法は以下のドキュメントを参照で http://docs.ansible.com/ansible/modules_by_category.html
コマンドラインにてAnsibleモジュールを利用
Ansible コマンドラインでは、以下の様にモジュールを利用できる。
|
|
例えば
|
|
PlaybookにてAnsibleモジュールを利用
Playbookスクリプトでは、task内一つのactionは一つのモジュールを実行している。各actionに対し、
: の前はモジュールの名前
: の後ろはモジュールのパラメータ
|
|
Ansibleモジュールの特性
- Linuxのコマンドのように、Ansibleのモジュールはコマンドライン上で実行することもできるし、Playbook内に書いて実行することもできる。
- 各モジュールのパラメータや状態の判断は、このモジュールの仕様によって決められている。そのため、モジュールを利用する前に、このモジュールのドキュメントを参照することが必要である。
- オンラインドキュメントの参照は:http://docs.ansible.com/ansible/list_of_all_modules.html
- ansible-doc コマンドからモジュールの仕様が確認できる。
- Ansibleはよく利用するモジュールを多数公開していますが、APIを公開しているので、ユーザが自分のモジュールの開発もできる。AnsibleのモジュールはPythonで書かれている。
よく使うAnsibleモジュールの紹介
Linuxを利用する時、コマンド命令が分からないとLinux 利用することはできない。これと同じようにAnsibleを利用するために基本のモジュールを理解することが大事である。
これからは普段よく使われているモジュールを紹介する。
テスト&確認用
- ping: リモートノードにpingして、正常に接続ができる場合は”pong”を返す。
- debug: デバッグ用、情報を出力のみ、Linuxのecho コマンドに似ている。
ファイル操作
- copy: ローカルのファイルをリモートノードにコピー
- template: ローカルのファイルをリモートノードにコピーし、変数を変更
- file: ファイルのパーミッションや属性を設定
システム操作
- user: ユーザアカウント管理
- yum: red hat 系Linuxのパッケージ管理
- service: サービスの管理
- firewalld: ファイアウォール内のサービスやポートの管理
Shell命令実行
- shell: リモートノード上shell命令を実行、$HOMEや”<”, ”>”, “|”と“&”などは利用可能
- command: リモートノード上shell命令を実行、$HOMEや”<”, ”>”, “|”と“&”などは利用不可
ping
管理者ノードからリモートノードへの接続状態を確認するときに一番よく使われているモジュールである。ただShellのpingコマンドみたいにただリモートノードを”ping”するだけではなく、パスワードレスのSSHログインと、リモートノードのpythonのversionを確認し、両方問題なかったらpongを返す。
pingモジュールを使う時にパラメータが必要ない。リモートノードの接続状況を確認するためコマンドラインでの利用がplaybookの中より多くなっている。下記はコマンドラインでのpingモジュールの例を示す。
|
|
debug
Shellのechoコマンドに似ていて。メッセージを出力する。 msgパラメータに出力したいメッセージ内容を設定する。下の例では、システム情報をメッセージ内容に含めて出力している。Ansibleが実行する前にシステム情報を集めて定数にしているため、playbook内に定義しなくても利用できる。
|
|
実行結果
|
|
出力したい情報をvar パラメータを定義し出力させることができる。情報はシステム情報でも、モジュール実行結果を取り込むことができ、キーワードregesterを用いて変数に設定する。 例えば、システム情報を出力するため、以下の内容をPlaybookに記入する。
|
|
実行結果
|
|
また、モジュールの実行結果など動的な情報を出力するためのPlaybook内容を以下に示す。
|
|
実行結果
|
|
copy
ローカルマシン上のファイルをリモートノードにコピーし、適切なファイルパーミッションを設定する。注意すべきなのは、ファイルをコピーする前に、コピー元とコピー先のファイルのchecksumを比較する。同一の場合はコピーせず、OK状態を返す。異なっている場合のみコピーを実行し、changed状態を返す。
ファイルパーミッション設定
modeパラメータを使ってパーミッションを設定する。設定の方式は数字でも、符号形式”u=rw,g=r,o=r”, ”u+rw,g-wx,o-rwx” でも問題ない。
|
|
リモートノード上ファイルのバックアップ
backupパラメータがyesになっている時に、コピーする前にリモートノード上のファイルのバックアップを取るようになる。もしコピー元&先のファイルが同一であれば、コピー処理が実行されず、バックアップも実行されなくなる。
|
|
コピー後の検証
validate パラメータに検証の為のコマンドを設定する。通常の場合、検証が必要なのはコピー後のファイルなので、%s で指定することができる。copyモジュールにvalidate変数が存在する場合は、コピー処理が正常に終了したことに加えて、validataの命令も正常と返す時のみ、copyモジュールの実行が成功になる。
以下の例では、visudo -cf /etc/sudoers は sudoers ファイルを検証するための命令である。
|
|
template
普通のファイルをコピーする場合は、copyモジュールで充分だが、コピー先ファイルの内容を動的に変更したい場合、templateモジュールを利用する必要がある。
例えば、apacheをインストールした後、テストのためリモートノードにindex.htmlファイルをコピーし、リモートノードのホスト名とIPアドレスを表示させたい時、templateを利用したほうがいい。
Index.html内、変更したい部分を変数として記入する。templateはpythonのj2テンプレートを利用している。j2を理解する必要がないが、変数の書き方は\{\{
\}\}
で囲むことを分かれば問題がない。
templateファイルの構文
Templateなので、可読性のため j2 拡張子をファイルにつける。下記の index.html.j2 ファイルに二つの変数ansible_hostname と ansible_default_ipv4.address が書かれている。
|
|
facts変数を利用するtemplate
index.html.j2で使われている変数ansible_hostnameとansible_default_ipv4.addressはfacts変数であり、ansibleはその内容を調べ、直接Playbookで利用することができるし、templateで利用することもできる。そのため、templateにこの変数を記入した場合は特にパラメータを入力する必要はない。
|
|
一般変数を利用するtemplate
例えば、httpd.conf.j2をリモートノードにコピーした後、デフォルトのhttpポートを設定したい場合、templateの一般変数を利用して実現できる。templateファイル httpd.conf.j2の中での一般変数の利用方法は同じく\{\{\}\}
:
|
|
一般変数はtemplateを読み込む時ではなく、Playbook内のvars キーワードで定義される。もちろんPlaybook内で直接利用できる変数は、template内でも利用できる。inventory内の変数の定義については後章で説明する。
|
|
templateモジュールはcopyモジュールと同じく、ファイルをリモートノードにコピーするだけではなく、パーミッションの設定、バックアップ、検証機能などもできる。
|
|
file
fileモジュールは、リモートノード上のファイル、シンボリック、フォルダの作成、削除、またはパーミションの設定を行う。
ファイルのパーミッションの変更
mode変数には直接数字(頭1文字は 0)でも、パーミッション設定内容でも、パーミッションの追加/削除でも設定することができます。詳細については以下の例で示す。
|
|
シンボリックリンク作成
ここで注意すべきところは、srcとdestパラメータの意味はcopyモジュールと異なり、fileモジュールの操作対象のファイルは全てリモートノード上にある。
|
|
新しいファイル作成
Touchコマンドのように新しいファイルを作成
|
|
新しいフォルダを作成
|
|
user
ユーザモジュールはリモートノードのユーザアカウントを追加/削除/変更することができ、アカウントの属性を設定することもできる。
アカウント追加
ユーザアカウントjohndを追加、uid を 1040に、primary groupをadminに設定する。
|
|
ユーザアカウントjamesを作成し、このアカウントに二つのグループを追加する。
|
|
アカウント削除
ユーザアカウントjohndを削除する。
|
|
アカウントの属性を変更
アカウントjsmithに対し2048-bit のSSH keyを作成し、~jsmith/.ssh/id_rsaに保存する。
|
|
アカウントの無効時刻を追加
|
|
yum
yum モジュールはRed Hat系Linuxのパッケージを管理する。RHEL, CentOS, fedora 21以下のOSをサポートする。fedora 22以上からはdnfを利用するため、dnfモジュールの利用をお勧めする。
パッケージのinstallとremove
最新のパッケージをインストール。もし古いパッケージが存在する場合、最新versionにアップデートする。
|
|
指定したversionのパッケージをinstall
|
|
httpdパッケージをremove
|
|
指定したリポジトリtestingからパッケージをinstall
|
|
パッケージグループをinstall
|
|
ローカルファイルからパッケージをinstall
|
|
URLからパッケージをinstall
|
|
service
リモートノード上のサービスを管理する。一般的によく利用されるサービスは、httpd, sshd, nfs, crondなどがある。
起動/停止/再起動
httpdサービスを起動
|
|
httpdサービスを停止
|
|
httpdサービスを再起動
|
|
httpdサービスをreload
|
|
httpdサービスをブート時自動起動に設定
|
|
ネットワークサービスのポートを起動する
|
|
firewalld
firewalldモジュールは、サービスやポートに対しfirewalldのルールを設定する。実行中のルールと、永久のルールの両方が設定できる。ただし、firewalldモジュールの条件として、リモートノードのfirewalldのversionは0.2.11以上である必要がある。
サービスに対しfirewalldルールを追加
|
|
ポートに対しfirewalldルールを追加
|
|
その他のfirewalldルールの例
|
|
shell
shellモジュールは/bin/shを使ってリモートノードで命令を実行する。 もし命令はyumやcopyモジュールで実現できるなら、shellまたはcommandのような命令モジュールが必要なくなる。 また、shellモジュールは操作後の戻り値やstatusをチェックしていないため、実行する必要がない場合でも、もう一回実行される。
$home, $HOME, “<”, “>”, “|”, “;” と“&”が利用できる。
$home
1 2
- name: test $home shell: echo "Test1" > ~/tmp/test1
&&
1
- shell: service jboss start && chkconfig jboss on
>>
1
- shell: echo foo >> /tmp/testfoo
スクリプト実行
|
|
命令実行前にカレントディレクトリを変更
|
|
命令実行前にカレントディレクトリを変更し、somelog.txtが存在しない時にのみactionを実行する。
|
|
Bashを指定し命令を実行する
|
|
Command
Shellモジュールと似ていて、リモートノードで命令を実行する。しかし、commandモジュールは $HOME または “<“, “>”, “|”, “;” and “&”を利用できない
Shell と似た部分
一つの命令を実行する
1
- command: /sbin/shutdown -t now
命令を実行する前にカレントディレクトリを変更し、databaseファイルがない時に命令を実行
1 2 3 4
- command: /usr/bin/make_database.sh arg1 arg2 args: chdir: somedir/ creates: /path/to/database
Shell と異る部分
パラメータを渡す方法はShellより一つ多い
1
- command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database
&& または >> は利用できない。
下記の書き方で、~/tmp/test3と~/tmp/test4は作成できない。
|
|
Author Wenhan Shi
LastMod 2020-03-26 (02c19e3)