シリーズ学習ものを始めます。
Ansible
Ansible(アンシブル)は、レッドハットが開発するオープンソースの構成管理ツールである。サーバを立ち上げる際、あらかじめ用意した設定ファイルに従って、ソフトウェアのインストールや設定を自動的に実行する事が出来る。特に大規模なコンピュータ・クラスターを構築する時に、時間の短縮やミスの削減に有用である。構成管理に加え、オーケストレーションやソフトウェアデプロイメントの機能を持つ。
引用元:Ansible (ソフトウェア) - Wikipedia
Ansibleはインフラの構成をコード管理するツールの一つです。
その特徴から、Infrastructure as Code(IaC)を実現するためのツールの一つとしても使用されます。
私は使用したことがありませんが、同種のツールにはChefやPuppetなどがありますがそれらと比較した場合には以下のような特徴が挙げられるようです。
■エージェントレス
Ansibleでは、管理を行うためのサーバにAnsibleをインストールする必要がありますが、管理対象となるサーバに対してはエージェントなどを導入する必要はありません。
■YAMLによる記述
Ansibleでは、インフラの定義をPlaybookと呼ばれるもので行いますが、これの記述形式はYAMLがとられています。dockerなどにも使用されている学習コストが低い形式であると言われています。
■多様なプラットフォーム
管理対象はLinuxサーバだけではなく、ネットワーク製品やWindowsOSにも対応しているため、環境の違いを意識することなく管理を行えることは利点の一つです。
以降、Ansibleをインストールしたサーバ(マシン)のことをコントロールノードと呼び、構成管理対象となるサーバのことをターゲットノードと呼ぶこととします。
Ansibleの構成要素
ここではAnsibleの構成要素を概要として抑えておきます。
Playbook
Playbookは簡単に言うと処理の命令書になります。
記述した内容に従って、ターゲットノードに対して処理や変更を行います。
PlaybookはYAML形式で記述され、以下の部分になります。
YAMLは一般的に学習コストが低い記述方法と呼ばれています。
軽く見た感じだと可読性は高そうな雰囲気はしますね。書けるようになるにはある程度習熟は必要そうですが..
・test.yml
---
- hosts: test-machine
tasks:
- name: test-playbook
file:
path: /tmp/hoge.txt
state: touch
Ansibleを軽く使う程度だった場合にこそ特にPlaybookの記述方法は中心的に学ぶべき重要な内容となるためPlaybookの記述方法については別途記事化します。
Inventory
InventoryはPlaybookの反映先を記述するファイルになります。
そのため、記述内容は対象となるターゲットノードのホスト名かIPアドレスを列挙する形になります。
なおホスト名で記述する場合にはもちろんDNSやhostsファイルで名前解決ができる必要があります。
・Inventoryファイルの記述例
web-server1 web-server2 db-server1
192.168.1.1 192.168.1.2 192.168.1.11
Inventoryはあくまで、ターゲットノードを指定するだけなのでplaybookに比べれば記述方法として覚えるべきことは少なそうですが、いろいろ試してみたいのでこちらも別途記事化します。
Module
Playbookの記述から実際の処理を実行するのがModuleの役目です。
ユーザ(開発者)が実際に触れるのはPlaybookでの記述になります。
ユーザとしてはModuleに関してはPlaybookの記述内に盛り込まれているため、Playbookの記述方法として押さえることもできるかもしれません。
Moduleは用途に応じていくつもの種類があるので、いきなり全部覚えるのは現実的ではないと思います。よく使用する基本的なモジュールの使用方法だけ抑え、あとはドキュメントなどを参照しながら進めていく方向でいいのではないかと思います。
以下にFileモジュールの例を示します。
file:
path: /tmp/hoge.txt
state: touch
モジュールのドキュメントは以下などにあります。
Ansibleの動作環境
ここではAnsibleのバージョンや動作環境について確認します。
コントロールノードのインストール要件は公式サイトより確認すると以下のようになっていました。
現在、Ansible は、Python 2 (バージョン 2.7) または Python 3 (バージョン 3.5 以降) がインストールされていればどのマシンからでも実行できます。 これには、Red Hat、Debian、CentOS、MacOS をはじめ、各種 BSD が含まれます。 Windows では、コントロールノードのサポートはありません
引用元:Ansible のインストール — Ansible Documentation
Python2.6以降が必要になるようです。
最近のLinuxOSであれば、基本的には最初から備わっていると思われますが、必要であればインストールする感じになるでしょう。
Ansibleのインストール
本記事では、CentOS7を管理ノードとしてインストールや以降の作業を行っていく。
参考元:Ansible2.8をCentOS7にインストールする - Qiita
CentOS7へのインストール
・pythonバージョン確認
AnsibleをインストールするにはPython2.6以降が必要なのでpythonのバージョンを確認しておきます。
[root@server1 etc]# python --version Python 2.7.5
・EPELリポジトリのインストール
AnsibleをインストールするためにはEPELリポジトリが必要になるようなので、必要に応じてインストールする。
こちらは標準ではインストールされていない場合が多そう。
[root@server1 etc]# yum install epel-release
・Ansibleのインストール
続いてAnsibleをインストールする。
[root@server1 etc]# yum install ansible
なお、インストール中に以下の警告が発生した。
warning: /var/cache/yum/x86_64/7/epel/packages/python2-httplib2-0.18.1-3.el7.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 352c64e5: NOKEY python2-httplib2-0.18.1-3.el7.noarch.rpm の公開鍵がインストールされていません
そのままインストールも続行できそうな感じだったが、yumのキャッシュをクリーンアップしてから再度インストールすることで警告は表示されなくなったので参考までに。
[root@server1 etc]# yum clean all 読み込んだプラグイン:fastestmirror リポジトリーを清掃しています: base docker-ce-stable epel extras ...: mysql-connectors-community mysql-tools-community mysql57-community ...: updates Cleaning up list of fastest mirrors
・バージョン確認
以下の通り、本ブログではansible 2.9.21
を使用していきます。
[root@server1 etc]# ansible --version ansible 2.9.21 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /bin/ansible python version = 2.7.5 (default, Apr 2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] [root@server1 etc]#
動作確認
詳しいことは次回以降確認していきますが、ここではインストール自体は確認できたので、本環境で正常に動作させることができるのか動作確認だけやっておきます。
Ansibleとしては別のノードに実行してこそですが、ここでは確認のためホスト自身に実行することとします。
別のノードが用意できる場合には別のノードに対して実行してもよいと思います。
面倒な場合は以下だけでも動作確認にはなっているのかな?
[ansusr@ctl-node task]$ ansible -m ping localhost localhost | SUCCESS => { "changed": false, "ping": "pong" } [ansusr@ctl-node task]$
準備
Ansibleではコントロールノードからターゲットノードにはsshでパスワードなしで接続しておく必要があります。
今回の場合はlocalhost自身にパスワードなしで接続できるようにしました。
パスワードなしで接続できるようにする方法は以下などを参照ください。
またfirewallやSELinuxも無効にしておいた方が不要なエラーなどが発生せずよさそうです。
ディレクトリ構成
ここでは以下のようなディレクトリ構成を用意しました。
軽く作成するだけであれば任意の場所に作成して問題なさそうです。
/home/ansusr/ansible/task/test-task
|-- hosts
`-- test-bool.yml
Inventoryファイル
ここでのhosts
ファイルはいわゆるInventoryのことで、ターゲットノードに関する情報を記述します。
今回は確認さえできればいいので以下のように記述します。
・hosts 設定例
test-machine ansible_host=127.0.0.1
Playbook
前述の通りここでは動作確認だけなので、意味が分からない部分があってもとりあえずで記述します。
記述方法などは今後確認していきます。
・test-bool.yml 設定例
以下では自身に接続し、/tmp
ディレクトリにファイルを作成します。
なので、ファイルが作成されていればとりあえずOKでしょう。
---
- hosts: test-machine
tasks:
- name: test-playbook
file:
path: /tmp/hoge.txt
state: touch
Playbookの実行
Playbookの実行は以下のようなコマンドで行います。
-i hosts
はターゲットノードを選択するときにhosts
(inventory)を参照するということ。
ansible-playbook -i hosts test-bool.yml
・実行の様子
[ansusr@ctl-node test-task]$ ansible-playbook -i hosts test-bool.yml PLAY [test-machine] ************************************************************ TASK [Gathering Facts] ********************************************************* ok: [test-machine] TASK [test-playbook] *********************************************************** changed: [test-machine] PLAY RECAP ********************************************************************* test-machine : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [ansusr@ctl-node test-task]$
確認する。
[ansusr@ctl-node test-task]$ ll /tmp/hoge.txt -rw-rw-r--. 1 ansusr ansusr 0 6月 6 19:06 /tmp/hoge.txt
ファイルが作成されているので問題なく動作していると言えそうです。
インストール確認はできたので次回以降は実際の内容を確認していきたいと思います。
・参考書籍
本書の大きな流れを参考にしていますが、発行が多少古いのとレビューを見た感じだと誤植が存在するとのことだったので細かい部分は他ブログ等を参照しています。