SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Ansible】入門① Ansibleの概要と導入(CentOS7)

シリーズ学習ものを始めます。

Ansible

Ansible(アンシブル)は、レッドハットが開発するオープンソースの構成管理ツールである。サーバを立ち上げる際、あらかじめ用意した設定ファイルに従って、ソフトウェアのインストールや設定を自動的に実行する事が出来る。特に大規模なコンピュータ・クラスターを構築する時に、時間の短縮やミスの削減に有用である。構成管理に加え、オーケストレーションやソフトウェアデプロイメントの機能を持つ。

引用元:Ansible (ソフトウェア) - Wikipedia

Ansibleはインフラの構成をコード管理するツールの一つです。
その特徴から、Infrastructure as CodeIaC)を実現するためのツールの一つとしても使用されます。

私は使用したことがありませんが、同種のツールにはChefPuppetなどがありますがそれらと比較した場合には以下のような特徴が挙げられるようです。

■エージェントレス
Ansibleでは、管理を行うためのサーバにAnsibleをインストールする必要がありますが、管理対象となるサーバに対してはエージェントなどを導入する必要はありません。

■YAMLによる記述
Ansibleでは、インフラの定義をPlaybookと呼ばれるもので行いますが、これの記述形式はYAMLがとられています。dockerなどにも使用されている学習コストが低い形式であると言われています。

■多様なプラットフォーム
管理対象はLinuxサーバだけではなく、ネットワーク製品やWindowsOSにも対応しているため、環境の違いを意識することなく管理を行えることは利点の一つです。

f:id:wantanBlog:20210606205017p:plain

以降、Ansibleをインストールしたサーバ(マシン)のことをコントロールノードと呼び、構成管理対象となるサーバのことをターゲットノードと呼ぶこととします。

Ansibleの構成要素

ここではAnsibleの構成要素を概要として抑えておきます。

Playbook

Playbookは簡単に言うと処理の命令書になります。
記述した内容に従って、ターゲットノードに対して処理や変更を行います。

PlaybookYAML形式で記述され、以下の部分になります。
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

モジュールのドキュメントは以下などにあります。

Files modules — Ansible Documentation

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自身にパスワードなしで接続できるようにしました。
パスワードなしで接続できるようにする方法は以下などを参照ください。

www.wantanblog.com

また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  66 19:06 /tmp/hoge.txt

ファイルが作成されているので問題なく動作していると言えそうです。

インストール確認はできたので次回以降は実際の内容を確認していきたいと思います。

・参考書籍
本書の大きな流れを参考にしていますが、発行が多少古いのとレビューを見た感じだと誤植が存在するとのことだったので細かい部分は他ブログ等を参照しています。