てくなべ (tekunabe)

ansible / network / automation / StackStorm

StackStorm と Ansible で Cisco IOS ルーターに設定を投入する(st2 run編)

■ はじめに

StackStorm と Ansible 連携を試すために、Cisco IOS ルーターに設定を投入する方法を確認しました。 この記事では、環境の準備と st2 run コマンドによる簡単な Ansible 連携の方法をご紹介します。


■ StackStorm側の準備

StackStorm 本体のインストール

今回は 以下の方法でインストールします。 tekunabe.hatenablog.jp

2.7.2 というバージョンがインストールされました。

Ansible Pack のインストール

まず st2 login コマンドでログインします。

[ec2-user@ip-172-31-4-147 ~]$ st2 login testu
Password:
Logged in as testu

Note: You didn't use --write-password option so the password hasn't been stored in the client config and you will need to login again in 24 hours when the auth token expires.
As an alternative, you can run st2 login command with the "--write-password" flag, but keep it mind this will cause it to store the password in plain-text in the client config file (~/.st2/config).

続いて、st2 pack install ansible コマンドで Ansible Pack をインストールします。

[ec2-user@ip-172-31-4-147 ~]$ st2 pack install ansible

For the "ansible" pack, the following content will be registered:

rules     |  0
sensors   |  0
triggers  |  0
actions   |  8
aliases   |  0

Installation may take a while for packs with many items.

        [ succeeded ] download pack
        [ succeeded ] make a prerun
        [ succeeded ] install pack dependencies
        [ succeeded ] register pack

+-------------+--------------------------------------------------+
| Property    | Value                                            |
+-------------+--------------------------------------------------+
| name        | ansible                                          |
| description | st2 content pack containing ansible integrations |
| version     | 0.5.4                                            |
| author      | StackStorm, Inc.                                 |
+-------------+--------------------------------------------------+

Ansible Pack がインストールされたことを確認します。

[ec2-user@ip-172-31-4-147 ~]$ st2 pack show ansible
+-------------+-----------------------------------------------------------+
| Property    | Value                                                     |
+-------------+-----------------------------------------------------------+
| name        | ansible                                                   |
| description | st2 content pack containing ansible integrations          |
| author      | StackStorm, Inc.                                          |
| content     | {                                                         |
|             |     "tests": {                                            |
|             |         "count": 1,                                       |
|             |         "resources": [                                    |
|             |             "test_actions_lib_ansiblebaserunner.py"       |
|             |         ]                                                 |
|             |     },                                                    |
|             |     "actions": {                                          |
|             |         "count": 8,                                       |
|             |         "resources": [                                    |
|             |             "playbook",                                   |
|             |             "command_local",                              |
|             |             "galaxy.list",                                |
|             |             "vault.encrypt",                              |
|             |             "galaxy.install",                             |
|             |             "command",                                    |
|             |             "vault.decrypt",                              |
|             |             "galaxy.remove"                               |
|             |         ]                                                 |
|             |     }                                                     |
|             | }                                                         |
| email       | info@stackstorm.com                                       |
| keywords    | [                                                         |
|             |     "ansible",                                            |
|             |     "cfg management",                                     |
|             |     "configuration management"                            |
|             | ]                                                         |
| ref         | ansible                                                   |
| repo_url    | https://github.com/StackStorm-Exchange/stackstorm-ansible |
| version     | 0.5.4                                                     |
+-------------+-----------------------------------------------------------+

Ansible Pack に、どのような Acition があるかを確認します。

[ec2-user@ip-172-31-4-147 ~]$ st2 action list --pack=ansible
+------------------------+---------+--------------------------------------+
| ref                    | pack    | description                          |
+------------------------+---------+--------------------------------------+
| ansible.command        | ansible | Run ad-hoc ansible command (module)  |
| ansible.command_local  | ansible | Run ad-hoc ansible command (module)  |
|                        |         | on local machine                     |
| ansible.galaxy.install | ansible | Download & Install role from ansible |
|                        |         | galaxy                               |
| ansible.galaxy.list    | ansible | Display a list of installed roles    |
|                        |         | from ansible galaxy                  |
| ansible.galaxy.remove  | ansible | Remove an installed from ansible     |
|                        |         | galaxy role                          |
| ansible.playbook       | ansible | Run ansible playbook                 |
| ansible.vault.decrypt  | ansible | Decrypt ansible data files           |
| ansible.vault.encrypt  | ansible | Encrypt ansible data files           |
+------------------------+---------+--------------------------------------+

Playbook を実行するには、 ansible.playbook という Action を利用すればよいことが分かりました。

ansible.playbook という Action の説明を参照します。

