たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

Ansibleでやらかしそうになった話

はじめに

こんにちは たそ(@taso_int)です。
もう9月になるということで早いですね。あと3ヶ月で年越しですよ。
勉強の方はDevnetを先週受けたのですが落ちてしまいました。
想像以上に難しかったですがまたチャレンジしたいですね。
応用情報にシフトしていきたいです。
今回はAnsibleでやらかしそうになったところについて書きます。

目的

目的はシスコルーターACLの書き換えをAnsibleで行います。

環境

環境はシスコが提供しているsandboxで行います。 実行環境 Ansibleバージョン 2.9.23

実装について

ACLのモジュールを探すとcisco.ios.ios_aclsというモジュールがありました。
このモジュールを使ってみたのですがシーケンス番号を指定して削除することが出来ませんでした。
仕方なくcisco.ios.ios.configモジュールを使って書くことにしました。

試作品

こんな感じのplaybookとテンプレート実装しました。
(変数なしjinja2テンプレート使うなというツッコミはやめてください)

playbook

(ansible2.9.23) taso@tasomint:~/ansible$ cat testacl.yml 
---
- hosts: ios
  gather_facts: no
  tasks:
    - name: set acl
      cisco.ios.ios_config:
        src: set_acl.j2

jinja2

(ansible2.9.23) taso@tasomint:~/ansible$ cat set_acl.j2 
ip access-list extended taso
 no 10
 no 20
 no 30
 10 permit ip 192.168.1.0 0.0.0.255 10.1.1.0 0.0.0.255
 20 permit ip 192.168.1.0 0.0.0.255 10.1.2.0 0.0.0.255
 30 permit ip 192.168.1.0 0.0.0.255 10.1.3.0 0.0.0.255

コンフィグを流すイメージで作りました。

実際にためす

実際に試してます。

(ansible2.9.23) taso@tasomint:~/ansible$ ansible-playbook -i ios.in testacl.yml 
 
PLAY [ios] *********************************************************************

TASK [set acl] *****************************************************************
changed: [sandbox-iosxe-latest-1.cisco.com]

PLAY RECAP *********************************************************************
sandbox-iosxe-latest-1.cisco.com : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

うまくいってるぽい一応確認してみよう

csr1000v-1#show ip access-lists taso
Extended IP access list taso
    10 permit ip 192.168.1.0 0.0.0.255 10.1.1.0 0.0.0.255
    20 permit ip 192.168.1.0 0.0.0.255 10.1.2.0 0.0.0.255
    30 permit ip 192.168.1.0 0.0.0.255 10.1.3.0 0.0.0.255

うまく入ってますね。 これで終わりに・・・

一応確認のためもう一度実行してみますか。

PLAY [ios] **********************************************************************************

TASK [set acl] ******************************************************************************
changed: [sandbox-iosxe-latest-1.cisco.com]

PLAY RECAP **********************************************************************************
sandbox-iosxe-latest-1.cisco.com : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

ルーターの方も見てみましょう。

csr1000v-1#show ip access-lists taso
Extended IP access list taso

あれれ~おかしいぞ(名探偵風)
jinja2にはちゃんと設定が入ってたのに
なのに2回目を実行すると消えてるんですよね。

モジュールにregister(戻り値)をつけると見えてきます。

戻り値をつけて実行

registerの変数に変数.commandsを入れてあげると実際に実行したコマンドがわかります。
追加したあとのplaybook

---
- hosts: ios
  gather_facts: no
  tasks:
    - name: set acl
      cisco.ios.ios_config:
        src: set_acl.j2
      register: acl

    - name: debug
      debug:
        msg: "{{ acl.commands }}" 

1回目

PLAY [ios] **********************************************************************************

TASK [set acl] ******************************************************************************
changed: [sandbox-iosxe-latest-1.cisco.com]

TASK [debug] ********************************************************************************
ok: [sandbox-iosxe-latest-1.cisco.com] => {
    "msg": [
        "ip access-list extended taso",
        "no 10",
        "no 20",
        "no 30",
        "10 permit ip 192.168.1.0 0.0.0.255 10.1.1.0 0.0.0.255",
        "20 permit ip 192.168.1.0 0.0.0.255 10.1.2.0 0.0.0.255",
        "30 permit ip 192.168.1.0 0.0.0.255 10.1.3.0 0.0.0.255"
    ]
}

PLAY RECAP **********************************************************************************
sandbox-iosxe-latest-1.cisco.com : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2回目

(ansible2.9.23) taso@tasomint:~/ansible$ ansible-playbook -i ios.in testacl.yml 

PLAY [ios] **********************************************************************************

TASK [set acl] ******************************************************************************
changed: [sandbox-iosxe-latest-1.cisco.com]

TASK [debug] ********************************************************************************
ok: [sandbox-iosxe-latest-1.cisco.com] => {
    "msg": [
        "ip access-list extended taso",
        "no 10",
        "no 20",
        "no 30"
    ]
}

PLAY RECAP **********************************************************************************
sandbox-iosxe-latest-1.cisco.com : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

2回目に関しては設定するACLが入ってないんです。
コンフィグを流すイメージで作りました。←これが間違った考えで、
実際は差分を取ってないところだけを実行してる動きをしてるんですよね。
(メカニズムがわからないので知ってる方教えてください)

今回の場合では削除するACLと追加するACLを別々に書いてあげると問題ないです。

cisco.ios.ios_configはかなり便利なモジュールですが、モジュールを使って入れた設定が入っているかと2回目を実行しても設定に変化が起きないかは確認したほうがいいと思いました。cisco.ios.ios_configに限った話ではないですが

以上になります。 ここまで読んでいただきありがとうございました。