てくなべ (tekunabe)

ansible / network / automation

[Ansible] 「つまずき Ansible 【Part10】インベントリーのあれこれ」ふりかえり

はじめに

2020/07/11 に、YouTube Live で「つまずき Ansible 【Part10】インベントリーのあれこれ」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。

tekunabe.connpass.com

今回は、インベントリ関する TIPS 的なことをご紹介しました。

やったことや、わかったこと(つまずいたエラーと原因、対処など)をふりかえります。

動画

youtu.be


■ やったこと

ansible-inventory によるインベントリ確認

ansible-inventory コマンドはインベントリの確認するのにとても便利。

--graph オプションで親子関係の確認

$ ansible-inventory -i inventory.ini --graph
@all:
  |--@eos:
  |  |--eos1
  |--@ios:
  |  |--rt01
  |  |--rt02
  |--@junos:
  |  |--vsrx1
  |--@ungrouped:

--list オプションで変数などの確認

$ ansible-inventory -i inventory.ini --list 
{
    "_meta": {
        "hostvars": {
            "eos1": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_password": "secret",
                "ansible_connection": "httpapi",
                "ansible_host": "192.168.1.133",
                "ansible_httpapi_port": 5080,
                "ansible_network_os": "eos",
                "ansible_password": "xxxx",
                "ansible_user": "ansible"
            },
            "rt01": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_password": "secret",
                "ansible_connection": "network_cli",
                "ansible_host": "192.168.1.11",
                "ansible_network_os": "ios",
                "ansible_password": "xxxx",
                "ansible_user": "admin"
            },
            "rt02": {
                "ansible_become": true,
                "ansible_become_method": "enable",
                "ansible_become_password": "secret",
                "ansible_connection": "network_cli",
                "ansible_host": "192.168.1.12",
                "ansible_network_os": "ios",
                "ansible_password": "xxxx",
                "ansible_user": "admin"
            },
            "vsrx1": {
                "ansible_connection": "network_cli",
                "ansible_network_os": "junos",
                "ansible_password": "xxxx",
                "ansible_port": 33003,
                "ansible_user": "ansible"
            }
        }
    },
    "all": {
        "children": [
            "eos",
            "ios",
            "junos",
            "ungrouped"
        ]
    },
    "eos": {
        "hosts": [
            "eos1"
        ]
    },
    "ios": {
        "hosts": [
            "rt01",
            "rt02"
        ]
    },
    "junos": {
        "hosts": [
            "vsrx1"
        ]
    }
}

ini ファイルに定義する変数

bool 値の注意

ini の true は文字扱い

rt01 ansible_host=192.168.1.11 testvar=true
$ ansible-inventory -i inventory.ini --host rt01
{
    // 略
    "testvar": "true"
}
  • ini の Truebool 扱い
rt01 ansible_host=192.168.1.11 testvar=True
$ ansible-inventory -i inventory.ini --host rt01
{
    // 略
    "testvar": true   
}

参考

インベントリを yaml で書く

世の中のインベントリファイルのサンプルは ini が多いが、YAML でも書ける。

参考

また、ansible-inventory--list-y をあわせて実行すると、既存のインベントリファイルを YAML 形式で表示でき、書きっぷりを参考にできる。

$ ansible-inventory -i inventory.ini --list -y
all:
  children:
    eos:
      hosts:
        eos1:
          ansible_become: true
          ansible_become_method: enable
          ansible_become_password: secret
          ansible_connection: httpapi
          ansible_host: 192.168.1.133
          ansible_httpapi_port: 5080
          ansible_network_os: eos
          ansible_password: xxxx
          ansible_user: ansible
    ios:
      hosts:
        rt01:
          ansible_become: true
          ansible_become_method: enable
          ansible_become_password: secret
          ansible_connection: network_cli
          ansible_host: 192.168.1.11
          ansible_network_os: ios
          ansible_password: xxxx
          ansible_user: admin
          testvar: true
        rt02:
          ansible_become: true
          ansible_become_method: enable
          ansible_become_password: secret
          ansible_connection: network_cli
          ansible_host: 192.168.1.12
          ansible_network_os: ios
          ansible_password: xxxx
          ansible_user: admin
    junos:
      hosts:
        vsrx1:
          ansible_connection: network_cli
          ansible_network_os: junos
          ansible_password: xxxx
          ansible_port: 33003
          ansible_user: ansible
    ungrouped: {}

