てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Ansible 2.9 で インストールしたcollection のバージョン一覧を表示する(jq利用)

はじめに

Ansible 2.9 には ansible-galaxy collection list のような、コレクションの一覧を表示するコマンドがありません。

おそらく、各コレクションの MANIFEST.jsonversion を見るしかないかと思います。

  • 例: ansible.utils 2.4.0 の MANIFEST.json
{
 "collection_info": {
  "namespace": "ansible",
  "name": "utils",
  "version": "2.4.0",
...(略)...
}

いくつもコレクションをインストールしている状態ですと、ひとつずつ見るのも手間です。

jq を使ってそれらしく一覧を表示できるコマンドのサンプルをメモしておきます。

動作確認環境: ansible 2.9.25

コマンド

jq '.collection_info | .namespace + "." + .name + ": " + .version' ~/.ansible/collections/ansible_collections/*/*/MANIFEST.json 

コレクションのインストール先は、デフォルトの ~/.ansible/collections/ を想定しています。

実行例

$ jq '.collection_info | .namespace + "." + .name + ": " + .version' ~/.ansible/collections/ansible_collections/*/*/MANIFEST.json 
"ansible.netcommon: 2.4.0"
"ansible.utils: 2.4.0"
"cisco.ios: 2.4.0"
"netbox.netbox: 3.1.1"
"yamaha_network.rtx: 1.0.1"

表示形式はお好みで・・

補足

ansible-config dumpCOLLECTIONS_PATHS の設定拾って、そのディレクトリを対象にするのがもっといいやり方かなと思います。今回は手抜きです。

$ ansible-config dump | grep COLLECTIONS_PATHS
COLLECTIONS_PATHS(default) = ['/home/codespace/.ansible/collections', '/usr/share/ansible/collections']

[Ansible] 設定項目やディレクティブ、コマンドのプションなどの索引ページ

f:id:akira6592:20210607202754p:plain

たまたま見つけたのですが、Ansible の公式ドキュメント上に、設定項目やディレクティブ、コマンドのプションなどの索引ページがあることを知りました。

docs.ansible.com

ざっと見てみて「こんなのあったっけ?」という新発見につながったりしそうな気がしました。

[VS Code] アクティブなエディターのタブの背景色を変える tab.activeBackground

はじめに

VS Code のエディター部分でファイルを開くとタブ表示になりますが、いまアクティブ(開いている)なタブどれなのか色的に少しわかりにくなと感じていました。

アクティブなタブの背景色を変える方法を Twitter で教えていただいた(ありがとうございます!)のでこちらにも共有します。

変更前

私の環境では以下のような表示です。この場合 jmespath.yml がアクティブです。 これをもう少し際立たせたいと思います。

f:id:akira6592:20210523133631p:plain
どれを開いてるのかわかりにくかった

変更

setting.jsonworkbench.colorCustomizations 内で tab.activeBackground で背景色を指定します。

私の設定例

{
    "workbench.colorCustomizations": {
        "tab.activeBackground": "#666666cc",
    },
   // ...(略)...
}

色はお好みで変更してください。

変更後

こんな感じになります。

f:id:akira6592:20210523133556p:plain
アクティブなタブの背景色を薄くした

選ぶ様子。

他、workbench.colorCustomizations 配下の現在の設定を書き出すこともできるようです。おしえていただきありがとうございます。

ip コマンドの -j オプションで JSON 出力する

はじめに

コマンドの出力結果を機械的に抽出や加工したい場合、JSONなどの構造化データだと正規表現を書くことをぐっと減らせて便利です。

たまたま ip コマンドは -j または --json というオプションで json 出力できることを知りました。

-p オプションを併用すると、改行付きで表示されて見やすいです。

試した結果をまとめます。

IP アドレスの表示

(一部ダミーの値にしています)

JSON 出力

$ ip -j -p addr
[ {
        "ifindex": 1,
        "ifname": "lo",
        "flags": [ "LOOPBACK","UP","LOWER_UP" ],
        "mtu": 65536,
        "qdisc": "noqueue",
        "operstate": "UNKNOWN",
        "group": "default",
        "txqlen": 1000,
        "link_type": "loopback",
        "address": "00:00:00:00:00:00",
        "broadcast": "00:00:00:00:00:00",
        "addr_info": [ {
                "family": "inet",
                "local": "127.0.0.1",
                "prefixlen": 8,
                "scope": "host",
                "label": "lo",
                "valid_life_time": 4294967295,
                "preferred_life_time": 4294967295
            },{
                "family": "inet6",
                "local": "::1",
                "prefixlen": 128,
                "scope": "host",
                "valid_life_time": 4294967295,
                "preferred_life_time": 4294967295
            } ]
    },{
        "ifindex": 2,
        "ifname": "ens192",
        "flags": [ "BROADCAST","MULTICAST","UP","LOWER_UP" ],
        "mtu": 1500,
        "qdisc": "fq_codel",
        "operstate": "UP",
        "group": "default",
        "txqlen": 1000,
        "link_type": "ether",
        "address": "00:50:56:xx:xx:xx",
        "broadcast": "ff:ff:ff:ff:ff:ff",
        "addr_info": [ {
                "family": "inet",
                "local": "192.168.1.100",
                "prefixlen": 24,
                "broadcast": "192.168.1.255",
                "scope": "global",
                "dynamic": true,
                "noprefixroute": true,
                "label": "ens192",
                "valid_life_time": 67514,
                "preferred_life_time": 67514
            },{
                "family": "inet6",
                "local": "2001:db8::1",
                "prefixlen": 64,
                "scope": "global",
                "dynamic": true,
                "noprefixroute": true,
                "valid_life_time": 2591817,
                "preferred_life_time": 604617
            },{
                "family": "inet6",
                "local": "fe80::5686:4062:1:1",
                "prefixlen": 64,
                "scope": "link",
                "noprefixroute": true,
                "valid_life_time": 4294967295,
                "preferred_life_time": 4294967295
            } ]
    },{
        "ifindex": 3,
        "ifname": "virbr0",
        "flags": [ "NO-CARRIER","BROADCAST","MULTICAST","UP" ],
        "mtu": 1500,
        "qdisc": "noqueue",
        "operstate": "DOWN",
        "group": "default",
        "txqlen": 1000,
        "link_type": "ether",
        "address": "52:54:00:xx:xx:xx",
        "broadcast": "ff:ff:ff:ff:ff:ff",
        "addr_info": [ {
                "family": "inet",
                "local": "192.168.122.1",
                "prefixlen": 24,
                "broadcast": "192.168.122.255",
                "scope": "global",
                "label": "virbr0",
                "valid_life_time": 4294967295,
                "preferred_life_time": 4294967295
            } ]
    },{
        "ifindex": 4,
        "ifname": "virbr0-nic",
        "flags": [ "BROADCAST","MULTICAST" ],
        "mtu": 1500,
        "qdisc": "fq_codel",
        "master": "virbr0",
        "operstate": "DOWN",
        "group": "default",
        "txqlen": 1000,
        "link_type": "ether",
        "address": "52:54:00:xx:xx:xx",
        "broadcast": "ff:ff:ff:ff:ff:ff",
        "addr_info": [ ]
    } ]

通常出力(比較用)

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute ens192
       valid_lft 67528sec preferred_lft 67528sec
    inet6 2001:db8::1/64 scope global dynamic noprefixroute 
       valid_lft 2591832sec preferred_lft 604632sec
    inet6 fe80::5686:4062:1:1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:xx:xx:xx brd ff:ff:ff:ff:ff:ff

ルーティングテープルの表示

JSON 出力

$ ip -j -p route
[ {
        "dst": "default",
        "gateway": "192.168.1.1",
        "dev": "ens192",
        "protocol": "dhcp",
        "metric": 100,
        "flags": [ ]
    },{
        "dst": "192.168.1.0/24",
        "dev": "ens192",
        "protocol": "kernel",
        "scope": "link",
        "prefsrc": "192.168.1.100",
        "metric": 100,
        "flags": [ ]
    },{
        "dst": "192.168.122.0/24",
        "dev": "virbr0",
        "protocol": "kernel",
        "scope": "link",
        "prefsrc": "192.168.122.1",
        "flags": [ "linkdown" ]
    } ]

通常出力(比較用)

$ ip route
default via 192.168.1.1 dev ens192 proto dhcp metric 100 
192.168.1.0/24 dev ens192 proto kernel scope link src 192.168.1.100 metric 100 
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown 

おわりに

他のコマンド、ツールも意外と標準でJSON出力できるということもありそうです。

今一度ヘルプを見るといいかもしれません。

参考

標準機能ではないですが、主要コマンドのパーサーとして jc というものもあります。

github.com

[Ansible] 「つまずき Ansible 【Part34】ansible-core 2.11.0 の changelog を眺める」ふりかえり

はじめに

2021/05/01 に、YouTube Live で「つまずき Ansible 【Part34】ansible-core 2.11.0 の changelog を眺める」という配信をしました。

connpass.com

今回は、先日リリースされた ansible-core 2.11.0 の changelog の中で個人的に気になったところをピックアップしました。

changelog

https://github.com/ansible/ansible/blob/stable-2.11/changelogs/CHANGELOG-v2.11.rst#v2-11-0


動画

youtu.be

※21:41 頃の「複数の collection で、routing 先が変更」のとき「ansible-core のコアの話というより ansible 4 の話」と言っていますが、lib/ansible/config/ansible_builtin_runtime.yml の修正なので ansible-core の話です。失礼しました。

ansible-core 2.11.x の位置づけ

スクラップからいろいろ

ベータ段階からたまに changelog を見ていたので、都度メモっておいた Zenn のスクラップをベースにお話しました。

zenn.dev

(個人的にはこのような使い方にスクラップがマッチしていました)


Part35にむけて

以下のネタを検討中です。気が向いたものをやります。 connpass申込時のアンケートでいただいたものも含めています。

  • connection: local ななにか
  • Windows
  • cli_parse モジュール(Part15 の続き)
  • モジュールのテスト
  • Tower / AWX
  • role と Playbook のリポジトリ分割と読み込み
  • AWXとの共存を念頭に入れたDirectory構成

[Ansible] 親サブネットから利用可能な子サブネットを求める ipsubnet フィルター

はじめに

Ansible には、IP アドレスを扱うための様々なフィルターがあります。

docs.ansible.com

その中に ipsubnet というフィルターがあります。

このフィルターにはいくつか機能があり、例えば「10.0.0.0/24」内で /25 で区切ったときの N 番目のサブネットは何か求められます。

この記事では簡単な例でご紹介します。

  • 動作確認環境
    • Ansible 2.9.19

書式

 ipsubnet(親サブネット, 何番目) 

サンプルPlaybook

サンプルのPlaybookと出力例をコメントで記載します。

---
- hosts: localhost
  gather_facts: false

  tasks:
    - name: subnet manipulation
      debug:
        msg:
          # 以下は /24 の最初を求めるので "10.0.0.0/24"
          - "{{ '10.0.0.0/24' | ipsubnet(24, 0) }}"
          # 以下は /25 の最初を求めるので "10.0.0.0/25"
          - "{{ '10.0.0.0/24' | ipsubnet(25, 0) }}"
          # 以下は /25 のインデックス1を求めるので "10.0.0.128/25"
          - "{{ '10.0.0.0/24' | ipsubnet(25, 1) }}"
          # 以下は /25 のインデックス2を求めるので false、つまり範囲外
          - "{{ '10.0.0.0/24' | ipsubnet(25, 2) }}"
          # 以下は /25 を求めるので 10.0.0.240/28
          - "{{ '10.0.0.0/24' | ipsubnet(28, -1) }}"

おわりに

自前で計算しようとすると以外と手間な気がするので、このようなフィルターがあるのは助かります。

カラビナでラックのケーブルを整線する

はじめに

自宅にいくつかネットワーク機器があり、家具であるメタルラックを利用しています。

だんだんとケーブルの本数も増えてくると、きれいに整線したくなってきます。

データセンターのようなきちんとした場所であれば、ケーブルマネジメントのような専用の部品を使うところです。

www.panduit.com

ですが、ここは一般的な自宅です。本格的なものほどではなくとも、それなりにできないかと考えています。

100円ショップをふらついているときにふと目にはいったカラビナが使えるのではと思い、試してみました。思いの外よい感じでしたのでご紹介します。

カラビナケーブリング

こんな感じです。

f:id:akira6592:20210425111905p:plain
ケーブルを下に流す

f:id:akira6592:20210425112306p:plain
上に流す
かんたんにケーブルを着脱でき、ほどよい束ね感もあります。これは 2個で100円のものです。

サイズは少し余裕を持ったもののほうが良いかもしれません。


■ その他の方法

カラビナ以外の方法を比較のためにご紹介します。

面ファスナー

こちらは別の用途でよく使っていますが、リング状にすると同じようにケーブルを整線できます。

f:id:akira6592:20210425111955p:plain
面ファスナー
安上がりなのが一番のメリットでしょうか。

着脱の際、剥がしたりくっつけたりするのが少し手間なのと、他のケーブルが一緒にとれてしまわないよう、少し気をつける必要があります。

カードリンク

カードリンク(単語帳などを束ねるもの)も良さそうです。@ipv6labsさん、ご紹介ありがとうございます。

f:id:akira6592:20210425113609p:plain
カードリンク

手元には直径3cm位のものしかありませんでしたが、もう少し大きいものがいいかもしれません。安上がりなのと、見た目がスッキリしてるのがいいですね。

S字フック

これは少し辛いです。着脱は楽ですが、その分つられて他のケーブルが脱線しやすいです。

f:id:akira6592:20210425112038p:plain
S字フック
また、写真のようにケーブルを下に流す分にはまだいいのですが、上に流すときには使えません、

比較

主観による比較です。

方法 着脱のしやすさ  ホールド感 コスパ 見た目のスッキリ感
カラビナ
面ファスナー
カードリンク
S字フック

あれ、あとから教えていただいた、カードリンクが結構よい・・・?