Ansibleの概要
Ansibleは、エージェントレスの構成管理ツールです。通常Ansibleは、管理者がYAMLで書いたAnsible Playbookを実行した際、Pythonスクリプトをリモートホストにコピーし、リモートホストでそのスクリプトを実行します。しかし、ネットワーク機器の場合は、Pythonスクリプトを実行できない機器が多いため、管理サーバからデバイスにSSH接続してCLIコマンドを実行する仕組みとなっています。その他、Netconfにも対応しています。詳しくは下記に記載があります。
インベントリファイル(inventory.ini)の作成
管理対象機器の接続先や接続方法をインベントリファイルに記載します。
[iosxe]
IOSXE1 ansible_host=**.**.**.**
[iosxr]
IOSXR1 ansible_host=**.**.**.**
[iosxe:vars]
ansible_user=cisco
ansible_password=*****
ansible_connection=network_cli
ansible_network_os=ios
[iosxr:vars]
ansible_user=cisco
ansible_password=*****
ansible_connection=network_cli
ansible_network_os=iosxr
Ansibleがinventory.iniを読み込めるかをansible-inventoryコマンドで確認します。ちゃんと読み込めている場合は、下記表示になります。
$ ansible-inventory -i inventory.ini --list
{
"_meta": {
"hostvars": {
"IOSXE1": {
"ansible_connection": "network_cli",
"ansible_host": "**.**.**.**",
"ansible_network_os": "ios",
"ansible_password": "cisco",
"ansible_user": "*****"
},
"IOSXR1": {
"ansible_connection": "network_cli",
"ansible_host": "**.**.**.**",
"ansible_network_os": "iosxr",
"ansible_password": "*****",
"ansible_user": "cisco"
}
}
},
"all": {
"children": [
"iosxe",
"iosxr",
"ungrouped"
]
},
"iosxe": {
"hosts": [
"IOSXE1"
]
},
"iosxr": {
"hosts": [
"IOSXR1"
]
}
}
inventory.iniファイル内にミスがある場合、下記のようなエラーが表示されます。私は「ansible_user=cisco」と記載すべきところを「ansible_user:cisco」と記載してエラーになっていました…
$ ansible-inventory -i inventory.ini --list
[WARNING]: * Failed to parse /Users/*****/ansible/inventory/inventory.ini with ini plugin: /Users/*****/ansible/inventory/inventory.ini:8: Expected key=value, got:
ansible_user:cisco
[WARNING]: Unable to parse /Users/*****/ansible/inventory/inventory.ini as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped"
]
}
}
Ansible Playbookのサンプル
ios_configモジュールを用いたIOS-XEデバイスのコンフィグ設定
事前事後コンフィグチェックを含めたloopbackIFを設定するplaybookのサンプルです。debugでshowコマンドの結果表示、whenでコンフィグ投入の条件分岐をさせています。
---
- hosts: iosxe
gather_facts: false
tasks:
- name: pre-check
ios_command:
commands: show run | i Loopback10
register: pre_results
- name: display pre-check results
debug:
var: pre_results.stdout
- name: add loopback
ios_config:
lines:
- ip address 5.5.5.5 255.255.255.255
parents: interface Loopback10
when: "'interface Loopback10' not in pre_results.stdout"
- name: post-check
ios_command:
commands: show run | i Loopback10
register: post_results
- name: display post-check results
debug:
var: post_results.stdout
対象のLoopbackIFの設定が入っていない場合は、下記実行結果になります。
$ ansible-playbook -i inventory/inventory.ini add_loopback_xe.yml
PLAY [iosxe] *******************************************************************
TASK [pre-check] ***************************************************************
[WARNING]: Platform darwin on host IOSXE1 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change the meaning of that path. See https://docs.ansible.com
/ansible/2.11/reference_appendices/interpreter_discovery.html for more
information.
ok: [IOSXE1]
TASK [display pre-check results] ***********************************************
ok: [IOSXE1] => {
"pre_results.stdout": [
""
]
}
TASK [add loopback] ************************************************************
[WARNING]: To ensure idempotency and correct diff the input configuration lines
should be similar to how they appear if present in the running configuration on
device
changed: [IOSXE1]
TASK [post-check] **************************************************************
ok: [IOSXE1]
TASK [display post-check results] **********************************************
ok: [IOSXE1] => {
"post_results.stdout": [
"interface Loopback10"
]
}
PLAY RECAP *********************************************************************
IOSXE1 : ok=5 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
対象のLoopbackIFの設定が入っている場合は、add loopbackタスクがスキップされ、下記実行結果になります。
$ ansible-playbook -i inventory/inventory.ini add_loopback_xe.yml
PLAY [iosxe] *******************************************************************
TASK [pre-check] ***************************************************************
[WARNING]: Platform darwin on host IOSXE1 is using the discovered Python
interpreter at /usr/bin/python, but future installation of another Python
interpreter could change the meaning of that path. See https://docs.ansible.com
/ansible/2.11/reference_appendices/interpreter_discovery.html for more
information.
ok: [IOSXE1]
TASK [display pre-check results] ***********************************************
ok: [IOSXE1] => {
"pre_results.stdout": [
"interface Loopback10"
]
}
TASK [add loopback] ************************************************************
skipping: [IOSXE1]
TASK [post-check] **************************************************************
ok: [IOSXE1]
TASK [display post-check results] **********************************************
ok: [IOSXE1] => {
"post_results.stdout": [
"interface Loopback10"
]
}
PLAY RECAP *********************************************************************
IOSXE1 : ok=4 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
ios_l3_interfaceモジュールを用いたIOS-XEデバイスのコンフィグ設定
汎用性のあるios_configではなく、用途別にios_bgp, ios_ntpなどのモジュールが用意されています。IOS-XEに対して使用できるモジュールの一覧は下記にあります。
- https://docs.ansible.com/ansible/latest/collections/cisco/ios/index.html
下記はios_l3_interfaceモジュールを用いて上のplaybookと同じ動作をさせるplaybookのサンプルです。
---
- hosts: iosxe
gather_facts: false
tasks:
- name: pre-check
ios_command:
commands: show run | i Loopback10
register: pre_results
- name: display pre-check results
debug:
var: pre_results.stdout
- name: add loopback
ios_l3_interface:
name: Loopback10
ipv4: 5.5.5.5/32
when: "'interface Loopback10' not in pre_results.stdout"
- name: post-check
ios_command:
commands: show run | i Loopback10
register: post_results
- name: display post-check results
debug:
var: post_results.stdout
外部ファイル読み込みによるIOS-XEデバイスのコンフィグ設定
jinja2テンプレートファイルを読み込んでコンフィグ投入する方法もあります。下記がplaybookのサンプルです。srcにファイルを指定しています。
---
- hosts: iosxe
gather_facts: false
tasks:
- name: pre-check
ios_command:
commands: show run | i Loopback10
register: pre_results
- name: display pre-check results
debug:
var: pre_results.stdout
- name: add loopback
ios_config:
src: xe_template.j2
when: "'interface Loopback10' not in pre_results.stdout"
- name: post-check
ios_command:
commands: show run | i Loopback10
register: post_results
- name: display post-check results
debug:
var: post_results.stdout
また、jinja2テンプレートファイル(xe_template.j2)内は下記のようにコンフィグをそのままコピペした形で記載しています。
interface Loopback10
ip address 5.5.5.5 255.255.255.255
iosxr_configモジュールを用いたIOS-XRデバイスのコンフィグ設定
IOS-XRデバイスに対しても、使用するモジュールを変更してあげることで同じように設定できます。IOS-XRに対して使用できるモジュールは下記に記載があります。
- https://docs.ansible.com/ansible/latest/collections/cisco/iosxr/index.html
---
- hosts: iosxr
gather_facts: false
tasks:
- name: pre-check
iosxr_command:
commands: show run | i Loopback10
register: pre_results
- name: display pre-check results
debug:
var: pre_results.stdout
- name: add loopback
iosxr_config:
lines:
- ipv4 address 5.5.5.5 255.255.255.255
parents: interface Loopback10
when: "'interface Loopback10' not in pre_results.stdout"
- name: post-check
iosxr_command:
commands: show run | i Loopback10
register: post_results
- name: display post-check results
debug:
var: post_results.stdout
Ansibleを基礎から体系的に学びたい方は下記の本がおすすめです。
コメント