ファイル不要なインベントリ

host_list inventory pluginによる機能。

ファイルを作るまでもない時に便利。個人的には -i localhost, をよく利用。1つの場合は、末尾に , が必要。

複数のインベントリファイルを読み込む

-i オプションを複数指定する

$ ansible-inventory -i inventory.ini -i inventory2.ini --list 

-i オプションでディレクトリを指定する

$ ansible-inventory -i inventories --list

ただし、ディレクトリ指定の場合は .ini 拡張子のファイルは読み込まないので注意。

参考

外部システムをインベントリとして利用

Ansible は他システムの情報を取得して、動的なインベントリとして利用できる機能がある。Inventory Plugin を切り替えて利用する。

Inventory Plugins — Ansible Documentation

Netbox

NetBox は、OSSの IPAM/DCIM ツール。

f:id:akira6592:20200711211736p:plain
Device 一覧、これをAnsibleのインベントリとして利用できる
netbox inventory plugin を利用する以下の yaml を定義。

  • netbox.yml
---
plugin: netbox
api_endpoint: http://netbox01
token: 0123456789abcdef0123456789abcdef01234567
group_by:
  - manufacturers   # グループ化方法

-i オプションに上記の yaml ファイルを指定する。

$ ansible-inventory -i netbox.yml --list
{
    "_meta": {
        "hostvars": {
            "rt01": {
                "ansible_connection": "network_cli",
                "ansible_host": "192.168.1.11",
                "ansible_network_os": "ios",
                "ansible_password": "xxxx",
                "ansible_user": "admin",
                "device_roles": [
                    "core"
                ],
                "device_types": [
                    "calalyst"
                ],
                "manufacturers": [
                    "cisco"
                ],
                "primary_ip4": "192.168.1.11",
                "sites": [
                    "my_site"
                ]
            },
            "rt02": {
                "ansible_connection": "network_cli",
                "ansible_host": "192.168.1.12",
                "ansible_network_os": "ios",
                "ansible_password": "xxxx",
                "ansible_user": "admin",
                "device_roles": [
                    "core"
                ],
                "device_types": [
                    "calalyst"
                ],
                "manufacturers": [
                    "cisco"
                ],
                "primary_ip4": "192.168.1.12",
                "sites": [
                    "my_site"
                ]
            }
        }
    },
    "all": {
        "children": [
            "manufacturers_cisco",
            "ungrouped"
        ]
    },
    "manufacturers_cisco": {
        "hosts": [
            "rt01",
            "rt02"
        ]
    }
}

もちろん ansible-playbook-i オプションにも指定できる。

参考


■ わかったこと (出会ったエラーと原因と対処)

今回は解説がメインだったため、これといったつまずきはありませんでした。 しいて言えばコマンドのオプションのつけ忘れでしょうか・・。

むしろいただいたフィードバックをから「なるほど!」と思いました。

他、ansible-inventory コマンド自体を今回始めて知った方もいらっしゃったので、ご紹介できてよかったです。


Part11 にむけて

以下のネタを検討中です。気が向いたものをやります。

  • connection: local ななにか
  • Ansible Toewr / AWX をコマンドがら操作する
  • ansible.cfg
  • Jinja2、フィルター
  • Windows
  • ESXi で VM作成

第10世代 Intel NUC への ESXi 7.0b のインストールと初期設定

先日購入したIntel NUC の NUC10I7FNH に、ESXi 7.0b をインストールしました。自分が行った手順を作業記録としてまとます。

【目次】


■ カスタムイメージの作成(ESXi 7.0b + NIC ドライバ)

NUC に ESXi をインストールするには、NICのドライバを追加したカスタムイメージが必要ということは事前に聞いていました。対応ドライバがないと、インストール序盤で NIC がないというエラーになるためです。

当初は ESXi 7.0 (bなし)ベースの、以下のページを参考にしてカスタムイメージを作成しようとしました。

www.virten.net

一回お試してやってみて、この手順でもできたことはできたのですが、VMware 製品に詳しい方からこんな情報をいただきました。

Nested ESXi というものをやる予定もなかったのですが、せっかくなので、紹介していただいた記事の「Option B: Image Builder using PowerCLI」を参考に、 ESXi 7.0b + NICドライバでカスタムイメージを作成することにします。

資材のダウンロード

ESXi 7.0b patch Offline Bundle (VMware-ESXi-7.0b-16324942-depot.zip) をダウンロードします。

