インフラ

[Ansible入門 後編] Dockerを使ったハンズオン

ansible入門 後編

前回に続き、Ansible入門です。

今回は、Docker環境でAnsibleを試してみます。

ちゃりお
ちゃりお
Ansibleのハンズオンです。

Contents

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です。

controller target

ハンズオン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:8080apache

解説

順を追って説明します。
「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

かなり迷惑ですがこのslコマンドをlsコマンドのエイリアスにします。
lsと打ったらslが流れます。

以下の手順が必要です。

  1. epelリポジトリのインストール
  2. slのインストール
  3. .bashrcにlsのエイリアスとして、slを設定
  4. .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/

現役インフラエンジニアが選ぶUdemyインフラ系のおすすめコース3選動画学習プラットフォームUdemyのインフラ系おすすめコースを厳選しました。どのコースも基礎から学べるので、インフラ経験が浅い人にもおすすめです。...

Amazonで「Ansible」の本をみてみる!!