コンテンツにスキップ

SSH

このデプロイメントの1つのCEから2026-07-28にキャプチャされました。sitecli/capture-manifest.json にはどのノードかが記録されており、scripts/capture-sitecli.sh --check でライブCEに対してコマンド サーフェスを再検証できます。

SSHはアプライアンスの admin アカウントに到達します。ログインシェルはSite CLI (/opt/bin/vpmu)です。これはオンボックスコマンドサーフェス全体への唯一のルートです — デバッグAPIは34コマンドを公開していますが、アプライアンス自体にはそのAPIには存在しない より多くのコマンドがあります。

Terminal window
cd terraform
SLI=$(terraform output -json ce_sli_private_ips | jq -r '.eastus01')
ssh -tt -i ~/.ssh/id_ed25519 -J azureuser@<operator-vm> "admin@$SLI"

このコマンドラインのすべての部分が重要な役割を担っており、次の3つのセクションでそれぞれが防ぐ障害を説明します。

着地するシェルプロンプトはありません: admin のログインシェルそのものがSite CLIであるため、 >>> プロンプトに到達します。そこで execcli <name> としてオンボックスコマンドを実行します — オンボックスコマンドを参照してください。

cloud-initがキーを書き込む理由、APIでないのはなぜか

Section titled “cloud-initがキーを書き込む理由、APIでないのはなぜか”

サイトオブジェクトの admin_user_credentials.ssh_key はこれのためのフィールドのように見えます。 受け入れられ、読み返しても残り、そして何も設定しません。vpm がノードのローカルユーザーを所有しており、 このユーザーへのタッチを拒否します — ノード自身のログから、1回のブートで3回記録されています:

vpm users.go:165: Won't do any change for user admin (internal skip)

その後のすべてはこの1行から来ています。/var/home/admin/.ssh はサイトが ONLINE になる前後を 問わず存在しません。admin のシャドウ最終変更日はイメージのビルド日のままです。一方、vesbkpvesopcon は現在の日付を示します。vpm がこの2つを設定して admin をスキップしたためです。 そして vpmssh_keyauthorized_keys についていかなる時点でも何もログに記録しません。

つまり、ファイルは vpm の外部で書き込む必要があります。admin はuid 2202で、ノードイメージに ベイクされているため、cloud-initが実行される前から存在しており、書き込み時に owner: admin:admin が解決されます — runcmd も所有権の修正も不要です:

- path: /var/home/admin/.ssh/authorized_keys
permissions: "0600"
owner: admin:admin
content: |
${ssh_public_key}

sshd は常に対応していました。sshd -Tpubkeyauthentication yes を報告し、admin は ノードに同梱されている両方の sshd_config ファイルの AllowUsers に記載されています。 有効化すべきものは何もなかった — 欠けていたのはファイルだけでした。

1つのアドレスのみで応答する理由

Section titled “1つのアドレスのみで応答する理由”

sshd0.0.0.0:22 にバインドしていますが、**内部(SLI)**アドレスのみが sshd が 応答できる形でホストネットワークスタックに存在します。eth0は a-i-eth0 にリネームされ、 ホストIPを持ちません — Argoデータプレーンがそのインターフェースを所有しており、本来そこに あるべき管理/SLOアドレスは代わりに vhost0 に表示されます。他の2つのNICはそれぞれの名前で ホストスタックに残ります。

VNet内のVMから1つのCEに対してプローブした結果:

management/SLO address timed out
external address timed out
internal/SLI address OPEN SSH-2.0-OpenSSH_8.7
an unused address timed out (control)

ノードのアドレスとして知っているアドレスへのプローブは、閉じたセキュリティグループが返すのと まったく同じ結果を返します。何もブロックしていません。そのアドレスにリスナーが存在しないのです。

CEのパブリックアドレスにもポート22のリスナーがないため、上記のコマンドが -J を使用する理由です: SLIアドレスと同じサブネット内のVNet内のオペレーターVM。このデプロイメントはその目的のために 1つを構築しています — terraform output -raw client_vm_name で名前を確認できます。