f:id:akira6592:20200711103221p:plain:w400
b がついてます

続いて、 ESXi 7.0b patch Offline Bundle (VMware-ESXi-7.0b-16324942-depot.zip)をダウンロードします。

PowerCLI のインストール

私の環境では、PowerCLI が未インストールでしたので、インストールします。

管理権限で PowerShell を開き、以下のコマンドを実行します。

Install-Module -Name VMware.PowerCLI -Scope CurrentUser

イメージの作成

引き続き、PowerShell のターミナルでの作業です。前述の 2ファイルをダウンロードしたディレクトリに移動し、以下のコマンドを実行します。

$esxiOfflineBundle = "VMware-ESXi-7.0b-16324942-depot.zip"
$intelNicOfflineBundle = "ESXi670-NE1000-32543355-offline_bundle-15486963.zip"
$esxiImageProfileName = "ESXi-7.0b-16324942-standard"
$newImageProfileName = "ESXi-7.0b-IntelNUC10"
Add-EsxSoftwareDepot $esxiOfflineBundle
Add-EsxSoftwareDepot $intelNicOfflineBundle

$IntelNUCVib = Get-EsxSoftwarePackage | where {$_.name -eq "ne1000" -and $_.version -eq "0.8.4-3vmw.670.3.99.32543355"}
New-EsxImageProfile -CloneProfile $esxiImageProfileName -Name $newImageProfileName -Vendor vGhetto
Remove-EsxSoftwarePackage -ImageProfile $newImageProfileName -SoftwarePackage ne1000
Add-EsxSoftwarePackage -ImageProfile $newImageProfileName -SoftwarePackage $IntelNUCVib

Export-EsxImageProfile -ImageProfile $newImageProfileName -ExportToIso -FilePath "ESXi-7.0b-IntelNUC.iso"

実行ログ

PS C:\Users\sakana\Desktop\vmware\b> $esxiOfflineBundle = "VMware-ESXi-7.0b-16324942-depot.zip"
PS C:\Users\sakana\Desktop\vmware\b> $intelNicOfflineBundle = "ESXi670-NE1000-32543355-offline_bundle-15486963.zip"
PS C:\Users\sakana\Desktop\vmware\b> $esxiImageProfileName = "ESXi-7.0b-16324942-standard"
PS C:\Users\sakana\Desktop\vmware\b> Add-EsxSoftwareDepot $esxiOfflineBundle

Depot Url
---------
zip:C:\Users\sakana\Desktop\vmware\b\VMware-ESXi-7.0b-16324942-depot.zip?index.xml



Depot Url
---------
zip:C:\Users\sakana\Desktop\vmware\b\ESXi670-NE1000-32543355-offline_bundle-15486963.zip?index.xml


PS C:\Users\sakana\Desktop\vmware\b> New-EsxImageProfile -CloneProfile $esxiImageProfileName -Name $newImageProfileName -Vendor vGhetto

Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-7.0b-IntelNUC10           vGhetto         2020/06/02 1... PartnerSupported


PS C:\Users\sakana\Desktop\vmware\b> Remove-EsxSoftwarePackage -ImageProfile $newImageProfileName -SoftwarePackage ne1000

Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-7.0b-IntelNUC10           vGhetto         2020/07/11 1... PartnerSupported


PS C:\Users\sakana\Desktop\vmware\b> Add-EsxSoftwarePackage -ImageProfile $newImageProfileName -SoftwarePackage $IntelNUCVib

Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-7.0b-IntelNUC10           vGhetto         2020/07/11 1... PartnerSupported


PS C:\Users\sakana\Desktop\vmware\b> Export-EsxImageProfile -ImageProfile $newImageProfileName -ExportToIso -FilePath "ESXi-7.0b-IntelNUC.iso"

同じディレクトに生成された ESXi-7.0b-IntelNUC.iso が目当てのカスタムイメージです。


■ インストール用USBメモリの作成

カスタムイメージが作成できたので、次はそれを起動可能な形式でUSBメモリにコピーします。今回はたまたま手元にあった 1GB のモノを利用します。

f:id:akira6592:20200711115517p:plain:w400
何かでいただいた fluke の USB メモリ、かわいい

IOS ファイルをそのまま USB メモリにコピーしても起動可能な状態にはなりませんので、Rufus のようなツールを使ってコピーします。

