■ はじめに
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 と連携できるのは魅力的に感じました。