Ansibleを使ってネットワークメンテナンスを自動化してみる。勉強編

サーバ関連
スポンサーリンク

Ansibleについて

Ansibleは、ITインフラの自動化ツールであり、システム管理、アプリケーションのデプロイメント、構成管理を簡素化します。
エージェントレスで動作し、SSHやWinRMを利用してリモートマシンに接続するため、追加のソフトウェアをインストールする必要がありません。
YAML形式のプレイブックを使用して、タスクの定義と実行を行い、再現性のある環境構築を実現します。

Ansibleの特徴

  • エージェントレス
    →Ansibleはエージェントレスで動作するため、管理対象のホストに追加のソフトウェアをインストールする必要がありません。
    これにより、管理が容易でセキュリティリスクも低減されます。
  • シンプルな構文
    →YAML形式のプレイブックを使用することで、直感的で読みやすいスクリプトを作成できます。
     これにより、複雑なタスクも簡単に自動化できます。
  • 豊富なモジュール
    →Ansibleには多くの標準モジュールが含まれており、ファイル操作、パッケージ管理、サービス    管理など、さまざまなタスクを実行できます。
     これにより、幅広い自動化ニーズに対応可能です。
  • インベントリ管理
    →インベントリファイルを使用して、管理対象のホスト情報を定義し、グループ化や変数の設定が  可能です。
     これにより、スケーラブルな管理が実現します。
  • ロールと再利用性
    →ロールを使用することで、関連するタスク、変数、ファイル、テンプレートなどをまとめて管理できます。
     これにより、再利用性と可読性が向上し、効率的な運用が可能です。
  • 冪等性
    →冪等性とは、同じ操作を何度繰り返しても結果が変わらない性質を指します。
     Ansibleのタスクは冪等性を持つように設計されており、例えばファイルのコピータスクを何度実行しても、ファイルが既に存在する場合は再度コピーされることはありません。
     これにより、システムの状態を一貫して管理することができます。
  • コミュニティとサポート
    →Ansibleは活発なコミュニティによって支えられており、多くのリソースやサポートが利用可能です。
    公式ドキュメントやフォーラム、サードパーティのプラグインなどが豊富に揃っています。

Ansible基本用語集

  • プレイブック(Playbook):YAML形式で記述されるスクリプト。タスク定義と実行を行います。プレイブックは、複数ホストに対して一貫した設定や操作を実行するために使います。
  • タスク(Task):プレイブック内で実行される個々の操作を指します。各タスクは特定のモジュールを使用して実行されます。
  • モジュール(Module):Ansibleが提供する機能の単位で、特定のタスクを実行するためのプログラムです。
  • インベントリ(Inventory):管理対象のホスト情報を定義するファイルです。インベントリファイルには、ホスト名やIPアドレス、グループ化情報などが含まれます。
  • ロール(Role):関連するタスク、変数、ファイル、テンプレートなどをまとめて管理するための仕組みです。ロールを使用することで、再利用性や可読性が向上します。
  • 変数(Variable):プレイブックやタスク内で使用される値を動的に変更するための要素です。変数を使用することで、柔軟な設定が可能になります。

簡易図

  • Ansibleサーバ・・・Ansibleを実行する機器。エージェントレスなので導入が容易。
  • サーバ等・・・Ansibleプレイブックで設定変更や確認作業を実施する機器。

基本Ansibleサーバは対象機器に対してのSSHと、Pythonが使用可能であれば導入できます。
プレイブックでは、モジュールを使用することで対象機器に合わせた動作をさせることが可能です。

下記公式サイトからモジュールの一覧が確認できます。

Module Index — Ansible Documentation

プレイブックの書き方

下記はcisco機器に対してpingを実行し、結果を出力するプレイブックになります。

---
- name: Ping from Cisco devices
  hosts: cisco_devices
  gather_facts: no
  tasks:
    - name: Run ping command on Cisco device
      ansible.netcommon.cli_command:
        command: ping 192.168.1.1
      register: ping_result

    - name: Show ping result
      debug:
        var: ping_result.stdout
  • name: Ping from Cisco devices・・・1つのPlayに対して定義できる名前です。
  • hosts: cisco_devices・・・hosts:はそれを実行するホストが定義できます。今回cisco_devicesというグループ変数です。基本インベントリに定義されています。
  • gather_facts・・・基本的な機器情報を収集する機能。必要がなければno
  • tasks:・・・プレイブックの核となる部分です。Tasksセクションとも言います。
    上記は2つのタスクがあり、
    1つ目はansible.netcommon.cli_commandというモジュールを使ってpingの実行と、ping_resultという変数に結果を格納するregisterモジュールを使用しています。
    2つ目はdebugモジュールを使用して、結果を格納したping_resultを出力しています。

インベントリの書き方

上記プレイブックに付随するインベントリの内容です。

[cisco_devices]
192.168.1.100 ansible_network_os=ios ansible_connection=network_cli ansible_user=cisco ansible_password=cisco ansible_ssh_common_args='-o StrictHostKeyChecking=no'

192.168.1.100というアドレスのCisco機器に対してSSHをしています。
インベントリ内にログインユーザー名やパスワードなどの情報も盛り込んでいるため非常に見にくいので、あとで紹介するファイル肥大化を避ける管理方法を参考にしてください。

プレイブックの実行

下記コマンドを実行することで対象機器でpingの実行と疎通結果の確認が可能です。

ansible-playbook -i hosts ping_cisco_devices.yml

肥大化を防ぐディレクトリ分け

一つのプレイブック等に複数のタスクを入れるとかなり肥大になり、可読性に欠けます。
そのような事態を防ぐため、下記の様にディレクトリを分けて書くのが一般的です。

rolesは各タスクを分けることで運用が楽になります。
上の図で言うとpingとtracerouteの二つのタスクを分けて配置しています。

インベントリもgroup_varsに各ホストのログイン情報を別だしすることで簡易的に記述することが可能です。

コメント

タイトルとURLをコピーしました