Absibleとは
Ansibleは、ITインフラの自動化を実現するためのオープンソースツールで、構成管理(Configuration Management)、アプリケーションデプロイメント、タスクの自動化、およびオーケストレーションに使用されます。Ansibleは、インフラをコード化し、スクリプトやコマンドを手動で実行する必要なく、インフラを一元的に管理・自動化することができる強力なツールです。
Ansibleの特徴
| No | 特徴 | 内容 |
|---|---|---|
| 1 | エージェントレス | Ansibleは、管理対象のサーバーにエージェントをインストールする必要がありません。管理ノード(Ansibleを実行するマシン)から、対象のサーバーにSSHで接続し、必要なコマンドをリモートで実行します。これにより、設定の手間が軽減され、簡単にインフラの管理が可能です。 |
| 2 | シンプルなYAML形式 | Ansibleの設定ファイルは、YAML形式で記述されます。これにより、設定やプレイブック(Playbook)が人間にとっても読みやすく、直感的な記述が可能です。構文が分かりやすく、複雑なシナリオも簡単に表現できます。 |
| 3 | プッシュ型の自動化 | Ansibleはプッシュ型の自動化ツールです。管理ノードから直接、ターゲットノードに対して設定やタスクをプッシュ(送信)して実行します。これに対し、他のツール(PuppetやChefなど)はプル型で、エージェントが管理ノードから設定をプルする方式です。 |
| 4 | モジュールベース | Ansibleは、多数のモジュール(リソースやタスクを管理するための機能)を提供しており、ネットワーク機器の管理、クラウドインフラの制御、サーバーの設定など多くの自動化タスクをサポートしています。これにより、異なる環境やデバイスでも一貫した管理が可能です。 |
| 5 | 冪等性 (べきとうせい) | Ansibleは冪等性を提供しており、同じタスクが何度実行されても結果が変わらない状態を保証します。例えば、ファイルをあるディレクトリにコピーするタスクを実行する場合、既にコピーされていれば再度のコピーは行わない、という動作が保証されます。これにより、無駄な処理が削減され、システムの安定性が向上します。 |
Ansibleの主なコンポーネント
| No | コンポーネント | 内容 |
|---|---|---|
| 1 | Playbook (プレイブック) | Playbookは、Ansibleの中心的な要素で、インフラの状態を定義し、それに基づいて実行されるタスクのセットを記述したものです。YAML形式で書かれており、タスクを順次実行します。 |
| 2 | Inventory (インベントリ) | Ansibleが管理するサーバーのリストを定義します。これにより、どのサーバーに対してタスクを実行するかを指定できます。インベントリは、ホストのIPアドレスやホスト名をリスト化したファイルです。 |
| 3 | モジュール | Ansibleは、特定のタスクを実行するためのモジュールを数多く提供しています。これにより、ファイル操作、サービス管理、パッケージ管理、ネットワーク設定、クラウドサービスの管理など、多様な操作をシンプルに自動化できます。ユーザー独自のモジュールも作成可能です。 |
| 4 | ロール(Role) | Ansibleでは、再利用可能な構成要素をロールとして管理できます。これにより、プレイブック内で特定の役割を持つ設定をモジュール化して、他のプロジェクトでも簡単に再利用できます。 |
| 5 | タスク | タスクは、特定の動作を実行する単位です。Playbook内で定義され、順次実行されます。各タスクは、特定のモジュールを使用して操作を実行します。 |
構成図
Ansible 基本的な形
インベントリファイルとプレイブックを作成してAnsibleを動作させます。
作業フォルダのイメージ
/home
└── ansible
├── cisco_ping.yml
├── status_check.yml
├── net_hosts
└── get_log
├── interface_logs
└── ping
インベントリ
対象のルータの情報を作業フォルダにあるnet_hostsという名前のインベントリファイルに記載します。
Router1 ansible_host=192.168.10.1
Router2 ansible_host=192.168.20.1
Router3 ansible_host=192.168.30.1
[Router:vars]
ansible_ssh_user=cisco
ansible_ssh_pass=cisco
ansible_become=yes
ansible_become_method=enable
ansible_become_pass=cisco
ansible_connection=network_cli
ansible_network_os=ios
各ルータにPingを実行するプレイブック
インベントリファイルで指定しているルータに対してPingを実行するプレイブックをcisco_ping.ymlという名前で作成をします。(インベントリファイルと同じ階層に作成します)
---
- name: Perform ping test from router
hosts: Router
gather_facts: no
tasks:
- name: Ping test to gateway
cisco.ios.ios_ping:
dest: "{{ hostvars[item].ansible_host }}" # インベントリのホストを宛先に使用
count: 1
loop: "{{ groups['Router'] }}" # ping_targetsグループ内のホストに対してループ実行
register: ping_output # Ping結果を保存
- name: Show ping result
copy:
content: |
Ping test result for {{ inventory_hostname }}:
Packet Loss: {{ ping_output.results[0].packet_loss }}% # 適切なフィールドを使用
dest: "/home/ansible/get_log/ping/ping_output_{{ inventory_hostname }}.log" # 各ホストごとにログを保存
delegate_to: localhost # ログファイルは管理ノード(Ansibleを実行するホスト)に保存
プレイブックの実行
ansible-playbook -i net_hosts cisco_ping.yml コマンドを使用してプレイブックを実行します。
各ルータにPingを実行した結果が表示されています。