Site CLIにはターミナルとキャリッジリターンが必要です

Section titled “Site CLIにはターミナルとキャリッジリターンが必要です”

admin のログインシェルはシェルではありません。それは go-prompt アプリケーションであり、 ターミナルをrawモードにしてラインではなくキーストロークを読み取ります。4つの結果があり、 それぞれが異なる問題のように見える失敗をします:

仕組みそれなしで何が起きるか
ターミナルを割り当てる(ssh -ttgo-prompt.NewStandardInputParser から panic: no such device or address が発生し、アプライアンスがクラッシュしたように見える
Enterに改行(LF)ではなくキャリッジリターン(CR)を送るラインが送信されず、何も出力せずに入力終了でセッションが閉じる
標準入力を開いたままにするコマンドがレンダリングされる前に接続が終了するため、動作するコマンドが無音に見える
コマンドテキストとEnterバイトを別々に書き込む改行がバッファにリテラル文字として入り、CLIが unknown command と答える。コマンドが存在しないように見える

したがって ssh host 'some-command' は機能しません: 引数は無視されてインタラクティブプロンプトが とにかく起動します。ターミナルとして操作するか、まったく操作しないかのどちらかです。 scripts/sitecli_ssh_harvest.py がリファレンス実装です。

バナーは無料のヘルスチェックです

Section titled “バナーは無料のヘルスチェックです”

何かを入力する前に、ログインバナーはすでにコマンドに費やすであろういくつかの質問に答えています。 f5-xc-ce-vm-01 から、ASCIIアートとパブリックIPを省略した内容:

UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED
All actions performed on this device are audited
Using https://register.ves.volterra.io
OS: rhel-9.2024.6
Memory: 32768MiB
Storage: sda: 31GiB
CPU: Model: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz | CPUs: 8
Software: crt-20250613-3382
DNS: 168.63.129.16: OK
NTP: Synced
Uptime: 0 days, 5 hours, 20 minutes
Registration Status: PROVISIONED
SLO IP: 10.0.1.4/26
WELCOME IN SITE CLI

Registration Status は、まだ起動中のノード(PROVISIONING)と完了したノード(PROVISIONED)を 区別します。Software は存在するコマンドを決定するビルド文字列です。DNSNTP は最初に 登録を破壊する2つの依存関係をカバーしているため、オンラインになれなかったノードは通常ここですでに 原因を示しています — chronyc-sourcesdig が必要になる前に。

  1. キーペアをまだ持っていない場合は生成してください。RSAではなくEd25519を使用してください: 短く、アプライアンスの sshd に受け入れられます。

    Terminal window
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. デプロイメントが公開鍵を参照するように設定します。ルートモジュールはファイルを一度読み取り、 文字列をすべてのノードに渡します:

    terraform/terraform.tfvars
    ssh_public_key_path = "~/.ssh/id_ed25519.pub"

    ssh_public_key はマテリアルをインラインで受け取ります。これはプランテストが使用する方法です。 秘密鍵はワークステーションから外に出ません。

  3. 適用します。このページの先頭の警告を先に読んでください — 既存のデプロイメントではCE VMが置換されます。

以下の各項目は、そのルートがまだ不可能と信じられていた間にテストされ、除外されました。 それぞれ1日を費やすほど妥当に見えます。

原因でないもの除外の根拠
資格情報は作成時のみ適用されるsshd は最初のブートから約90秒後に開始されます。サイトオブジェクトが存在する前です。admin_user_credentialsReplaceSpecType にも存在し、インプレースで適用されます。
block_all_services管理アドレスのポート22のクローズは、サービスがブロックされているかどうかに関わらず同一です。
キーの末尾の改行両方でテスト済み、変化なし。リテラルブロックがそうでなければ2行目の空行をレンダリングするため、cloud-initはそれを取り除きます。
ピン留めされた古いCEソフトウェアOpenSSH 9.9を実行しているものを含む3つのビルドで再現されました。
欠けている admin_passwordスクラッチからのCEで ssh_key とともに admin_password を設定しても何も変わりませんでした。