てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ansible 2.9 でコレクションの一覧とバージョンを grep で表示する

ansible 2.9 では、コレクション一覧を表示する ansible-galaxy collection list コマンドが利用できません(ansible-base 2.10から)。

そのため、コレクションの一覧やバージョンを確認するには、別の方法が必要です。

デフォルトのコレクションインストール先(~/.ansible/collections/)の場合、以下コマンドで、インストールされているコレクション名とバージョンが分かります。

実行例

/home/sakana/.ansible/collections/ansible_collections/ansible/controller/MANIFEST.json:  "version": "4.1.2",
/home/sakana/.ansible/collections/ansible_collections/ansible/netcommon/MANIFEST.json:  "version": "2.6.1",
/home/sakana/.ansible/collections/ansible_collections/ansible/tower/MANIFEST.json:  "version": "3.8.5",
/home/sakana/.ansible/collections/ansible_collections/ansible/utils/MANIFEST.json:  "version": "2.5.2",
/home/sakana/.ansible/collections/ansible_collections/azure/azcollection/MANIFEST.json:  "version": "1.11.0",
/home/sakana/.ansible/collections/ansible_collections/seiko/smartcs/MANIFEST.json:  "version": "1.4.1",```

各コレクションの MANIFEST.json というファイルに、いろいろメタ情報が詰まってて、そこの version を表示してるだけです。

上記結果を、ansible-galaxy collection list 風にすると以下の通りです。

Collection         Version
------------------ -------
ansible.controller 4.1.2  
ansible.netcommon  2.6.1  
ansible.tower      3.8.5  
ansible.utils      2.5.2  
azure.azcollection 1.11.0 
seiko.smartcs      1.4.1  

[Ansible] ansible 2.9 を取り巻く現状(2022年7月現在)

コミュニティとしてはすでに EOL

Ansible 2.10 で大きくパッケージング、配布の方式が変わったからなのか、前のバージョン Ansible 2.9 の開発がしばらく続いていました。ですが、2021年10月の 2.9.27を最後にリリースが止まっています。

コミュニティとしては、各所で案内があった通り、2022/05/23 で EOL となっています。

Ansible 2.9 Upstream Life Cycle Announcement

The planned end of life date for upstream Ansible 2.9 is May 23, 2022 which coincides with the scheduled release of ansible-core 2.13. End of life for ansible-base 2.10 will also coincide with the scheduled release of ansible-core 2.13.

こちらのページにもすでにステータスが Unmaintained (end of life) とあります。

コミュニティのニュースレターであるThe Bullhornでも#51から、2.9のEOLのスケジュールを掲載していました。

コレクションがサポートを切り始めている

Ansible 2.9.10 以上を要件とするコレクションが多いですが、ぼちぼち 2.9 のサポートを切るコレクションもでてきました。

例: community.general 5.0.0

Ansiblejp ネットワーク部 座談会 2022.07でも話題に上がりました。

ドキュメントはまだ健在

Ansible 2.9 のドキュメントはまだ健在です。

docs.ansible.com

一時期は、2.9を選択できなくする動きがあったのですが、@sugitkさんコメントをきっかけにしてい、選択できるように戻りました

AAP サブスクリプションをもっている場合

ニュアンスが異なってしまうといけないので、このドキュメントにはこう書いてあるという引用に留めます。

access.redhat.com

We support all layered products and their use of Ansible Engine 2.9 until the EOL of AAP 1.2. (AAP1.2のExecution EnvironmentのAnsible Engine 2.9に対する説明)

github.com

While upstream support for Ansible 2.9 will cease on May 23, 2022, downstream support for customers of Ansible Automation Platform will continue to exist.

[Ansible] cisco.ios.ios_config モジュールの冪等性に関する警告 "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" について

はじめに

Cisco IOS のネットワーク機器に任意のコンフィグを投入する、cisco.ios.ios_config というモジュールがあります。

本モジュールを使ったPlaybookを実行して changed になると、以下のような冪等性に関する警告が表示されます。

% ansible-playbook -i inventory.ini test_ios_config.yml

PLAY [ios01] **********************************************************************

TASK [ios_config test] ************************************************************
[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: [ios01]

PLAY RECAP ************************************************************************
ios01                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

こちらについて説明します。

警告の意味

この警告は、冪等性を確保するために、各オプションで指定するコマンドは、機器の show running-config で表示される形式と同じにしてくださいね、いう警告です。

(仮に同じ形式にしてもこの警告は表示されます)

cisco.ios.ios_config モジュールの Notes に同じようなことが書かれています。

To ensure idempotency and correct diff the configuration lines in the relevant module options should be similar to how they appear if present in the running configuration on device including the indentation.

他、*_config モジュール共通の仕様として、FAQ にも関連の項目 "Why do the *_config modules always return changed=true with abbreviated commands?" があります。

本モジュールは、まず linessrcparents オプションに与えられるコンフィグの内容と、機器側の show running-config の内容を比較して、実際に投入が必要なコンフィグ差分を求めてから、コンフィグを生成、投入する動作です。

この比較は文字列の比較のため、フル表記と省略表記、大文字小文字違い、スペース有無の違いなどは別物として扱われます。

たとえば、以下のとおりです。

  • interface GigabitEthernet0/0int Gi0/0 は別物
    • 省略してしまっている
  • interface GigabitEthernet0/0interface gigabitethernet0/0 は別物
    • 大文字のところが小文字になっている
  • interface GigabitEthernet0/0interface GigabitEthernet 0/0 は別物
    • スペースが空いている

※ 本警告は、cisco.ios コレクション 1.3.0 から表示されるようになりました。しばらくは changed でも ok でも表示される仕様でした。cisco.ios コレクション 2.3.0 で、changed のときのみ表示されるように変更されました。

合わせないと毎回 changed になる

実際は、show running-config の内容と異なる形式でもコマンドとして有効な場合は、エラーにならずにコマンド自体は実行できます。しかし、同じPlaybookをもう一度実行すると、また差分ありと判断され、またコンフィグを投入します。

結果的に、毎回 changed になります。2回目の実行以降、設定が実質的に変わらないのに changed になってしまうのは少し混乱の元ですね。

具体的にどう指定するのが良いのか

たとえば、show running-config 上、

interface GigabitEthernet0/0

とあったら、以下のようにします。

- name: ios_config test
  cisco.ios.ios_config:
    lines:
      - description kingyo
    parents:
      - interface GigabitEthernet0/0    # 表記を合わせる

src オプション利用時は、インデントの数も合わせる必要があります。詳細は以下の記事を参照してください。

https://tekunabe.hatenablog.jp/entry/2018/12/22/ansible_ios_config_src_needs_indents

なお、このように表記を合わせても、changed の場合は警告自体は表示されます。Ansibleとしては「changed になったけど意図通りですか?冪等性保つためにこうしてくださいね」という親切心からの警告なのだと思います。

どうしても警告を非表示したいときは、ansible.cfg[defaults] セクションで action_warnings=False を指定するという対策もありますが、他の警告も無効にしてしまうので注意が必要です。

駄目なパターン

だめな例1: 省略表記にしてしまっている

- name: ios_config test
  cisco.ios.ios_config:
    lines:
      - description kingyo
    parents:
      - iint Gi0/0    # 表記があってない

だめな例2: 小文字になってしまっている

- name: ios_config test
  cisco.ios.ios_config:
    lines:
      - description kingyo
    parents:
      - interface gigabitethernet0/0    # 表記があってない

だめな例3: スペースが入ってしまっている

- name: ios_config test
  cisco.ios.ios_config:
    lines:
      - description kingyo
    parents:
      - interface GigabitEthernet 0/0    # 表記があってない

だめな例4: lines で省略表記にしてしまっている

事情は lines オプションでも同様です。

- name: ios_config test
  cisco.ios.ios_config:
    lines:
      - desc kingyo  # ここがあっていない
    parents:
      - interface GigabitEthernet0/0    # ここはあってても

ほか、デフォルトのコンフィグを投入する場合も注意が必要です。たとえば、no shutdown がデフォルトな機器に対して no shutdown を実行するのも、やはり毎回 changed になってしまいます。show running-config 上に no shutdown がデフォルトのため存在しなく、Ansible が投入が必要だと判断するためです。この場合については、cisco.ios.ios_interfacesモジュールの enabled オプションで制御するほうが良いです。毎回 changed にならない仕様になってます。

参考: 専用モジュールだと

本警告はあくまでも cisco.ios.ios_config モジュールによるものです。

ここまでの例で出した、インターフェースの description の設定であれば、インターフェースの基本設定の専用モジュール cisco.ios.ios_interfacesでもできます。cisco.ios.ios_interfaces モジュールの場合は、以下のようにインターフェース名が show running-config の表記とあっていなくても、冪等性が担保されます。内部でノーマライズされるようです。

- name: ios_interfaces test
  cisco.ios.ios_interfaces:
    config:
      - name: Gi 0/0  # 省略してる上にスペースが余分
        description: kingyo

ただ、省略の仕方にはばらつきがあるので、やはりshow running-config と合わせるほうが丁寧で良いかなと思います。

おわりに

手動の場合は、省略形のまま実行したり、大文字小文字も気にせずコマンドを実行することも多いと思います。

本モジュール利用時は、手癖や習慣にとらわれず、実機を確認するのが良さそうです。

[Ansible] ansible 6.0.0 で ansible-community コマンドが追加された

少しややこしい ansible まわりのバージョン表記

ansible 2.10 から、ansible-base(2.10)や、ansible-core(2.11から)というコア部分のパッケージと、各種コレクションも含むパッケージ(Ansible community packageと呼ばれたりします)が登場しました。

pip install ansible-core でコア部分、pip isntall ansible でパッケージ含むものがインストールされます。少しややこしいのが、それぞれのパッケージごとにバージョン体系が異なる点です。たとえば、以下のようなバージョンの対応です。

ansible-core ansible
2.11 4
2.12 5
2.13 6

そして、ansible --version の出力は ansible-core としてのバージョンです。つまり、たとえば pip install ansible==6.0.0 でインストールすると、ansible --version の結果は 2.13 系になります。

ansible としてのバージョンは、pip list で確認できます。

$ pip list
Package      Version
------------ -------
ansible      6.0.0
ansible-core 2.13.1

ansible-community --versionansible としてのバージョンが表示される

ansible 6 で、ansible-community コマンドが追加されました。現状、実質 --version オプションしかありません。

$ ansible-community -h
usage: ansible-community [-h] [--version]

optional arguments:
  -h, --help  show this help message and exit
  --version   show the version of the Ansible community package

ansible-community --version で Ansible community package のバージョンを表示するとこんな感じになります。

$ ansible-community --version
Ansible community version 6.0.0

ちなみに、ansible-community コマンド中身を調べるとこうなってました。

$ which ansible-community
/home/ansible/envs/a6/bin/ansible-community
$ cat /home/ansible/envs/a6/bin/ansible-community
#!/home/ansible/envs/a6/bin/python3.9
# -*- coding: utf-8 -*-
import re
import sys
from ansible_collections.ansible_community import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

Interop Tokyo 2022 に参加してきました

はじめに

2022/06/15-17(現地展示期間として)に開催されたInterop Tokyo 2022に参加してきました。

毎年のネットワークのお祭り的な位置づけとして、毎年楽しみにしています。去年と比べて来場者数はだいぶ増えたようです。

今年も ShowNet のさまざまな機器や、気になるブースがありましたので、いくつかまとめます。

■ ShowNet

今回ははじめてShowNet のウォーキングツアーに参加しました。一人で眺めてるだけでは理解できないものや、そもそも目が行き届かないところも知ることができて、大変有意義でした。

気になったもの、言葉をピックアップします。

総帯域 1.02T !!

想像ができないレベルです。半端な分は構築用の10Gの 2本だそう。

総帯域1.02T

SRv6

今回は IPv6 のリンクローカルアドレスだけでバックボーンのルーティングをされていたようです。

明示的なアドレス設定もしていなかったようです。「設定」が不要ということは「設計」も不要ということなのだと思います。

www.geekpage.jp

マイクロ SID

SRv6 自体に詳しくないのですが、SIDを小さくした仕様のもので相互接続の検証をしていたようです。

uSID検証

HDMIケーブルが直接刺さる?

詳細聞きそびれてしまいましたが、ネットワーク機器にHDMIケーブルが刺さっているという不思議な状態のものがありました。

LCユニブーツコネクタ

すごいですね・・。サーバー、インスタンスだけでなく、物理パーツの高密度化も進んでいるようです。

物理の高密度化

わちゃわちゃ

光回線切り替えロボット ROME mini

光回線の切り替えロボットの小型版。

実際動いているところは見れませんでしたが、物理的にがちゃがちゃうごくのでしょうか。 もしかして気づいてないけど動いてたのかも知れません。

ROME mini

接続図

SmartCS の REST API

プレスリリースされたばかりの機能が、早速使われているようです。

コンソールサーバーSmartSC の REST API

PTP

NTPより精度が高いという程度しか知らず、具体的にどのようなケースで有効なのかわからない状態でした。

5G基地局はマイクロ秒レベルの同期が必要だそうで、ユースケースの一つのようです。

何に使われるの?が知れるのはありがたいです。

15:00:00 ちょうどなのは偶然です

PTP

■ 各社ブース

いくつかブースやセミナーにお邪魔しました。

ラクサラネットワークスさん

https://f2ff.jp/2022/interop/exhibitor/show.php?id=1097&lang=ja

AX-Network-Manager(AX-NM)」という、ネットワーク機器の運用管理ソフトのご説明をしていただきました。

各ネットワーク機器の情報を収集してWebが画面上でかんたんに確認できたり、テンプレートを使った設定の流し込み機能があるそうです。

参照系の機能についてはマルチベンダ対応で、Ciscoの機器からSNMP経由で取得した情報の画面を見れました。

各種管理情報を手動でドキュメントで管理する場合、うまく管理しないと実機とドキュメントで整合性が取れなくなってしまうことがあります。このソフトウェアのように、実機から情報を取得してくれると実機を都度見に行かなくてもいいので、管理やトラブルシューティングもしやすいかなと思いました。

情報をエクスポートする機能もあるそうです。

オンプレミス版もクラウド版もあるとのことなので、環境に適したものを選べますね。

印象的だったのは、裏でAnsibleのPlaybookを実行できる点です。組み込みのPlaybookの他、カスタムのPlaybookも仕込めてそうです。

後で調べてみると、データーシートのPDFに「2.1.18 スクリプト設定」という項目があり、Playbookが利用できる旨の記載がありました。

セイコーソリューションズさん

https://f2ff.jp/2022/interop/exhibitor/show.php?id=1197&lang=ja

事前に情報をチェックしたいましたが、コンソールサーバー SmartCS が REST API に対応したとのことです。

これまでも Ansible 対応によって他システムとの連携が図られてきましが、汎用的に呼び出せる REST API に対応したことで、さらに連携がしやすくなったのだと思います。

たとえば、作業端末が Windows の場合でも PowerShell から自動化できそうです。

本ブースでは、ご縁がありまして「SmartCSとAnsibleで広がるネットワーク自動化の可能性」というタイトルの収録動画を流していただきました。ありがとうございます。

資料は以下にアップしてあります。

www.docswell.com

ジュニパーネットワークスさん

Apstra に興味があったので、『DCネットワークで悩んでいませんか?マルチベンダ対応の「Juniper Apstra」が提供する自動化以上の価値』という展示会場内セミナーに参加させていただきました。

意図した情報をシステムに定義して、デバイスにあった形のコンフィグを生成・設定し、その後も意図通りであるかを継続的に診断する仕組み。

定義と実態があっていないと、定義が信頼できないものになってしまうので、実態とあっているかどうかチェックできるのは心強いですね。通常の監視ではな見ない、例えばルーティングテーブルもチェックできるようです。

コンフィグはJuniperによって保証されたコンフィグが生成されるようで、ユーザーとしては細かいところを気にしなくても良いメリットもありそうでした。

EVPN/VXLANによるIPファブリックのDCネットワークアーキテクチャに特化しているようで、ニーズにハマると良さそうだなと思いました。

もともとはJuniper製品でなかった経緯もあってか、マルチベンダー対応(Juniper、Cisco、Arista、SONiC)なところも特徴です。

導入事例 https://www.slideshare.net/techblogyahoo/yjtc18-a1

Juniper vLabs(Apstra を含むオンラインラボ) https://jlabs.juniper.net/vlabs/

古河電気工業さん

https://f2ff.jp/2022/interop/exhibitor/show.php?id=1167&lang=ja

FITELnet F シリーズのアーキテクチャーを説明していただきました。CPU のコアが4つあり、2つはルータOS用、残り2つで Linux コンテナを動かせるそうです。

ルータOSとコンテナの連携機能もあるようで、活用するにはアイディア勝負になるかなと思います。

ヤマハさん

https://f2ff.jp/2022/interop/exhibitor/show.php?id=1078&lang=ja

今年の秋発売予定で SFP+ スロット搭載の RTX1300 を見に行きました。

関連記事: https://cloud.watch.impress.co.jp/docs/event/1417401.html

注目度は高かったようで人がよく集まっていました。

このシリーズはこれまでファンレスでしたが、いよいよファンが付くようです。

エーピーコミュニケーションズ(弊社)

https://f2ff.jp/2022/interop/exhibitor/show.php?id=1030&lang=ja

弊社のブースでは、ネットワーク自動化のサービスや、ネットワークテスト自動化プロダクト NEEDLEWORK をご紹介していました。

ネットワーク自動化のほうでは、Ansible と SmartCS と Juniper SRX を使ったデモ環境をご用意しました。たくさんの方にお越しいただき、ありがとうございました。


おわりに

物理的に色々見れたりお話がきけるというのは、やはり良いものだなと思いました。

展示やセミナーで説明いただいたみなさん、ShowNet STM、NOC 各スタッフのみなさまありがとうございました。

関連ツイート

[ansible] copy や template モジュールで相対パスが指定されたらどこを探すか

Ansibleもくもく会 2022.6に参加しました。

そこで、copy モジュールの src オプションで相対パスで指定されたファイルはどこから探してくるか、という話題がありました。

files ディレクトリを先に探しに行くことは知っていたのですが、細かく公式ドキュメントでまとまっているページを知りませんでした。

Q&Aのやり取りの中で、まとまってるページを知りました。

docs.ansible.com

ロールでの話なら載っているページを知っていたのですが、多分今回初めてみました。

メンターとして参加したのですが、外の方の質問により新しいことを知れました。

質問いただいた方も、回答いただいた方もありがとうございます。

参考

gom.hatenablog.com

[Ansible] Automation Controller に適用したライセンス情報をAPIで削除する

はじめに

Automation Controller にライセンスを適用するモジュール ansible.controller.license も動作確認するときに、一度適用したライセンス情報を削除したいことがありました。ですが、モジュールでも画面の操作でも削除はできなさそうでした。

一方、APIリファレンスを見てみると、/api/v2/config というエンドポイントがあり、これを GET するとライセンス情報が見れます。これに対して DELETE する方法を試しました。

環境: Automation Controller 4.1.0

おためし

$ curl -X DELETE https://localhost/api/v2/config/ -u admin -k
Enter host password for user 'admin':
$

この後、再度ログインすると、ダッシュボード画面ではなく、ライセンスを投入する画面になりました。

ライセンス情報が削除された

[2022/06/21 追記]

このブログを見てくださった方が、awx.awx. license モジュールに該当機能を追加するPRを出してくださいました。state: absent とするようです。

t.co