🏸

Ansibleの基本① - Ansibleの概要

2021/03/27に公開

はじめに

仕事でAnsibleを使っていくことになり、基礎中の基礎的なことを個人的メモ。
最終的にはAnsibeでコンテナ上にサーバーを立ち上げ、アプリケーションをインストールするところまでやれたら良いなと考えてます。

この記事は概要を書いているだけなので、色々な記事を切り抜き、まとめたものになってます。

Ansibleとは

構成管理ツールの一つで、いわゆるInfrastructure as Code(IaC)を実現していくものになります。RedHat社が中心となって開発しているOSSです。
https://github.com/ansible/ansible

Ansibleのコンセプト[1][2][3]

Ansibleは、SimplePowerfulAgentlessという3つのコンセプトを掲げています。

特徴 概要
Simple 構成管理していく内容は、YAMLファイル(Playbook)で書いていきます。YAML形式を採用することで可読性の高いシンプルな記述になります。
Powerful Modulesと呼ばれる様々な機器を操作するためのライブラリを使用することができます。OSやDBの種類ごとに合わせて、適切なモジュールを使うことで、マルチレイヤでの構成管理ができます。
Agentless 構築対象となるサーバ、機器に対してAgentをインストールする必要がないため、余計な管理負荷、セキュリティリスクを負わなくて済みます。

Ansibleの構成

Ansibleは主にAnsible本体とPlaybookModulesInventoryで構成されています。

簡単に説明するとPlaybookに書かれた操作手順(Moduleという操作単位で書かれる)を基に、Inventoryに書かれる構成管理対象へ、Ansible Engineが実行するような構成になります。

Playbook[4]

YAML形式で書かれる構成管理対象への操作手順を記述したファイルで、いわゆる手順書となるものです。Playbookへコードを書いていくことになります。

  • Playbookの例
---
- hosts: webservers
  remote_user: root

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- hosts: databases
  remote_user: root

  tasks:
  - name: ensure postgresql is at the latest version
    yum:
      name: postgresql
      state: latest
  - name: ensure that postgresql is started
    service:
      name: postgresql
      state: started

Modules

Playbookで書かれる操作をライブラリとしてまとめたもの。
上記Playbookの例だと、tasks配下のyumtemplateserviceがModuleになります。

Inventory

構成管理対象のホストやグループを管理するファイル。hostsファイルみたいなもの。

  • Inventoryの例
[webservers]
apache1.example.com
apache2.example.com

[databases]
postgres[1:2].db.com

Terraformとの違い[5]

IaCで調べたら大体ヒットするであろうTerraformとの違いについて書いていきます。
IaCは、大きく手続き型宣言型の2種類の記法に分けることができます。これはアプリケーションコードでも手続き型(COBOLなど)、オブジェクト指向型(Javaなど)、関数型(Cなど)と記法ごとに分けられているのと同じです。

手続き型

インフラを構築していく手順を記述していく記法になります。

  • メリット
    • 手順をそのままコードに書き下していくような形になるため、最初の障壁が低い
    • コードも従来アプリケーション開発で用いられてきた汎用のプログラミング言語であることも多く、自由度が高い
  • デメリット
    • 手順の積み重ねでコードを書くので、全体としての意図の見えにくくなる
    • 大きな変更に弱い
  • 代表例
    • Ansible

宣言型

インフラを構成するリソースの状態を記述していく記法です。現在の状態から宣言された状態への差分を自動的に埋めるように処理が行われます。

  • メリット
    • 最終的にリソースがあるべき状態を記述するため、全体としての意図が見えやすくなる
  • デメリット
    • 抽象的なコードになるため、最初の障壁が高い
    • 汎用プログラミング言語ではないため、自由度が低い
  • 代表例
    • Terraform

AnsibleとTerraformの使い分け

Ansibleは手順を自動化し、Terraformは状態管理を自動化します。よって、Terraformをインフラの構築全般に使い、Ansibleはサーバ単体の構築に向いています。

IaC 使い分け
Ansible サーバ単体の構築
Terraform インフラの構築全般

サーバ単体の構築は大抵の場合、リソース間の相互作用がそのサーバ単体の中で閉じられているため、全体像がそれほど複雑になりません。また、サーバの中に配置したいものは一般的なミドルウェアであったり、あるいは自前で開発したバッチスクリプトであったり、多岐に渡るため、シェルスクリプトと一対一のように記述できるAnsibleが扱いやすく、採用の動機になります。

対して、VPCやセキュリティグループ、RDBなどはリソースごとに相互作用があり、どこかで定義した値を別の場所で使う、ということが多くあります。このようなシーンではTerraformはうまく相互関係を解決してくれます。

AnsibleとTerraform比較一覧[6]

項目 Terraform Ansible
開発元 HashiCorp RedHat
クラウドプロバイダ対応数 300以上 41
インフラ層の構成管理 優れている 対応可能
OS・ミドルウェア層の構成管理 対応可能 優れている
エージェントの要否 不要 不要
GUI
オープンソース版
メーカーサポート付きの商用版
SaaS提供

参考用

Ansibleクイックスタートビデオ

RedHatが公開しているAnsibleクイックスタートガイドをまとめた動画です。
Ansibleの概要をさっさと知りたい方向けの動画です。
https://www.ansible.com/resources/videos/quick-start-video?extIdCarryOver=true&sc_cid=701f2000001OH7YAAW

Ansible学習環境

ブラウザ上でAnsibleの実行ができる。すごい。
https://rheb.hatenablog.com/entry/easiest_way_to_learn_ansible_for_beginners

Ansibleで始めるインフラ構築自動化

正直これだけでいいじゃんっていうぐらい、Ansibleのことがまとまっているスライド。
https://www.slideshare.net/dcubeio/ansible-72056386

AWX

AnsibleのGUI(OSS版)。
https://github.com/ansible/awx

Ansible-semaphore

AnsibleのGUI(OSS版)。モダンGUIでMITライセンスなのがAWXとの違いか?
https://github.com/ansible-semaphore/semaphore

Ansible Tower

AnsibleのGUI(エンタープライズ版)。
https://www.ansible.com/products/tower

Ansible-builder/Runner

Ansible Playbookの実行環境をコンテナ化して提供できる。
https://github.com/ansible/ansible-builder
https://github.com/ansible/ansible-runner

脚注
  1. 第1回 Ansibleとは ↩︎

  2. Ansibleで始めるLinux管理 ↩︎

  3. Get Started
    〜はじめてみよう、Ansible〜
    ↩︎

  4. Playbookの使用 ↩︎

  5. ansibleとterraformって何が違うんですか? ↩︎

  6. Infrastructure as Codeを実現するTerraformとAnsible~それぞれの得意領域と使い分け~ ↩︎

Discussion