はじめに
はじめまして。IT 基盤部の佐藤です。
社内システムのインフラを担当しています。
今回は、DeNA のインフラを構築する際に使用されている Ansible について紹介いたします。
Ansible とは
Ansible とは、構成管理ツールです。Python 製のオープンソースソフトウェアで、レッドハット社が中心となり開発を進めています。Ansible 以外の構成管理ツールには、Chef や Puppet などが挙げられます。
Ansible にはシンプル、パワフル、エージェントレスというコンセプトがあります。Ansible のコンセプトを知ることで、他の構成管理ツールと比較して、優れている点を理解することができます。まずは、Ansible のコンセプトについて紹介いたします。
Ansible のコンセプトを紹介した後に、Ansible を実際に動作させて、実行結果と簡単な解説をいたします。
Ansible のコンセプト
シンプル
インフラを構築するために、構成管理ツールに処理を定義する必要があります。その定義を行うために、Ansible では YAML が採用されています。YAML を採用することにより、読み書きが容易で可読性の高い構成管理を行うことができます。
下記が YAML で構成管理の内容を定義した内容となります。
yum で httpd の最新版をインストールします。
---
- name: install
yum:
name: httpd
state: latest
パワフル
パワフルとは、マルチレイヤの構成管理を行い、冪等性を担保していることを指します。
マルチレイヤの構成管理を実現するために、用途に合わせてモジュールを使用します。
下記にモジュールの一例を記載します。
- OS: Red Hat Enterprise Linux , Ubuntu , Windows Server
- Cloud: AWS , GCP , Azure
- Network: A10 , F5 , IOS
- Storage: EMC , NetApp , Pure Storage
- Database: PostgreSQL , MySQL
- Monitoring: Zabbix
様々なモジュールが用意されていることが分かります。Ansible で構成管理を行う場合、モジュールの一覧から該当するモジュールが用意されている確認して使用してください。
参考: Ansible のモジュール一覧
冪等性とは
冪等性とは、Ansible の操作を複数回行っても、結果が変わらないことを指します。Ansible で冪等性が、どのように表現されているか確認してみましょう。
---
- name: install
yum:
name: httpd
state: latest
1回目の実行結果
TASK [install] ***********************
changed: [server1]
2回目の実行結果
TASK [install] ***********************
ok: [server1]
1回目の実行時には、httpd のインストールを行ったことを示す changed が表示されています。2回目の実行時には、httpd が既にインストールされているため、インストールが不要であるため ok が返却されました。この例では、httpd がインストール済みか Ansible が判断することにより冪等性を担保しています。
エージェントレス
Ansible では、構成管理の対象にエージェントをインストールする必要がありません。無論、エージェントの管理も不要となります。
今までの構成管理ツールでは、エージェントを必要とすることが多いです。そのため、構成管理の対象にエージェントをインストールする必要がありました。エージェントが必要となる場合、特に稼働済みの対象に対して、エージェントのインストールが困難であるため、構成管理の導入に対する障壁となっていました。
Ansible の実行例
実際に Ansible で構成管理を実施するために、必要となる作業と実行結果を紹介いたします。
前提条件
- Ansible 2.9.7 がインストールされていること
- 構成管理の対象となる OS は Red Hat Enterprise Linux 8
- Ansible を実行するサーバから構成管理の対象に、公開鍵認証で SSH 接続できていること
用意するファイル
下記のファイルを用意して、Ansible を実行します。
- hosts: 構成管理の対象を記載する
- IP アドレスは 192.168.1.1
- Ansible の実行結果に表示するホスト名は server1
- playbook.yml: 構成管理の処理を記載する
- インストール済みのパッケージを最新化する
- SELinux を無効化する
- SELinux を無効化して、OS の再起動が必要な場合、OS を再起動する
hosts
[rhel8]
server1 ansible_ssh_host=192.168.1.1
playbook.yml
---
- name: Red Hat Enterprise Linux 8 - Base Setting
hosts: rhel8
gather_facts: true
become: true
tasks:
- name: Yum latest update
yum:
name: '*'
state: latest
- name: Disable SELinux
selinux:
state: disabled
register: result
- name: Reboot
reboot:
when: result.reboot_required
動作確認
1回目の実行結果
$ ansible-playbook -i hosts playbook.yml
PLAY [Red Hat Enterprise Linux 8 - Base Setting] **************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************
ok: [server1]
TASK [Yum latest update] **************************************************************************************************************
ok: [server1]
TASK [Disable SELinux] ****************************************************************************************************************
[WARNING]: SELinux state temporarily changed from 'enforcing' to 'permissive'. State change will take effect next reboot.
changed: [server1]
TASK [Reboot] *************************************************************************************************************************
changed: [server1]
PLAY RECAP ****************************************************************************************************************************
server1 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2回目の実行結果
$ ansible-playbook -i hosts playbook.yml
PLAY [Red Hat Enterprise Linux 8 - Base Setting] **************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************
ok: [server1]
TASK [Yum latest update] **************************************************************************************************************
ok: [server1]
TASK [Disable SELinux] ****************************************************************************************************************
ok: [server1]
TASK [Reboot] *************************************************************************************************************************
skipping: [server1]
PLAY RECAP ****************************************************************************************************************************
server1 : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
TASK [Reboot] の内容に注目してください。1回目の実行結果では、SELinux を無効化したことにより、OS の再起動が実施されています。2回目の実行結果では、既に SELinux が無効化されているため、OS の再起動がスキップされています。このように、不要な作業を実施しないようにすることができるため、構成管理が容易になるだけでなく、作業時間の短縮にもつながります。
まとめ
今回は、構成管理ツールの Ansible について、基本的な特徴と簡単なサンプルを紹介いたしました。この機会に Ansible に触れていただけると幸いです。
最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。