[ec2-user@ip-172-31-4-147 ~]$ st2 action get ansible.playbook
+-------------+--------------------------------------------------------------+
| Property    | Value                                                        |
+-------------+--------------------------------------------------------------+
| id          | 5affab616fb123179539c2a2                                     |
| uid         | action:ansible:playbook                                      |
| ref         | ansible.playbook                                             |
| pack        | ansible                                                      |
| name        | playbook                                                     |
| description | Run ansible playbook                                         |
| enabled     | True                                                         |
| entry_point | ansible_playbook.py                                          |
| runner_type | local-shell-script                                           |
| parameters  | {                                                            |
|             |     "help": {                                                |
|             |         "type": "boolean",                                   |
|             |         "description": "Show help message and exit [-h]"     |
|             |     },                                                       |
(略)
|             |     "playbook": {                                            |
|             |         "position": 0,                                       |
|             |         "type": "string",                                    |
|             |         "description": "Playbook file"                       |
|             |     },                                                       |
(略)
|             |     "inventory_file": {                                      |
|             |         "type": "string",                                    |
|             |         "description": "Inventory host file                  |
|             | (default=/etc/ansible/hosts) [-i]"                           |
|             |     },                                                       |
(略)
|             |     "verbose": {                                             |
|             |         "enum": [                                            |
|             |             "v",                                             |
|             |             "vv",                                            |
|             |             "vvv",                                           |
|             |             "vvvv"                                           |
|             |         ],                                                   |
(略)
|             | }                                                            |
| notify      |                                                              |
| tags        |                                                              |
+-------------+--------------------------------------------------------------+

上記は抜粋ですが、よく使いそうなパラメータとして以下のことが分かります。

  • Playbook の指定: playbook
  • インベントリファイルの指定: inventory_file
  • 詳細度の指定: verbose


■ Ansible 側の準備

Ansible 本体

Ansible自身は、Ansible Pack インストール時に virtualenv 配下にインストールされます。そのため別途インストールする必要はありません。

インストールされたバージョンを確認します。

[ec2-user@ip-172-31-4-147 ~]$ /opt/stackstorm/virtualenvs/ansible/bin/ansible --version
ansible 2.5.3
  config file = None
  configured module search path = [u'/home/ec2-user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/stackstorm/virtualenvs/ansible/lib/python2.7/site-packages/ansible
  executable location = /opt/stackstorm/virtualenvs/ansible/bin/ansible
  python version = 2.7.5 (default, May  3 2017, 07:55:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-14)]

Playbook の作成

Cisco IOS ルーターntp server 10.1.1.1 を投入する、以下の Playbook を作成します。

ファイル名: /home/ec2-user/ios_test.yml

- hosts: ios
  gather_facts: no
  connection: network_cli

  tasks:
    - name: config_test
      ios_config:
        lines:
          - ntp server 10.1.1.1

  vars:
    ansible_network_os: ios
    ansible_user: testadmin
    ansible_ssh_pass: testpass

インベントリファイル

以下のインベントリファイルを作成します。 ファイル名: /home/ec2-user/inventory

[ios]
10.1.1.67

ansible.cfg の作成

Ansibleが初めて接続する相手のホストキーが登録されていないとエラーになりますので、今回はホストキーのチェックを無視する設定ファイルを作成します。

ファイル名: /opt/stackstorm/packs/ansible/ansible.cfg

[defaults]
host_key_checking = False


■ 実行

それでは st2 run コマンドで Ansible の Playbook を実行します。

[ec2-user@ip-172-31-4-147 ~]$ st2 run ansible.playbook playbook=/home/ec2-user/ios_test.yml inventory_file=/home/ec2-user/inventory
..
id: 5affbf066fb123179539c2e2
status: succeeded
parameters:
  cwd: /opt/stackstorm/packs/ansible
  inventory_file: /home/ec2-user/inventory
  playbook: /home/ec2-user/ios_test.yml
result:
  failed: false
  return_code: 0
  stderr: ''
  stdout: "
PLAY [ios] *********************************************************************

TASK [config_test] *************************************************************
changed: [10.1.1.67]

PLAY RECAP *********************************************************************
10.1.1.67               : ok=1    changed=1    unreachable=0    failed=0
"
  succeeded: true

正常に完了しました。

ルーター側で、設定が実際に反映されているか確認します。

Route101#sh run | inc ntp
ntp server 10.1.1.1

無事に設定が入りました。


■ まとめ

StackStorm の st2 run コマンドから Ansible 経由で Cisco IOS ルーターに設定投入できたことを確認しました。普通にAnsible 単体で利用するときと環境が別なので、たとえば、 ansible.cfg の置き場には注意が必要です。

今回は、Workflow に組み込むのではなく st2 run コマンドによる単発の実行でしたが、Ansible と連携できるのは魅力的に感じました。