対象の USB メモリと ISO ファイルを指定するだけです。

f:id:akira6592:20200711105944p:plain:w400
完了


■ ESXi のインストール

先ほど作成した、USB メモリを NUC に接続して電源をいれます。

インストーラーが起動するので、画面の指示に従って進めます。

f:id:akira6592:20200711110936p:plain:w400
インストーラーの起動中、ビルド番号は 16324942

f:id:akira6592:20200711111028p:plain:w400
よろしくお願いします

f:id:akira6592:20200711111051p:plain:w400
EULAの確認

f:id:akira6592:20200711111119p:plain:w400
キーボードは日本語で

f:id:akira6592:20200711111148p:plain:w400
ルートパスワードの設定

f:id:akira6592:20200711111207p:plain:w400
インストール対象ストレージの確認

f:id:akira6592:20200711111255p:plain:w400
インストール処理の実行中、1分もかからなかった気がします

f:id:akira6592:20200711111322p:plain:w400
一応 USB メモリを抜いて、再起動

このあたりで、LAN ケーブルを接続しました。

f:id:akira6592:20200711111522p:plain:w400
無事に再起動したあと

これでカスタムイメージによる ESXi7.0b のインストールができました


固定IPアドレスの設定

初期設定では DHCPIPアドレスを取得していました。このままではサーバーらしくないので、固定のIPアドレスを設定します。

先ほどの、再起動したあとの画面で F12 を押します。

f:id:akira6592:20200711112145p:plain:w400
設定したばかりの root のパスワードを入力

表示された設定画面で設定をしていきます。

f:id:akira6592:20200711112242p:plain:w400
Configure Management Network を選択

f:id:akira6592:20200711112617p:plain:w400
IPv4 Configuration を選択

f:id:akira6592:20200711112644p:plain:w400
固定IPアドレスを指定、ここでは末尾 .90

f:id:akira6592:20200711112717p:plain:w400
設定したアドレスになっている(まだ表示上のみ)ことをかくにんして Esc を押す

f:id:akira6592:20200711112819p:plain:w400
設定を反映したいので Y

f:id:akira6592:20200711112845p:plain:w400
設定画面トップに戻るので、再度 Ecs

f:id:akira6592:20200711112916p:plain:w400
元に画面にもどった

これで、固定IPアドレスの設定ができました。


■ ライセンスの割り当て

無料とはいえ、ライセンスの割り当てが必要です。

VMware vSphere Hypervisor 7.0 ダウンロード センターからライセンスキーを確認して控えておきます。

f:id:akira6592:20200711113413p:plain:w400
ライセンスキーの確認

ブラウザで https://ESXiのIPアドレス を開いて root でログインします。

管理 > ライセンス > ライセンスの割り当て をクリックします。

f:id:akira6592:20200711113848p:plain:w400
ライセンス画面

先ほど控えたライセンスキーを入力して割り当てます。

f:id:akira6592:20200711113931p:plain:w400
割り当て完了

f:id:akira6592:20200711114036p:plain:w400
無事


■ おわりに

ということで、以下のような環境ができました。

f:id:akira6592:20200711114211p:plain:w400
サマリ

NUC セットアップの記事でも書きましたが、まだ挿してない もう一枚の 32GBがあるので、これをどうにかして 64 GB にしたいと思います。

とりあえず32GB のままでいいので、CML-P あたりのデプロイも進める予定です。

第10世代 Intel NUC NUC10I7FNH を買いました

はじめに

最近このブログの出張版としてやっている YouTube Live では、一つのマシンで CML-PVirtualBox、それから配信ソフトである OBS Studio をいっぺんに利用することが多くあります。

メモリ 16GB の MacBook Pro を利用しているのですが、だんだんとしんどくなってきました。

やっぱりサーバーが欲しくなりました。

ESXi が乗って、静かで小さいものが欲しかったのですが、以前から気になっていた NUC にすることにしました。(ただし、この組み合わせの場合 ESXi は要カスタムイメージ)

買ったもの

NUC 本体

www.amazon.co.jp

公式

https://www.intel.co.jp/content/www/jp/ja/products/boards-kits/nuc/kits/nuc10i7fnh.html

片手でつかめるほどの大きさです。一応比較のために、Juniper SSG5 の上に載せてみます。

f:id:akira6592:20200710233034p:plain
小さい

