てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Ansible] AWX から Cisco IOS と Juniper Junos を操作する

■ はじめに

Ansible には GUI 付きの Ansible Tower という製品があります。そのアップストリーム版 OSS にあたるものとして AWX があります。

f:id:akira6592:20181218002414p:plain
AWXのダッシュボード画面

この記事では、AWX から IOS と Junos の機器に対して簡単な操作(show versionの実行と表示)を試したときの手順をまとめます。

ポイントは以下のとおりです。

  • コネクションプラグインとして local ではなく、IOS には network_cli を、Junos には netconf を利用
  • Credential Type として、Network ではなく、Machine を利用

以前は、local とコネクションプラグインと、Network Credential という、ネットワーク機器固有方法でした。最近のバージョンで、サーバーと同じように Credential Tpye に Machine が利用できるようになりました。詳細は「RED HAT ANSIBLE NETWORK AUTOMATION のアップデート情報(翻訳)」の「ネットワーク機器のための認証情報の管理」をご参照ください。

先日の Ansibleもくもく会 2018.12 ネットワーク編 (Ansible Tower 3.3.x を利用)で、Network Credential と network_cliコネクションプラグイン という組み合わせで Playbook がうまく動かなかったので、正しいと思う組み合わせで試してみたくなり、やってみました。

  • 環境
    • AWX 2.1.2
    • Ansible 2.7.4
    • ブラウザ言語設定: Chrome 英語
    • Centos 7.5


■ インストール

Software Design 2018年12月号 の Ansible 特集にあった AWX の章を参考にしました。

誌面では、執筆時の最新版 2.0.1 のインストールになっていますが、発売後筆者から

というコメントがありました。

もうちょっといけるかな、という気持ちで今回は 2.1.2 をインストールしました。


■ 準備

各種設定をしていきます。

Organizations

項目
NAME test_org

Projects

項目
NAME network_project
ORGANIZATION test_org
SCM TYPE Git
SCM URL https://github.com/akira6592/tower-samples.git

(上記リポジトリは作業用に作成したため、変更、削除する可能性があります)

Inventories

DTAILS

項目
NAME network_inventory
Organization test_org

GROUPS

ios

項目
NAME ios
VARIABLES (下記)
  • VARIABLES
---
ansible_network_os: ios
ansible_connection: network_cli     # ポイント

junos

項目
NAME junos
VARIABLES (下記)
  • VARIABLES
---
ansible_network_os: junos
ansible_connection: netconf     # ポイント

HOSTS

ios1

項目
NAME ios1
VARIABLES (下記)
GROUPS ios
  • VARIABLES
---
ansible_host: 172.16.0.2

vsrx1

項目
NAME vsrx1
VARIABLES (下記)
GROUPS junos
  • VARIABLES
---
ansible_host: 172.16.0.1

Credentials

ios_credential

項目
NAME ios_credential
ORGANIZATION test_org
CREDENTIOAL TYPE Machine ポイント
USERNAME iosuser
PASSWORD iospass9999

ユーザーに特権がなく、かつ特権が必要な操作を実行したい場合は、PRIVILEGE ESCALATION METHODenable を、PRIVILEGE ESCALATION PASSWORD に 機器側にenable secret で指定した特権パスワードを指定すればよさそうです。 それぞれ、変数の指定でいうと、ansible_become_method: enable と、ansible_become_pass: hogehoge のことでしょう。

junoos_credential

項目
NAME ios_credential
ORGANIZATION test_org
CREDENTIOAL TYPE Machine ポイント
USERNAME junos_user
PASSWORD junospass9999

TEMPLATES

ios_show_version

項目
NAME ios_show_version
INVENTORY network_inventory
PROJECT network_project
PLAYBOOK ios_command_test.yml(内容は下記)
CREDENTIAL ios_credential
  • ios_command_test.yml
- hosts: ios
  gather_facts: no

  tasks:
    - name: show command test
      ios_command:
        commands:
          - show version
      register: result

    - name: debug output
      debug:
        msg: "{{ result.stdout_lines[0] }}"

Credential で指定したユーザーに特権がなく、かつ特権が必要なコマンド(show running-configなど)を実行する場合は、Enable Privilege Escalation にチェックを入れるとできそうです。変数の指定でいうと ansible_become: yes のことでしょう。

junos_show_version

項目
NAME junos_show_version
INVENTORY network_inventory
PROJECT network_project
PLAYBOOK junos_command_test.yml (内容は下記)
CREDENTIAL junos_credential
  • junos_command_test.yml
- hosts: junos
  gather_facts: no

  tasks:
    - name: show command test
      junos_command:
        commands:
          - show version
      register: result

    - name: debug output
      debug:
        msg: "{{ result.stdout_lines[0] }}"


■ 実行

IOS の show version

ジョブテンプレートを実行します。

f:id:akira6592:20181217221358p:plain
実行

f:id:akira6592:20181217221424p:plain
実行結果画面

  • ログ詳細
SSH password: 
PLAY [ios] *********************************************************************
TASK [show command test] *******************************************************
ok: [ios1]
TASK [debug output] ************************************************************
ok: [ios1] => {
    "msg": [
        "Cisco IOS XE Software, Version 16.08.01", 
        "Cisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1, RELEASE SOFTWARE (fc3)", 
        "Technical Support: http://www.cisco.com/techsupport", 
        "Copyright (c) 1986-2018 by Cisco Systems, Inc.", 
        "Compiled Tue 27-Mar-18 13:32 by mcpre", 
        "", 
        "", 
        "Cisco IOS-XE software, Copyright (c) 2005-2018 by cisco Systems, Inc.", 
        "All rights reserved.  Certain components of Cisco IOS-XE software are", 
        "licensed under the GNU General Public License (\"GPL\") Version 2.0.  The", 
        "software code licensed under GPL Version 2.0 is free software that comes", 
        "with ABSOLUTELY NO WARRANTY.  You can redistribute and/or modify such", 
        "GPL code …
PLAY RECAP *********************************************************************
ios1                       : ok=2    changed=0    unreachable=0    failed=0  

Junos の show version

ジョブテンプレートを実行します。

f:id:akira6592:20181217221451p:plain
実行

f:id:akira6592:20181217221512p:plain
実行結果画面

  • ログ詳細
SSH password: 
PLAY [junos] *******************************************************************
TASK [show command test] *******************************************************
ok: [vsrx1]
TASK [debug output] ************************************************************
ok: [vsrx1] => {
    "msg": [
        "Hostname: vsrx1", 
        "Model: firefly-perimeter", 
        "JUNOS Software Release [12.1X47-D15.4]"
    ]
}
PLAY RECAP *********************************************************************
vsrx1                      : ok=2    changed=0    unreachable=0    failed=0   


■ まとめ

AWX で Cisco IOS と Juniper Junos の show version コマンドを実行し、画面に表示するところまでを確認できました。