てくなべ (tekunabe)

ansible / network automation / 学習メモ

[ansible] ansible 関連のリリース情報まとめRSS(ansible、molecule、各種コレクションなど)

はじめに

Ansible のニュースレターである The Bullhorn の Issue #34で知ったのですが、ansible や molecule、それから各種コレクション(おそらくansible community package内)のリリース情報をまとめて取得できる RSS フィードがあります。

特にコレクションについては、各リポジトリにリリース情報を追っていくのも大変なので、ひとつにまとまった RSS フィードがあるのはとても助かります。

フィード

こちらから

rss.community.eng.ansible.com

[AWS] サイト間VPNの設定がどの段階で課金されるのか調べた

はじめに

サイト間 VPN の設定をした時に、どのタイミングで料金が発生するのか、分からなかったので調べました。

結果としては、対向のVPN装置のとのトンネル状態にかかわらず、AWS側のサイト間VPNの設定をした段階のようです。

AWS VPN の料金

https://aws.amazon.com/jp/vpn/pricing/

AWS サイト間 VPN 接続では、接続がアクティブな時間ごとに 1 時間単位で課金されます。

「接続がアクティブ」というのが、AWS上で設定した段階で課金されるのか、それとも対向 VPN 機器とのトンネルがアップした状態なのか分からなかったので、もう少し調べました。

VPN 接続の作成画面

そういえば、VPN 接続の作成画面の下の方には以下の記述があります。

f:id:akira6592:20210930184913p:plain
このステップを完了すると、VPN 接続料金が発生します。

なので、これを作った時点で、トンネルのアップやダウンとは関係なく課金されるのだろうと予想しました。

もう少し調べることにします。

FAQ

FAQ には少し違う表現の記述がありました。

https://aws.amazon.com/jp/vpn/faqs/?nc1=h_ls

VPN 接続時間によるご請求は、VPN 接続が「利用可能」状態であった時間に対して発生します。

「利用可能」というのは VPN 接続の画面の「状態」欄でしょうか。

日本語の画面では「利用可能」ではなく「使用可能」となっていました。

f:id:akira6592:20210930185001p:plain
「使用」可能

念のため、英語のFAQを確認すると available とありました。 https://aws.amazon.com/vpn/faqs/?nc1=h_ls

VPN connection-hours are billed for any time your VPN connections are in the "available" state.

画面も英語にしたところ stateavailable となっていました。どうやらこの状態で課金ということのようです。

f:id:akira6592:20210930185139p:plain
available

おためし

たまたま

という状態で数カ月放置していたアカウントがあり、9月にサイト間のVPN接続を設定しました。対向のVPN装置は未設定です。

f:id:akira6592:20210930185223p:plain
課金された

すると想定通り課金されました。

[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構成