コミュニティの方たちと Zoom で話してる時に「これなんですけど」となんの緊張感もなく開封してしまいした・・。

メモリ(32GB * 2)

www.amazon.co.jp

SSD 1TB

メモリかと思っちゃうこんなコンパクトなSSDがあるのですね・・

www.amazon.co.jp

電源ケーブル

この部分が本体にはついていないので。

www.amazon.co.jp

本体以外のものは、下の記事を参考にさせていただきました!

tenko.hatenablog.jp

組み立て

組み立てといっても、下からパカッとあけて、メモリと SSD をサクッと指すだけです。

メモリが・・2枚同じものを買った1枚がどうしても認識せず。スペック上の上限は 64GB です。組み合わせ、刺す場所、1枚のみ、などいろいろ試しても、特定の1枚が絡むと起動せず。症状的には、電源 LED が 3回点滅を繰り返しています。

https://www.intel.co.jp/content/www/jp/ja/support/articles/000005854/intel-nuc.html

対応を検討中ですが、とりあえず 1枚(32GB)で始めようと思います。

[2020/07/23 追記] メモリは無事に返品でき、再度同じ 32GB を購入しました。今度は無事に計 64GB 認識しました。

f:id:akira6592:20200723194946p:plain:w300
メモリの余裕は心の余裕

ことあとは?

ESXi をインストールする予定です。

追記

tekunabe.hatenablog.jp

Ansibleについて語る会【ビヨンド勉強会#25】に参加、登壇させていただきました

はじめに

2020/07/08 に開催された Ansibleについて語る会【ビヨンド勉強会#25】 にリモート参加、登壇させていただきました。

beyondjapan.connpass.com togetter.com

発表の内容などを簡単にまとめます。


主催のビヨンドさんと勉強会について

「サーバーのことは全部丸投げ」というコピーで、サーバー、クラウドの設計、構築、運用、監視などをされている会社。

beyondjapan.com

ビヨンド勉強会」という形で、様々なテーマで開催されています。ハッシュタグ#bydstudy

もともとは大阪での開催だったおようですが、最近はリモートで開催されているため、前回の Terraformについて語る会【ビヨンド勉強会#24】にも参加させていただきました。

今回はご縁があり、 Ansible ユーザー会の方から来た人という立場で、登壇の機会をいただきました。


第1セッション: AnsibleでSSL証明書を自動更新してみた

株式会社ビヨンド 宮崎さんのご発表。

  • 資料

www.slideshare.net

  • 動画(2020/07/26追記)

www.youtube.com

最初のセッションであったこともあってか、Ansibleの入門的な話から始まりました。

Ansibleの特徴、インベントリ、Playbookとは何かなどなど。ロールやログの見方もていねいに説明していただきました。

実例として、SSL証明書の自動更新の例を紹介されていました。

個人的な新たな発見としては、Playbook のドライランを -C オプションでも実行できること。 --check しか知らなかったので、得した気分になりました。

また、ドライランだからこそ発生してしまうエラーを when: not ansible_check_mode でスキップできるのもポイントだと思いました。


第2セッション: Ansibleで Master/Slave構成のjmeterをdeployしよう!

株式会社ビヨンド 讃岐さんのご発表。

  • 資料

www.slideshare.net

  • 動画(2020/07/27追記)

www.youtube.com

負荷テストツールである JMeter を Master/Slave 構成でデプロイする事例を紹介されていました。

私自身、時々忘れてしまうのですが、

- hosts: master
  tasks:
    # 略

- hosts: slave
  tasks:
    # 略

のように、1つのPlaybookの中でターゲットを変えて処理できることを思い出させてくれました。(Playbookは Play をまとめたもの)

あとはもう何といいますか、発表がおもしろくて(funnyの方)笑っちゃいました。

また、ビヨンドさんでは、会社のブログのアクセス数が多い人にインセンティブがあるそうです。 いいですね。

beyondjapan.com

beyondjapan.com


第3セッション: Ansible ではじめるネットワーク自動化(Ansible 2.9 版)

私の発表。

  • 資料

www.slideshare.net

  • 動画(2020/07/26追記)

www.youtube.com (変な透け方しているのはZoomの設定で「グリーンスクリーンがあります」にチェックが入っていたのが原因です・・)

2年前に発表したものをベースにして、Ansible 2.9 に合わせたり、サンプルを新しくしたり、自身の経験を踏まえた内容も入れたものにしました。

