前回に続き、Ansible入門です。
今回は、Docker環境でAnsibleを試してみます。
Ansibleの概要について
前回の記事でまとめました。
https://chariosan.com/2019/09/15/ansible_start_docker_handson/
ハンズオン
実際に、Ansibleを触ってみましょう。
ハンズオンでは、下記2つを行います。
- httpdのインストール
- slをインストールしてlsのエイリアスにする
1つ目のハンズオンでは、Ansibleのシンプルさを、2つ目では少し複雑なことも簡単にできることを体感してほしいです。
Vagrant使う例がよくありますが、より環境構築が簡単なDockerを使う方法を紹介します。
※こちらのハンズオン実施に、Dockerのインストールが必要です。
Mac Dockerインストール
Windows Dockerインストール
Ansibe実行環境構築
任意のディレクトリに、git cloneしてください。
$git clone https://github.com/msato0731/ansible-docker
git cloneしたディレクトリに移動して、下記コマンドでコンテナを起動します。
$docker-compose up -d
controllerとtargetというコンテナが立ち上がります。
controllerはansibleを実行するコンテナで、targetは管理対象のコンテナです。
OSはamazonlinux2です。
ハンズオン1 AnsibleでApacheをインストールする
controllerに入って、Ansibleを実行します。
ansibleディレクトリは、controllerの/ansibleにアタッチされています。
$docker-compose exec controller /bin/bash
(ここから先はcontrollerコンテナにて)
$cd /ansible
$ansible-playbook -i inventory/local httpd.yml
TASK [httpd : yum install httpd] *******************************************************
changed: [target]
TASK [httpd : httpd enable] ************************************************************
changed: [target]
PLAY RECAP *****************************************************************************
target : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
出力結果が「OK=3」になっていたら成功です。
http://localhost:8080解説
順を追って説明します。
「ansible-playbook」というコマンドを使って、処理を実行できます。
まず、「-i inventory/local」の部分です。
ここではインベントリファイルを指定しています。
これは制御したいホストの一覧です。
inventory/local
[webserver]
target
今回は、webserveグループにtargetというホストを追加しています。
targetはコンテナです。controllerから「ssh target」で接続可能です。
httpd.ymlには「処理内容」が書かれています。
httpd.yml
---
- hosts: webserver
become: yes
tasks:
- name: yum install httpd
yum:
name: httpd
state: latest
- name: httpd enable
systemd:
name: httpd
state: started
enabled: yes
今回は、webserverグループ(つまりtarget)にhttpdインストールの処理を行うと定義しています。
tasks内の処理では、ansibleが事前に用意しているモジュールを使用しています。
今回は、yumモジュールとsystemdモジュールを使用しています。
モジュールはansibleで利用されるスクリプトで、実行対象に各種設定をすることができます。
例えば、パッケージをインストールしたり、ファイルを書き換えたり、ディレクトリを作ったり。
モジュールについては、公式サイトから確認できます。
Ansible module index
1つ目の、「yum install httpd」でhttpdをインストールして、2つ目の「httpd enable」でhttpdをスタートして自動起動を有効化しました。
コマンドで書くとこんな感じです。
yum install httpd
systemctl start httpd
systemctl enable httpd
ハンズオン2 slコマンドをインストールして、lsのエイリアスにする
slコマンドは、実行すると機関車がコマンドライン上に走りるジョークコマンドです。
かなり迷惑ですがこのslコマンドをlsコマンドのエイリアスにします。
lsと打ったらslが流れます。
以下の手順が必要です。
- epelリポジトリのインストール
- slのインストール
- .bashrcにlsのエイリアスとして、slを設定
- .bashrcを再読み込み
早速やっていきましょう。
$docker-compose exec controller /bin/bash
(ここから先はcontrolerコンテナにて)
$cd /ansible
$ ansible-playbook -i inventory/local site.yml
PLAY [all] *****************************************************************************
TASK [Gathering Facts] *****************************************************************
changed: [target]
TASK [sl : yum install epel] ***********************************************************
changed: [target]
TASK [sl : yum install sl] *************************************************************
changed: [target]
TASK [sl : send .bashrc] ***************************************************************
changed: [target]
PLAY RECAP *****************************************************************************
target : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
解説
インベントリは、httpdのときと同様です。
site.ymlというplaybookを使用しました。
site.yml
---
- hosts: all
become: yes
roles:
- sl
site.ymlではsl roleを読み込んでます。
実際の処理内容は、roles/sl/tasks/main.ymlにあります。
これは、Ansibleのディレクトリ構成のベストプラクティスに従っています。
roles/sl/tasks/main.yml
- name: yum install epel
yum:
name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
state: latest
tags: sl
- name: yum install sl
yum:
name: sl
state: latest
enablerepo: epel
tags: sl
- name: send .bashrc
copy:
src: .bashrc
dest: /home/ec2-user/.bashrc
mode: '0644'
owner: ec2-user
group: ec2-user
backup: yes
notify: reflect .bashrc
yumモジュールで、epelとslをインストール後
.bashrcをec2-userのホームディレクトリにコピーして、再読み込みしています。
コピーした.bashrcはroles/sl/files/.bashrcです。
再読み込みは、.bashrcが変更されたときのみにしたいのでhandlerという仕組みを使っています。
handlerはタスクがchangedになったときだけ、実行されます。
トリガーにする側で、notifyを記述するとhandlerを使えます。
これで、.bashrcが変更されたときのみ.bashrcの再読み込みが実行されます。
handlerは、roles/sl/handlers/main.ymlにあります。
roles/sl/handlers/main.yml
---
- name: reflect .bashrc
shell: source /home/ec2-user/.bashrc
まとめ
今回は、Ansibleの入門ハンズオンでhttpdのインストールとslのインストール・エイリアス設定をやりました。
シンプルな設定だけではなく、少し複雑なことも簡単に設定することができます。
実行対象が1台なので、自動化の威力があまり感じられないかもしれませんがこれが100台、200台でも同じようにできるのがAnsibleのすごいところだと思います。
https://chariosan.com/2019/09/15/ansible_start_docker_handson/