Pingを実行したときのパケットロスの数字を保存しており中身を確認することが出来ます。

インターフェイスの状況を取得するプレイブック
インターフェイスの状況を取得する、status_check.ymlというプレイブックを作成します。
---
- name: Gather interface status from network devices and save to log
hosts: Router # ここに対象となるネットワーク機器のグループ名
gather_facts: no
tasks:
- name: Gather interface facts
cisco.ios.ios_facts:
gather_subset:
- interfaces # インターフェイス情報を収集
register: interface_facts # インターフェイス情報を保存
- name: Save interface status to a log file
copy:
content: |
Interface status for {{ inventory_hostname }}:
{{ ansible_net_interfaces | to_nice_json }} # 正しいフィールドを参照
dest: "/home/ansible/get_log/interface_logs/interface_status_{{ inventory_hostname }}.log"
delegate_to: localhost # ログファイルは管理ノードに保存
実行
ansible-playbook -i net_hosts status_check.yml コマンドを使用してプレイブックを実行します。

ログを確認すると取得したインターフェイスの情報が保存されていることが確認できます。

Ansible ロールの利用
Roleを使うことで、再利用可能な構成をモジュール化できます。Roleは、特定の機能(例:インターフェイス設定、ルーティング設定、NTP設定など)ごとに分けて管理でき、他のプレイブックでも使い回すことが可能です。
Roleディレクトリの作成
まず、rolesディレクトリを作成し、その中にRoleの構成要素を持つディレクトリ構造を作成します。
/home
└── ansible
├── main_playbook.yml
├── net_hosts
└── roles
└── network_config
├── tasks
│ └── main.yml
├── handlers
│ └── main.yml
└── vars
└── main.yml
タスクの定義をするmain.ymlの作成
roles/network_config/tasks/main.ymlにネットワーク設定のタスクを定義します。
---
- name: Configure Loopback
cisco.ios.ios_config:
lines:
- interface Loopback0
- description {{ interface_description }}
- ip address {{ interface_ip }} 255.255.255.0
変数の定義をするmain.ymlの作成
roles/network_config/vars/main.ymlに、このRoleに必要な変数を定義します。
---
interface_description: ANSIBLE_TEST
interface_ip: 192.168.100.100
ハンドラーの定義をするmain.ymlの作成
roles/network_config/handlers/main.yml設定変更後にデバイスの再起動や設定の保存を行うハンドラーを定義します。
---
- name: Save running configuration
cisco.ios.ios_command:
commands: write memory
ロールを利用したプレイブックのmain_playbook.ymlの作成
次に、Roleを呼び出すプレイブックを作成します。このプレイブックでは、Roleを指定するだけで、tasksやhandlersが自動的に適用されます。
---
- name: Apply network configuration roles
hosts: Router # 対象となるホストグループ
gather_facts: no
roles:
- network_config # 作成したRoleを呼び出す
Playbookの実行
ansible-playbook -i net_hosts main_playbook.yml コマンドでプレイブックを実行します。

ok=1やchanged=1は実行したTASKの数が表示されています。TASKが増えるとこの数もそれに対応する形で増えます。
対象機器のRouter1を確認してみるとLoopback0が作成されIPアドレスやdescriptionが設定されています。

複数の機器にまとめて同じ設定を投入することが出来るので定型化している作業の自動化などに使用することが出来ます