このファイルはClaude Codeがリポジトリを理解するためのコンテキストを提供します。
junos-opsは、Juniper Networksデバイスの運用を自動化するPythonツールです。デバイスモデルの自動検出、JUNOSパッケージの自動更新、ロールバック、リブートスケジュール管理、RSI/SCF収集をNETCONF/SSH経由で行います。
- 言語: Python 3(3.12以上)
- 主要ライブラリ: junos-eznc(PyEZ)— Juniper公式のPython自動化ライブラリ
- プロトコル: NETCONF(ポート830)、SCP(ファイル転送)
- パッケージ管理: pyproject.toml(pip installable)
- テスト: pytest + モック
- CI: GitHub Actions(Python 3.12/3.13 マトリクス、ビルド検証付き)
- ライセンス: Apache License 2.0
junos_ops/
├── __init__.py # パッケージ定義、__version__
├── __main__.py # python -m junos_ops 対応
├── cli.py # サブコマンドルーティング、argparse、main()
├── common.py # 共通機能(設定読込、接続管理、ターゲット決定、並列実行)
├── upgrade.py # upgrade系機能(コピー、インストール、ロールバック、バージョン管理)
└── rsi.py # RSI/SCF収集機能
tests/
├── conftest.py # pytest フィクスチャ
├── test_config.py # 設定読込・モデル取得・ハッシュキャッシュのテスト
├── test_connect.py # 接続モックテスト
├── test_version.py # バージョン関連関数のテスト
├── test_process_host.py # process_host統合テスト(後方互換)
├── test_parallel.py # 並列実行・ターゲット決定のテスト
├── test_reboot.py # reboot・config変更検出・snapshot削除のテスト
├── test_config_push.py # config サブコマンド(load_config)のテスト
├── test_show.py # show サブコマンドのテスト
├── test_rsi.py # RSI/SCF収集のテスト
└── test_cli_parse.py # CLI引数パース・サブコマンドなし実行のテスト
pyproject.toml # パッケージメタデータ、エントリポイント
config.ini # 設定ファイル(設定例)
logging.ini # ロギング設定
README.md # 英語版
README.ja.md # 日本語版
LICENSE
- グローバル変数:
config,config_lock,args get_default_config()— 設定ファイルパスの探索(XDG対応)read_config()— INIファイル読込connect()— NETCONF接続(huge_tree対応、個別例外処理)_get_host_tags()— ホストセクションのタグを set で返す_filter_by_tags()— タグの AND フィルタでセクションを絞り込むget_targets()— ターゲットホストリスト決定(--tags対応)run_parallel()— ThreadPoolExecutorラッパー(max_workers=1でシリアル実行)
delete_snapshots()— EX/QFXシリーズのスナップショット全削除(ディスク容量確保)copy()— SCP転送+チェックサム検証(storage cleanup + snapshot delete 付き)install()— パッケージインストール(pre/postフライトチェック)rollback()— 前バージョンへの復帰reboot()— スケジュールリブート(config変更検出時は自動再インストール)show_version()— バージョン情報表示(config変更警告付き)get_model_file()/get_model_hash()— モデル→パッケージマッピングget_pending_version()/get_planning_version()/compare_version()— バージョン比較get_commit_information()— 最新コミット情報取得(epoch秒、ユーザー、クライアント)get_rescue_config_time()— rescue config ファイルの更新時刻取得check_and_reinstall()— config変更検出+validation付き自動再インストールget_hashcache()/set_hashcache()— チェックサムキャッシュ(スレッド安全)load_config()— set コマンドファイルのロード+コミット(lock→load→diff→commit_check→commit confirmed→health check→confirm→unlock)、--workersで並列実行対応list_remote_path()— リモートファイル一覧
- RSI = request support information
- SCF = show configuration | display set
get_support_information()— 機種別タイムアウト設定でRSI取得cmd_rsi()— 1ホストのSCF+RSI収集→ファイル出力(DISPLAY_STYLEで出力形式変更可能)
main()— argparse サブコマンド定義、ディスパッチcmd_upgrade(),cmd_copy(),cmd_install(),cmd_rollback(),cmd_version(),cmd_reboot(),cmd_ls(),cmd_show(),cmd_config(),cmd_facts()— サブコマンド用エントリ関数process_host()— 旧CLI互換の統合処理関数
junos-ops upgrade [hostname ...] # コピー+インストール
junos-ops copy [hostname ...] # コピーだけ
junos-ops install [hostname ...] # インストールだけ
junos-ops rollback [hostname ...] # ロールバック
junos-ops version [hostname ...] # バージョン表示
junos-ops reboot --at YYMMDDHHMM [hostname ...] # リブート
junos-ops ls [-l] [hostname ...] # リモートファイル一覧
junos-ops show COMMAND [hostname ...] # 任意の CLI コマンドを実行
junos-ops config -f FILE [--confirm N] [hostname ...] # set コマンドファイル適用
junos-ops rsi [hostname ...] # RSI/SCF収集
junos-ops [hostname ...] # サブコマンド省略 → device facts 表示
junos-ops --version # プログラムバージョン
共通オプション: -c, -n, -d, --force, --workers N, --tags TAG,...
python3 -m venv .venv
. .venv/bin/activate
pip install -e ".[test]"INI形式の設定ファイル。configparserで読み込む。
探索順: --config指定 → ./config.ini → ~/.config/junos-ops/config.ini
[DEFAULT]
id = exadmin # SSHユーザ名
pw = password # SSHパスワード
sshkey = id_ed25519 # SSH秘密鍵ファイル
port = 830 # NETCONFポート
hashalgo = md5 # チェックサムアルゴリズム
rpath = /var/tmp # リモートパス
# lpath = ~/firmware # ローカルのファームウェア置き場(~ 展開対応、デフォルト: カレントディレクトリ)
# huge_tree = true # 大きなXMLレスポンスを許可
# RSI_DIR = ./rsi/ # RSI/SCFファイル出力先
# DISPLAY_STYLE = display set # SCF出力形式(デフォルト: display set)
# DISPLAY_STYLE = # 空にすると show configuration のみ(stanza形式)EX2300-24T.file = junos-arm-32-18.4R3-S10.tgz
EX2300-24T.hash = e233b31a0b9233bc4c56e89954839a8a[rt1.example.jp] # hostキー省略 → rt1.example.jpに接続
tags = tokyo, core # --tags でフィルタ可能(AND マッチ)
[rt2.example.jp]
host = 192.0.2.1 # IPアドレスでオーバーライドpytest tests/ -v --tb=shortカバレッジ: バージョン比較、設定読込、接続モック、各サブコマンド(reboot・config・show・rsi)、並列実行・タグフィルタリング、スレッド安全性、CLI引数パース。
pip install build && python -m buildCI で sdist / wheel のビルドを検証。pyproject.toml の記述ミス(PEP 639 ライセンス競合等)を早期検出する。
junos_ops/__init__.pyの__version__を更新CHANGELOG.mdにバージョンエントリを追加- コミット & push
- タグを作成して push → GitHub Actions が TestPyPI → PyPI → GitHub Release を自動実行
git tag v0.X.Y
git push origin v0.X.YPyPI リリース後、shigechika/homebrew-tap の update-formula.yml が repository_dispatch で自動トリガーされ、Formula 更新 → bottle ビルドまで自動で行われる。
argsとconfigはcommonモジュールのグローバル変数として管理されるconfigへの書き込みはconfig_lock(threading.Lock)で保護済みcli.pyの後方互換alias(copy = upgrade.copy等)は将来のバージョンで削除予定