ネットワークモジュールを使うためのモジュールの探し方や、必要な変数の定義、サンプルやハマりどころをご紹介しました。

どこかでお伝えしたかった、telnet モジュールのしんどさをお伝えできてよかったです。


おわりに

今回は、参加と登壇の機会をいたき、また、準備や当日の運営もありがとうございました!

実は本当は3月ごろに出張してお邪魔する予定だったのですが、昨今の事情によりオンラインとなりました。

一方で、私の居住地からは離れた大阪であっても気軽に参加できるというメリットも実感できた機会でもありました。

今後もビヨンド勉強会のイベントをウォッチしていきたいと思います。

beyondjapan.connpass.com

[Ansible] 「つまずき Ansible 【Part9】Ansible Tower か AWX」ふりかえり

はじめに

2020/07/04 に、YouTube Live で「つまずき Ansible 【Part9】Ansible Tower か AWX」という配信をしました。 実際に作業しながらエラーと戦って進めるシリーズです。

tekunabe.connpass.com

今回は、こまで作ったインベントリファイルやPlaybookなどを AWX に載せて実行しました。

やったことや、つまずいたエラーと原因、対処をふりかえります。

動画

youtu.be


■ やったこと

インベントリの作成

以下のインベントリファイル相当の設定を AWX のインベントリとして定義。

[ios]
rt01 ansible_host=192.168.1.11

f:id:akira6592:20200704211459p:plain
インベントリの作成

認証情報の作成

以下のグループ変数ファイルのうち、認証情報に当たる部分を定義。

---
# 一般的な変数
ansible_network_os: ios
ansible_connection: network_cli

# 認証情報ここから
ansible_user: ansible
ansible_password: p@ssword

ansible_become_method: enable
ansible_become_password: secret 
# 認証情報こここまで

ansible_become: true

f:id:akira6592:20200704211536p:plain
認証情報の作成

プロジェクトの作成

サンプル用に用意した githubリポジトリを指定したプロジェクトを作成。

Playbookの内容は以下。

---
- hosts: rt01
  gather_facts: false

  tasks:
    - name: no shut  Gi0/3
      ios_interfaces:
        config:
          - name: GigabitEthernet0/3
            description: test desc
            enabled: True

    - name: set ip address
      ios_l3_interfaces:
        config:
          - name: GigabitEthernet0/3
            ipv4:
              - address: 10.0.0.1/24

    - name: enalbe ospf
      ios_config:
        parents:
          - router ospf 1
        lines:
          - network 10.0.0.0 0.0.0.255 area 0
      tags:
        - ospf

    - name: save
      ios_config:
        save_when: modified
      tags:
        - save

f:id:akira6592:20200704211623p:plain
プロジェクトの作成

ジョブテンプレートの作成、実行

ここまで作成した、インベントリ、認証情報、プロジェクト、Playbook の組み合わせを定義。

f:id:akira6592:20200704211703p:plain
ジョブテンプレートの作成

ジョブテンプレートの改善

Playoobk 内で、インターフェース設定がベタ書きだった箇所を

            description: "{{ desc }}"

のように変数化。

これに伴い、AWX の Survey 機能で、ジョブテンプレート実行時に対話的に変数を設定できるようにした。

f:id:akira6592:20200704211418p:plain
Survery化

f:id:akira6592:20200704211736p:plain
実行結果


■ ジョブテンプレート実行時のつまずき

Playbook を更新したのに反映されない

原因

プロジェクトの SCM更新プション起動時のリビジョン更新 のチェックを入れ忘れた。

f:id:akira6592:20200704211945p:plain
チェック入れ忘れた

対処

プロジェクトの SCM更新プションの 起動時のリビジョン更新 のチェックを入れて再実行した。

Part10 にむけて

AWX の続きか、インベントリ関連を検討中です。

[Ansible] eos_command モジュールで show コマンドの結果を JSON で取得する

はじめに

Arista EOS のネットワーク機器向けに、主に show コマンドを実行する eos_command というモジュールがあります。

このモジュールでは、コマンドの実行結果を JSON 形式でも取得できます。

簡単なサンプルでご紹介します。

試した限り コネクションプラグインnetwork_cli でのみ有効な技でした。eAPI を利用する httpapi ではエラーとなったのでご注意ください。

(なお、EOS で show hoge | jsonのようにすると JSON で取得できることは、Network Automation Cookbook という本で偶然知りました。)

