ansibleは複数サーバに対して同じ設定をするときや、構築をリピートするときなんかに最適な最強ツール。
※余談だけど、ansibleは元RedHat社のマイケル・ディハン氏が開発したものらしい。
ansible用サーバ環境要件
| リソース | 要件 | 備考 |
|---|---|---|
| ディストリビューション(OS) | CentOS7.4 | ※CentOS7系だったら大きな変化は無し |
| ホスト名 | ansible_sv | 任意 |
| IPアドレス | 192.168.3.8/24 | 自宅環境なのでクラスCアドレス |
| ゲートウェイ | 192.168.3.1 | 自宅HGW |
| ネームサーバ | 192.168.3.1 | 自宅HGW |
■ansible関連パッケージのインストール
①リポジトリをインストール
標準のリポジトリ設定だとインストールできないため、ansible用のリポジトリをインストールする。
インストールするリポジトリ名は「epel-release」で、yumコマンドでインストールする。
[root@ansible_sv ~]# yum install epel-release : : ================================================================================ Package アーキテクチャー バージョン リポジトリー 容量 ================================================================================ インストール中: epel-release noarch 7-9 extras 14 k トランザクションの要約 ================================================================================ インストール 1 パッケージ 総ダウンロード容量: 14 k インストール容量: 24 k Is this ok [y/d/N]: y Downloading packages: epel-release-7-9.noarch.rpm | 14 kB 00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction インストール中 : epel-release-7-9.noarch 1/1 検証中 : epel-release-7-9.noarch 1/1 インストール: epel-release.noarch 0:7-9 完了しました!
②ansibleをインストール
リポジトリのインストールが終わったら、ansibleをyumコマンドでインストール。
[root@ansible_sv ~]# yum install ansible
:
:
依存性を解決しました
================================================================================
Package アーキテクチャー
バージョン リポジトリー
容量
================================================================================
インストール中:
ansible noarch 2.4.2.0-1.el7 epel 7.6 M
依存性関連でのインストールをします:
PyYAML x86_64 3.10-11.el7 base 153 k
libtomcrypt x86_64 1.17-26.el7 extras 224 k
libtommath x86_64 0.42.0-6.el7 extras 36 k
libyaml x86_64 0.1.4-11.el7_0 base 55 k
python-babel noarch 0.9.6-8.el7 base 1.4 M
python-backports x86_64 1.0-8.el7 base 5.8 k
python-backports-ssl_match_hostname noarch 3.4.0.2-4.el7 base 12 k
python-cffi x86_64 1.6.0-5.el7 base 218 k
python-enum34 noarch 1.0.4-1.el7 base 52 k
python-httplib2 noarch 0.9.2-1.el7 extras 115 k
python-idna noarch 2.4-1.el7 base 94 k
python-ipaddress noarch 1.0.16-2.el7 base 34 k
python-jinja2 noarch 2.7.2-2.el7 base 515 k
python-keyczar noarch 0.71c-2.el7 epel 218 k
python-markupsafe x86_64 0.11-10.el7 base 25 k
python-paramiko noarch 2.1.1-2.el7 extras 267 k
python-ply noarch 3.4-11.el7 base 123 k
python-pycparser noarch 2.14-1.el7 base 104 k
python-setuptools noarch 0.9.8-7.el7 base 397 k
python-six noarch 1.9.0-2.el7 base 29 k
python2-crypto x86_64 2.6.1-15.el7 extras 477 k
python2-cryptography x86_64 1.7.2-1.el7_4.1 updates 502 k
python2-jmespath noarch 0.9.0-3.el7 extras 39 k
python2-pyasn1 noarch 0.1.9-7.el7 base 100 k
sshpass x86_64 1.06-2.el7 extras 21 k
トランザクションの要約
================================================================================
インストール 1 パッケージ (+25 個の依存関係のパッケージ)
総ダウンロード容量: 13 M
インストール容量: 61 M
Is this ok [y/d/N]: y
:
:
Importing GPG key 0x352C64E5:
Userid : "Fedora EPEL (7) <epel@fedoraproject.org>"
Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
Package : epel-release-7-9.noarch (@extras)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
上記の処理を行います。よろしいでしょうか? [y/N]y -> 途中の質問も「y」を入力する
:
:
インストール:
ansible.noarch 0:2.4.2.0-1.el7
:
:
python2-jmespath.noarch 0:0.9.0-3.el7
python2-pyasn1.noarch 0:0.1.9-7.el7
sshpass.x86_64 0:1.06-2.el7
完了しました!
全部「完了しました!」と表示されればOK。
念のため本当にインストールされているか、ansibleコマンドでバージョン確認してみる。
[root@ansible_sv ~]# ansible --version ansible 2.4.2.0 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 = /usr/bin/ansible python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
コマンド実行結果は現時点の最新版が表示される。
■/etc/ansible/ansible.cfgの設定
ansibleインストール直後、/etc/ansibleディレクトリ配下に以下のファイルとディレクトリが作成される。
[root@ansible_sv ~]# ls -lrt /etc/ansible
合計 24
drwxr-xr-x. 2 root root 6 11月 30 07:40 roles
-rw-r--r--. 1 root root 1016 11月 30 07:40 hosts
-rw-r--r--. 1 root root 19155 11月 30 07:40 ansible.cfg
「roles」 ⇒ ansibleのrole機能を使うときに使うディレクトリ。詳細は別途。
「hosts」 ⇒ yml形式で書いたスクリプト(playbookという)をどのホストで行うかを設定するファイル。playbook内で指定するホスト名と、IPアドレスを記述する。
「ansible.cfg」 ⇒ ansibleの実行環境を設定するコンフィグファイル。
ここではまずansible.cfgの内容を設定する。
一応、cfgファイルを編集するときはバックアップも忘れずに。
[root@ansible_sv ~]# cp -p /etc/ansible/ansible.cfg /etc/ansible/ansible.cfg.bk
[root@ansible_sv ~]# vi /etc/ansible/ansible.cfg
:
:
10 [defaults]
11
12 # some basic default values...
13
14 #inventory = /etc/ansible/hosts
15 #library = /usr/share/my_modules/
16 #module_utils = /usr/share/my_module_utils/
17 #remote_tmp = ~/.ansible/tmp
18 #local_tmp = ~/.ansible/tmp
19 #forks = 5
20 #poll_interval = 15
21 #sudo_user = root
22 #ask_sudo_pass = True
23 #ask_pass = True
24 #transport = smart
25 #remote_port = 22
26 #module_lang = C
27 #module_set_locale = False
:
35 #gathering = implicit
:
240 #retry_files_enabled = False
:
ansible.cfgの内容を見るとコメントアウトされた注釈文やパラメータが色々存在するが、まずまず気にしなければいけないのは以下のパラメータ。
inventory = /etc/ansible/hosts
hostsファイルの場所を指定する。
sudo_user = root
hostsで指定したアクセス先で実行するsudoのユーザを指定。一般ユーザでansibleを実行する場合は、実行先のサーバでyum等のroot権限が必要な場合があるのでここはrootにしておいたほうが無難。
ask_sudo_pass = True
hostsで指定したアクセス先でsudoを実行する場合、パスワードを聞かれるようにする。セキュリティ対策としては「True」のほうがいいが、聞かれないようにする場合は「False」と記述する。
ask_pass = True hostsで指定したアクセス先にansible-playbookコマンドでアクセスするときに、パスワードを聞かれるようにする。下のremote_port=22の場合はsshなので、「True」ではsshログイン時のパスワードを聞かれる。聞かれないようにするには「False」と記述する。
remote_port = 22 hostsで指定したアクセス先のlistenポート。sshでアクセスするのが一般的なので、22で。
:
gathering = implicit ansibleを実行した際に、hostsで指定したアクセス先に無事にアクセスできるかどうかを事前に確認するための設定。「implicit」は確認あり、「explicit」は確認なし。コメントアウトしているときは「implicit」と同様となる。必要なければexplicitでも問題ない。
:
retry_files_enabled = False ansibleを実行すると、デフォルトではplaybookと同じディレクトリに~.retryというファイルが生成される。中身を見るとansibleを実行したホストのIPアドレスが記述されるが、なくても特にansible生活には支障ない。必要なければコメントアウトを外して生成されないようにするとよい。
ansibleの特徴の一つとして、ansible.cfgの設定内容が反映される場面というのは、ansible-playbookコマンドやplaybookで指定したモジュール(ansible.cfgと同等の設定を記述した場合)よりも優先順位が低いということ。つまり、コメントアウトしたままでもansible-playbookコマンドのオプションやplaybookの中でも上記コンフィグ内容を指定することができるのだ。なので、ansible.cfg内のあるパラメータをどのくらいの使用頻度でansibleを使うのかとか、自分のスタイルを踏まえてコメントアウトを外すかどうか決めてOKかと。
ちなみに、小生の設定は以下。
[root@ansible_sv ~]# vi /etc/ansible/ansible.cfg
:
:
10 [defaults]
11
12 # some basic default values...
13
14 inventory = /etc/ansible/hosts
15 #library = /usr/share/my_modules/
16 #module_utils = /usr/share/my_module_utils/
17 #remote_tmp = ~/.ansible/tmp
18 #local_tmp = ~/.ansible/tmp
19 #forks = 5
20 #poll_interval = 15
21 #sudo_user = root
22 #ask_sudo_pass = True
23 ask_pass = True
24 #transport = smart
25 #remote_port = 22
26 #module_lang = C
27 #module_set_locale = False
:
35 #gathering = implicit
:
240 retry_files_enabled = False
:
■/etc/ansible/hostsの設定
playbookを実行するホストの情報を記述する。例えばこんな感じ。
[root@ansible_sv ~]# vi /etc/ansible/hosts [ldap_sv] 192.168.3.7
実行するホスト名を[]で囲み、その下にIPアドレスを記述する。ホストを複数指定する場合は、
[ldap_sv] 192.168.3.3 192.168.3.4 192.168.3.5
とか、
[ldap_sv1] 192.168.3.3 [ldap_sv2] 192.168.3.4
という感じで記述する。
※※※注意点※※※
[]のホスト名はplaybook内で指定するホスト名であって、必ずしもhostname等で表示されるホスト名と同一である必要はない。また、ansibleをインストールしたサーバ自体のIPアドレスを指定しても、そのIPアドレスに対してはplaybookは実行されず、スキップしてしまう。自分自身にplaybookを実行させたい場合は、
# ansible-playbook -i 192.168.3.8, <playbook名>
のように、コマンドの-iオプションで自分のIPアドレス(最後のカンマは必須!)を指定してplaybookを実行すると、自分に対してplaybookを実行してくれる。-iオプションは結構便利で、hostsに何も記述していなくても、-iオプションでansibleを実行したいホストのIPアドレスを指定してやれば、どのサーバに対しても実行してくれる。
まずは、インストールと各ファイルの設定はこれで完了!