てくなべ (tekunabe)

ansible / network automation / 学習メモ

[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

[Ansible] aws_ec2 インベントリープラグインのinclude_filtersのand/or条件の指定方法

はじめに

AWS上のEC2インスタンスの情報を動的にインベントリとして利用できる、amazon.aws.aws_ec2というインベントリープラグインがあります。

その中に、include_filtersというオプションがあり、Nameタグの情報などで抽出条件を指定できます。

include_filters ということで複数形なので条件も複数指定できるのですが、どう指定すると and なのか or なのか初見では分かりにくかったです。

自分で試してみた結果をまとめます。

  • 環境
    • ansible 5.4.0
    • ansible-core 2.12.3
    • amazon.aws コレクション 2.1.0

前提

EC2 インスタンスは、以下のものがある状態とします。

タグ Name タグ aws:cloudformation:stack-name
sv01a stack01
sv01b stack01
sv01c stack01
sv02a stack02
sv02b stack02
sv02c stack02

CloudFormation のスタック名 stack01stack02 で作成されたインスタンスが3つずつあるような状態です。

or 条件の include_filters

各条件をそれぞれリストで指定すると or 条件になりました。

---
plugin: amazon.aws.aws_ec2
regions:
  - ap-northeast-1
include_filters:
  - tag:Name:
      - sv0*a
  - tag:aws:cloudformation:stack-name:
      - stack01
hostnames:
  - tag:Name

確認します。

$ ansible-inventory -i inventory_aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--sv01a 
  |  |--sv01b
  |  |--sv01c
  |  |--sv02a
  |--@ungrouped:

Nameで sv0*a を指定しているので該当するインスタンスが2つ抽出されるのに加え、スタック名 stack01 を or 条件で指定しているため、stack01 で作成されたすべてのインスタンスも抽出されたという形です。

and 条件の include_filters

一つのリストの中に複数の条件を指定すると and になりました。

---
plugin: amazon.aws.aws_ec2
regions:
  - ap-northeast-1
include_filters:
  - tag:Name:
      - sv0*a
    tag:aws:cloudformation:stack-name:
      - stack01
hostnames:
  - tag:Name

or 条件のときとの見かけ上の違いは、tag:aws:cloudformation:stack-name の前の - がなくなっただけです。

確認します。

$ ansible-inventory -i inventory_aws_ec2.yml --graph
@all:
  |--@aws_ec2:
  |  |--sv01a
  |--@ungrouped:

今度は、Nameで sv0*a に加えて、and 条件でスタック名 stack01 を指定しています。そのため スタック名 stack01 かつ、Name sv0*a に該当するインスタンスのみが抽出されました。

おわりに

ドキュメント見てもピンとこないときでも、一回試すと腑に落ちたというパターンでした。

[Ansible] 変数を利用する際にクォーテーションで囲う必要がある理由

はじめに

Ansibleもくもく会 2022.5にて、質疑応答を担当するメンターにて参加させていただきました。

"" で書こう意味について質問いただいたので、分かる範囲でお答えしました。その内容についてまとめます。

ディクショナリと区別するために "" で囲う

Playbook 内で、変数の値を展開する場合

- name: debug test
   debug:
     msg: "{{ 変数名 }}"

のように、変数名を{{ }} で囲います。この際 { が値の先頭にくる場合は、クォーテーションで囲う必要があります。囲わないと{ をディクショナリの構文として認識してしまうためです。

この件は、公式ドキュメントに記載されています。

サンプルを引用しますと、以下のケースは "" で囲う必要があります。

- hosts: app_servers
  vars:
      app_path: {{ base_path }}/22    # これはSyntax Error

修正後

- hosts: app_servers
  vars:
       app_path: "{{ base_path }}/22"

以下のケースは、値が { で始まらないため、クォーテーションで囲う必要はありません。

- hosts: app_servers
  vars:
       app_path: /tmp/{{ base_path }}/22   # 問題ない

が、統一して囲うのがいいかもしれません。

- hosts: app_servers
  vars:
       app_path: "/tmp/{{ base_path }}/22"   # これも問題ない

https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#when-to-quote-variables-a-yaml-gotcha

HashiCorp Vault の動的シークレット機能で AWS の一時的 な IAM ユーザーを作成してみた

はじめに

Software Design 2022年5月号の Vault の連載の記事は「動的シークレットで安全性を高めよう」という内容でした。

興味が湧いたので、HashiCorp Learn の Dynamic Secrets も合わせて読んだうえで、試してみました。

AWS の IAM ユーザーの一時的に作成するという内容です。このユーザーの有効期限を短く(デフォルト 768h?、長すぎて検証できず)するためには、少し設定が必要のようでした。その設定をあわせて、私が試してみた内容をまとめます。

AWS シークレットエンジンの有効化

デフォルトでは無効化されているようで、まずは有効化します。

$ vault secrets enable -path=aws aws
Success! Enabled the aws secrets engine at: aws/   # 成功

確認のために vault secrets list を実行した結果は以下のとおりです。

$ vault secrets list
Path          Type         Accessor              Description
----          ----         --------              -----------
aws/          aws          aws_d7104241          n/a
cubbyhole/    cubbyhole    cubbyhole_985a6a5f    per-token private secret storage
identity/     identity     identity_69fd0f2a     identity store
secret/       kv           kv_7e37a4af           key/value secret storage
sys/          system       system_d0a77cbd       system endpoints used for control, policy and debugging

 AWS のアクセスキーとシークレットキーを設定

まず環境変数に AWS のアクセスキーとシークレットキーを設定します。

$ export AWS_ACCESS_KEY_ID=AKIAxxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

設定した環境変数を Vault 側から参照して設定します。

$ vault write aws/config/root \
    access_key=$AWS_ACCESS_KEY_ID \
    secret_key=$AWS_SECRET_ACCESS_KEY \
    region=ap-northeaset-1
Success! Data written to: aws/config/root   # 成功

確認のために vault read aws/config/root を実行した結果は以下のとおりです。

$ vault read  aws/config/root
Key                  Value
---                  -----
access_key           AKIAxxxxxxxxxxxxxxxx
iam_endpoint         n/a
max_retries          -1
region               ap-northeaset-1
sts_endpoint         n/a
username_template    {{ if (eq .Type "STS") }}{{ printf "vault-%s-%s"  (unix_time) (random 20) | truncate 32 }}{{ else }}{{ printf "vault-%s-%s-%s" (printf "%s-%s" (.DisplayName) (.PolicyName) | truncate 42) (unix_time) (random 20) | truncate 64 }}{{ end }}

ロールの作成

次は、一時的に作成される IAM ユーザー に割り当てるロールを作成します。

ここでは、HashiCorp Learn の Dynamic Secretsにあるものを利用させていただきます。

$ vault write aws/roles/my-role \
        credential_type=iam_user \
        policy_document=-<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1426528957000",
      "Effect": "Allow",
      "Action": [
        "ec2:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
EOF

TTL の変更

検証のため、IAM ユーザーの有効期限を短くします。

通常の TTL を3分、延長できる最長 TTL を 10分にします。(こちらの記事を参考にさせていだきました。)

$ vault write sys/mounts/aws/tune default_lease_ttl=3m max_lease_ttl=10m
Success! Data written to: sys/mounts/aws/tune

(公式ドキュメント上でこの指定の方法を見つけられていません・・)

確認のため、vault read sys/mounts/aws/tune

$ vault read sys/mounts/aws/tune
Key                  Value
---                  -----
default_lease_ttl    3m        # 変更しない場合は 768h
description          n/a
force_no_cache       false
max_lease_ttl        10m       # 変更しない場合は 768h

動的シークレトの取得

いよいよ動的シークレットの取得です。ここでは、つまり 一時的な IAM ユーザーの作成です。

$ vault read aws/creds/my-role
Key                Value
---                -----
lease_id           aws/creds/my-role/ude94KFfvkP5uhv0ZeR1XXeP
lease_duration     3m       # 変更しない場合は 768h
lease_renewable    true
access_key         AKIAyyyyyyyyyyyyyyyy
secret_key         yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
security_token     <nil>

動作確認

別のターミナルで、先程表示されたアクセスキーとシークレットキーを使って、かんたんな動作確認をします。

EC2 に対するアクス権限があるはずなので aws ec2 describe-instances で一覧表示を試します。

$ aws ec2 describe-instances
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-hogehoge",
                    "InstanceId": "i-fugafuga",
# ...(略)...

無事に表示されました。

念のため、許可されていない他の操作ができないことも確認します。

$ aws s3 ls

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

ロールを作成してから3分以内に AWS のネジメントコンソール上で一時的な IAM ユーザーがあることを確認します。

ユーザーが作成された

なるほど。

このまま3分ほど経過すると、vault server -dev でサーバーを起動しているターミナルで以下のログが表示されました。

2022-05-01T18:00:49.945+0900 [INFO]  expiration: revoked lease: lease_id=aws/creds/my-role/ude94KFfvkP5uhv0ZeR1XXeP

IAM ユーザーが削除されたようなので、再度 AWS のネジメントコンソールを確認すると、たしかにいなくなっていました。

削除された

ということは、先程できていた aws ec2 describe-instances はできなくなっているはずなので確認します。

$ aws ec2 describe-instances

An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials

無事、できなくなっていました。

まとめ

動的シークレットの機能を利用して、AWS の一時的 な IAM ユーザーを作成してみました。

vault lease revoke で明示的に削除もできますが、有効期限で自動削除されるのは安心です。

参考

TTL の設定変更はこちらの記事を参考にさせていただきました。

christina04.hatenablog.com