Playbook

show version を実行して結果を JSON で取得して、表示する Plyabook です。

---
- hosts: eos
  gather_facts: false
  
  tasks:
    - name: showversion
      eos_command: 
        commands:
          - command: show version
            output: json             # ポイント
      register: result_version
    
    - name: debug
      debug:
        msg: "{{ result_version.stdout_lines[0] }}"

commands オプションに commandoutput: json を指定する点がポイントです。

手動で実行する場合の show version | json 相当です。

なので、

        commands:
          - show version
        output: json             # NG

ではないことにご注意ください。

実行結果

このように JSON になります。

TASK [debug] ********************************************************
ok: [eos1] => {
    "msg": {
        "architecture": "i386",
        "bootupTimestamp": 1593489252.0,
        "cEosToolsVersion": "1.1",
        "hardwareRevision": "",
        "internalBuildId": "9d960dea-a6da-424b-b373-2958c07c48c3",
        "internalVersion": "4.21.10M-15347597.42110M",
        "isIntlVersion": false,
        "memFree": 1169184,
        "memTotal": 2039264,
        "mfgName": "",
        "modelName": "cEOSLab",
        "serialNumber": "",
        "systemMacAddress": "02:42:ac:2a:8f:7d",
        "uptime": 19298.83,
        "version": "4.21.10M"
    }
}

JSON は キーをたどると値を絞れます。例えば、version だけ欲しいときは result_version.stdout_lines[0]`result_version.stdout_lines[0].version にすると

TASK [debug] *********
ok: [eos1] => {
    "msg": "4.21.10M"
}

となります。

通常は・・

output: json を指定しない場合は、以下のように通常の show コマンドの実行結果形式になります。

TASK [debug] ****************************************************************
ok: [eos1] => {
    "msg": [
        "cEOSLab",
        "Hardware version:    ",
        "Serial number:       ",
        "System MAC address:  0242.ac2a.8f7d",
        "",
        "Software image version: 4.21.10M",
        "Architecture:           i386",
        "Internal build version: 4.21.10M-15347597.42110M",
        "Internal build ID:      9d960dea-a6da-424b-b373-2958c07c48c3",
        "",
        "cEOS tools version: 1.1",
        "",
        "Uptime:                 0 weeks, 0 days, 5 hours and 23 minutes",
        "Total memory:           2039264 kB",
        "Free memory:            1169228 kB"
    ]
}

おわりに

JSON のように構造化データを OS の機能で取得できるのはとても便利だと思いました。

assert がはかどります。

[Ansible] 明示的なグループに所属しないホストが暗黙的に所属する ungrouped グループ

はじめに

Ansible には、allungrouped というデフォルトで定義されたグループがあります。

all はすべてのホストが所属するグループです。

一方で、 ungrouped は、明示的なグループに所属さないホストが暗黙的に所属するグループです。

言葉では少しわかりにくいかもしれませんので、例で説明します。

  • 動作確認環境
    • Ansible 2.9.10

インベントリファイル

以下のようなインベントリファイルを想定します。

rt01
rt02

[ios]
ios01
ios02

[eos]
eos01
eos02

上記のうち、rt01rt02 はどの明示的なグループ(ioseos)にも所属していません。

この rt01rt02ungrouped に所属することになります。

確認

グループの所属関係は、ansible-inventoy コマンド--graph オプションを利用すると視覚的にわかりやすいです。(参考

$ ansible-inventory -i inventory.ini --graph

@all:
  |--@eos:
  |  |--eos01
  |  |--eos02
  |--@ios:
  |  |--ios01
  |  |--ios02
  |--@ungrouped:
  |  |--rt01
  |  |--rt02

ungrouped グループに、rt01rt02 が所属していることが分かります。また、ungrouped グループは all グループに所属しています。

Playbook 内でも ungrouped グループをターゲットにできます。

---
- hosts: ungrouped
  gather_facts: false

  tasks:
    - name: debug
      debug:
        msg: "{{ inventory_hostname }} in ungrouped"

実行すると、rt01rt02 を対象に実行されます。

$ ansible-playbook -i inventory.ini ungrouped.yml 

PLAY [ungrouped] *************************************************************************************************

TASK [debug] *****************************************************************************************************
ok: [rt02] => {
    "msg": "rt02 in ungrouped"
}
ok: [rt01] => {
    "msg": "rt01 in ungrouped"
}

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