blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2020.05.07 DeNAインフラノウハウ発信プロジェクト

Ansible で始める Linux 管理

by manabu.a.sato

#infrastructure #production-costs-optimization #technical-verification #IaC #infra-quality #infra-delivery

はじめに

はじめまして。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 に触れていただけると幸いです。

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。