対象者
- 今回の記事は下記ような人を対象としています。
- ansibleが何なのか、どういったものなのかをある程度理解をしている
- 誰かが構築したansibleを触ったことがある
- 自身では、まだansibleを構築したことない人
自分もまだ触り始めて半年も経ってない(というか自分で環境構築とか始めたのはつい1ヶ月くらい前くらいからです...)
ので、ベストプラクティスとかよくわかっていなかったり、誤った情報を書いてしまっているかもしれないので、何かあればご指摘の程宜しくお願い致します
ハンズオン開始
環境情報
種類 | バージョン |
---|---|
OS | centos6.7 |
ansible | 2.3.1.0 |
python | 2.6.6 |
CentOS環境構築
Ansible環境
- 今回はvagrantを使用して、CentOS環境を構築します。
-
Vagrant boxの確認
$ vagrant box list
- 上記コマンドを実行してCentos6.5のvagrant boxが無ければ手順の2番へ、Centos6.7のvagrant boxが既にある方は2番を飛ばして下さい。
- ※コマンドを実行して出てくるvagrant boxの名前はvagrant boxを追加するときに任意に設定するものなので必ずしもCentos6.7という名前とは限りません
- 上記コマンドを実行してCentos6.5のvagrant boxが無ければ手順の2番へ、Centos6.7のvagrant boxが既にある方は2番を飛ばして下さい。
-
Centos6.7のvagrant boxを追加する
$ vagrant box add centos6.7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
- ※
vagrant box add
の後に任意のboxの名前を付けている
- ※
-
Vagrant初期化
$ vagrant init centos6.7
-
Vagrantfile修正
-
vagrant init
するとVagrantfileが実行したディレクトリに生成されるので下記のように修正する
Vagrantfile -
Create a private network, which allows host-only access to the machine
using a specific IP.
- config.vm.network "private_network", ip: "192.168.33.10"
-
Vagrant起動&ログイン
$ vagrant up $ vagrant ssh
Ansible実行対象
- 実際の運用に近づけるために、今回はAnsibleの実行対象用のvagrantの環境も作る
-
Vagrant初期化
$ vagrant init centos6.7
-
Vagrantfile修正
-
vagrant init
するとVagrantfileが実行したディレクトリに生成されるので下記のように修正する
Vagrantfile -
Create a private network, which allows host-only access to the machine
using a specific IP.
- config.vm.network "private_network", ip: "192.168.33.11"
-
Vagrant起動&ログイン
$ vagrant up $ vagrant ssh
Ansibleインストール
-
EPELリポジトリの追加
$ sudo -y yum install epel-release
-
Ansibleインストール
$ sudo yum -y install ansible
-
Ansible実行対象のvagrant環境にAnsibleの公開鍵を登録する
- Ansibleサーバから対象のvagrant環境にSSHでノンパスでログインできるようにするため、公開鍵を送る
- 対象サーバは
192.168.33.11
- 対象サーバは
$ ssh-keygen -t rsa $ ssh-copy-id vagrant@192.168.33.11
- Ansibleサーバから対象のvagrant環境にSSHでノンパスでログインできるようにするため、公開鍵を送る
-
接続確認
- 下記コマンドを実行してパスワードを聞かれることなくログインできたらOK
$ ssh vagrant@192.168.33.11
inventoryファイル作成
- 対象のサーバを記述するファイル
-
ansibleルートディレクトリー及び、iventoryディレクトリを作成する
$ mkdir ansible ; cd $_ $ mkdir inventory ; cd $_
-
対象サーバのIPアドレスをhostsファイルに記載する
- inventoryディレクトリ配下にhostsファイルを作成し対象サーバのIPを記載する
- ※今回は
192.1683.33.11
- ※今回は
ansible/inventory/hosts[target] 192.168.33.11
- 上記の
[target]
はtarget
というグループに192.168.33.11
というホストを属させている。
- inventoryディレクトリ配下にhostsファイルを作成し対象サーバのIPを記載する
-
疎通確認
- ansibleのルートディレクトリに移動して、ansibleコマンドを実行する
$ cd ~/ansible $ ansible all -i hosts -m ping 192.168.33.11 | SUCCESS => { "changed": false, "ping": "pong" }
-
-i {inventoryファイル名}
でinventoryファイルを指定している - all を指定した場合、-i で指定したhostsに記載されているホスト全部が対象となる
-
-m {モジュール名}
でモジュールを指定している
Playbookを作成
- 大きく分けて、playbookには3つの事を定義する
- target
- どこに・誰が実行するか
- vars
- 変数を指定する(taskで使用する)
- ※実際はplaybookではなく変数用のディレクトリ・ファイルを作成して、共通化することがほとんど(所感)
- 変数を指定する(taskで使用する)
- task
- どんなことをするかモジュール使って記述する
- target
-
変数を定義
- group_vars/targets.ymlというファイルを作成する
$ mkdir group_vars ; cd $_ $ vi targets.yml
- 下記を記載
ansible/group_vars/targets.ymlmessage: "Hello Ansible!" tokyo: edogawa: population: 68,2400 katsushika: population: 44,4400
- ※内容については特に意味はないです
-
playbookの定義
- 今回はdebugモジュールを使用してmsgに格納した文字列を対象サーバで出力するタスク
ansible/test.yml- hosts: target user: vagrant tasks: - name: output message. debug: msg="{{ message }}" - name: output population downtown debug: msg="I was born {{ item.key }}, with a population {{ item.value.population }} people" with_dict: "{{ tokyo }}"
Playbook実行
-
ansibleのルートディレクトリでansibleを実行する
-
ansible-playbook -i inventory/hosts test.yml
-
-i {inventoryファイル名}
で対象のホストを指定 - test.ymlは実行するplaybookを指定している。
- playbookの中で対象のホストをtargetというグループを指定しているので、おのずと変数もtarget.ymlを読み込むようになっている
※Ansibleでは決まったディレクトリなどから情報を暗黙的に取得するため、依存関係を理解しておく必要がある。
-
$ cd ~/ansible $ ansible-playbook -i inventory/hosts test.yml PLAY [target] *********************************************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************************************** ok: [192.168.33.11] TASK [output message.] ************************************************************************************************************************************************************** ok: [192.168.33.11] => { "msg": "Hello Ansible !" } TASK [output population downtown] *************************************************************************************************************************************************** ok: [192.168.33.11] => (item={'key': u'edogawa', 'value': {u'population': 68,2400}}) => { "item": { "key": "edogawa", "value": { "population": 68,2400 } }, "msg": "I was born edogawa, with a population 68,2400 people" } ok: [192.168.33.11] => (item={'key': u'katsushika', 'value': {u'population': 44,4400}}) => { "item": { "key": "katsushika", "value": { "population": 44,4400 } }, "msg": "I was born katsushika, with a population 44,4400 people" } PLAY RECAP ************************************************************************************************************************************************************************** 192.168.33.11 : ok=3 changed=0 unreachable=0 failed=0
-
ちょっと解説
output message.
というtaskではdebugモジュールを使って、変数message
を出力しているだけですが、ディクショナリ形式で書いたtokyo
の使い方ですが、このタスクはtokyo
変数の値をwith_dict
で要素の数だけループして取り出しながらdebugモジュールでメッセージを出力していきます。
ループ毎に取り出された要素はitem
という定義済み変数に格納され、処理中に使うことができます。
↓こんな感じに要素が格納されている
(
item={
'key': u'edogawa',
'value': {
u'population': 68,2400
}
}
)
このときtokyo
直下にある都市名はitem.key
で取得でき、都市名の下に持たせている人口数はitem.value.population
で取得されます。
今回だとループ毎にそれぞれ下記のような値が取得できる
- 一回目のループでは
item.key == "edogawa"
、item.value.population == 68,2400
- 二回目のループでは
item.key == "katsushika"
、item.value.population == 44,4400
終わりに
- 超初歩的なハンズオンだが、少なくても変数を使わなければ2ファイルで実装できてしまう.....!!
.
├── group_vars
│ └── target.yml
├── inventory
│ └── hosts
└── test.yml
今回はただ、対象サーバで文字列を出力するだけのタスクになってしまいましたが、実際はyumやshell等のモジュールで色んなもののインストールとかをtaskに落とし込んで、コマンド1つで全部やってくれるのでとても楽です。
是非、他のモジュールを見てローカル環境で試してみてください!
あと、ちょっと近いうちに実践に近いものを書く予定です
roleとかtagsとか..暗号・復号化とか...