プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Ansibleの基礎

DevOpsやCI/CDの中核にあるのが自動化である。あらゆる場面において作業を自動化することが推奨される。

従来はインフラ屋さんが手動で実施していたインフラ設定作業も自動化の対象に含まれる。

インフラ設定管理を自動化するためのツールが設定管理ツールであり、その中で今、最も人気があるのがAnsibleだ。

ここではAnsibleについてみていこう。


歴史

  • 2012年に初版リリース
  • 2015年にRedhatが買収
  • 2019年にIBMRedhatを買収

chef、puppetなどに比べると構成管理ツールとしては比較的新しい。


概要

基本設計理念

  • Immutable Infrastracture
  • 冪等性の担保
    • 各モジュールがそれぞれの方法で冪等性をチェックしてる

製品(OSS

  • Ansible Project
    • CLIベースの実行エンジン
  • AWS
    • GUIベースの管理プラットフォーム

製品(有償)

  • Ansible Engine
    • OSSのAnsible Projectに相当
  • Tower

Dry-run機能

  • check
    • 変更を加えない処理を実施
  • diff
    • ファイルの変更を確認

Orchestration機能

  • アプリケーションのデプロイのこと
  • 複数の手順を順序通りに実行してアプリケーションをデプロイすることができる
  • スケールアウトはInventoryに追加するだけで実施できる

機器、ベンダごとのモジュールが必要

  • ベンダ間の差異は抽象化はされていない
    • NAPALMとは思想が異なる

構成

module

  • taskの中で利用できる指示の集まり
  • バイスごとに異なる
  • コレクションとして管理・入るされている

task

  • 処理

play

  • taskの集まり

playbook

  • playの集まり
  • YAML形式で記述
  • 以下のキーワードから構成される
    • name
    • hosts
    • vars
    • tasks

inventory

  • taskの対象となるhostを定義したファイル
  • 実行時に-iオプションで指定する
  • 指定されなかった場合はデフォルトでは/etc/ansible/hostsを探す

基本的な使い方

実行方法

ansibleコマンド
  • adhoc実行するためのコマンド
  • -mでモジュール指定
    • 指定しなければansible.builtin.command
  • -aでモジュールへの引数指定
ansible-playbookコマンド
  • playbookを実行するコマンド
  • -i:インベントリファイル
  • -vデバッグ

変数

  • varsでplaybook内に変数を定義
  • {{ 変数名 }}で参照

変数(外部ファイル)

  • vars_filesで外部ファイルに変数を定義して呼び出せる

変数(groupごとに定義)

  • group_vars/に<group名>.yml

変数(hostごとに定義)

  • host_vars/に<host名>.yml
  • inventoryファイルに直接記載することもできる

繰り返し処理

  • 基本的にはloopを使う
  • with_<plugin>でもできる
  • untilはシステムが特定の状態になるまで待機するときに使える

条件分岐

  • whenを使う

出力結果を保存

  • 結果を返す処理を実行
  • registerで結果を変数へ格納
  • local_acion: copyで変数をファイルへ出力

結果結果を整形して保存

  • registerした変数をset_factでホスト変数へ
  • templateでホスト変数を整形してファイル化

Advancedな使い方

taskをモジュール化する

  • roleはtaskをモジュール化したもの
  • rolesフォルダに作成する
    • ansible-galaxyコマンドでひな形を作成できる
  • 呼び出し方は3種類ある
    • roles
    • include_role
    • import_role

複雑な処理を実施したい

  • YAMLで頑張って処理することはベストプラクティスではない
  • Filter plugin、Lookup plugin、moduleを自作してYAMLはシンプルに保つ

ネットワーク機器を管理する

  • localhostで実行する
    • 通常、ansibleはpythonファイルをtargetへ送り、target上で実行する
    • しかしネットワーク機器はlocalで実行し、localからREST APISSHCLIなどで設定を投入する
  • gather_factsはno
    • ネットワーク機器ではなくLocal PCの情報を集めてしまう

推奨構成

一般的な環境

production                # inventory file for production servers
staging                   # inventory file for staging environment

group_vars/
   group1.yml             # here we assign variables to particular groups
   group2.yml
host_vars/
   hostname1.yml          # here we assign variables to particular systems
   hostname2.yml

library/                  # if any custom modules, put them here (optional)
module_utils/             # if any custom module_utils to support modules, put them here (optional)
filter_plugins/           # if any custom filter plugins, put them here (optional)

site.yml                  # master playbook
webservers.yml            # playbook for webserver tier
dbservers.yml             # playbook for dbserver tier

roles/
    common/
    webtier/
    monitoring/

productionとstagingで共通する変数が少ない場合

inventories/
   production/
      hosts               # inventory file for production servers
      group_vars/
         group1.yml       # here we assign variables to particular groups
         group2.yml
      host_vars/
         hostname1.yml    # here we assign variables to particular systems
         hostname2.yml

   staging/
      hosts               # inventory file for staging environment
      group_vars/
         group1.yml       # here we assign variables to particular groups
         group2.yml
      host_vars/
         stagehost1.yml   # here we assign variables to particular systems
         stagehost2.yml

library/
module_utils/
filter_plugins/

site.yml
webservers.yml
dbservers.yml

roles/
    common/
    webtier/
    monitoring/