Telnetは明らかに非常に安全ではないプロトコルであり、実際には完全に安全ではないため、使用を控えることを強くお勧めします。 正直に言うと、プルリクエストを拒否する可能性があります-MITMの可能性が生じた場合、それは単に傷ついた世界を求めているだけです。-マイケルデハーン、Ansibleの作成者
まったく同感です。 ええと、SSH接続のためにリブート/フリーズする2万個のレガシースイッチがあり、機器の一部がそれをまったくサポートしていない場合はどうすればよいですか?
猫をお願いします。
UPD:バージョン2.5では個別のtelnetモジュールをリリースしたため、ガイドは古くなっています
docs.ansible.com/ansible/latest/modules/telnet_module.html
Ansibleの機能
Ssh
現在(リリース2.3.0)、Ansibleは3種類の接続を使用しています。
- Ssh
- ローカル
- Docker
実際、SSHは2種類で構成され、トランスポートの使用が異なります-sshとparamiko。 後者は、バージョンAnsible 1.3より前にデフォルトで使用されていました。最新のディストリビューションは、スマートパラメーター(つまりOpenSSH)を使用し、多重化(コントロールマスター機能)を使用してSSHを大幅に高速化します。 レガシー機器との互換性のために、paramikoを使用して、モジュール/プレイブックを
–c paramiko
ときに
–c paramiko
設定することをお勧めします。
重要:キー認証ではなくパスワード認証では、sshの代わりにsshpassが使用されます。
必要に応じてパッケージをインストールします。
sudo apt-get install sshpass
RHELベースのシステムの場合、EPELを有効にする必要があります
yum --enablerepo=epel install sshpass
SSHには、1つのコマンドを必要な数のホストに送信し、すべてのホストからの出力を表示する優れたrawモジュールがあります。 Telnetの場合、同様の機能を持つプレイブックを使用する必要があります。
Telnet
Telnetを使用するには、 ローカル接続タイプを使用する必要があります。 これは、PlaybookコマンドがAnsibleホスト上で直接実行されることを意味します(Pythonがリモートスイッチにインストールされる可能性は低いです)。
これを行うには、次をインストールします。
sudo apt-get install telnet
または
yum install telnet
また、 pipアドオンマネージャーから利用できるpexpectも必要です 。 PipはAnsibleとともにインストールされるので、実行するだけです:
pip install pexpect
環境の準備が完了しました。
在庫設定
標準ファイル/ etc / ansible / hostsを使用します
[test_cluster] 192.168.0.[10:25]
したがって、スイッチはtest_clusterエンティティの一部であり、192.168.0.10から192.168.0.25までのIPアドレスを持っています。 管理者権限で構成された単一のアカウントがあり、Telnetアクセスが許可されていると想定されています。
プレイブックを.yml形式で作成します
--- - hosts: test_cluster gather_facts: false connection: local tasks: - name: telnet,login and execute command ignore_errors: true expect: command: telnet "{{ inventory_hostname }}" responses: (?i)username: "admin" (?i)password: "12345" (?i)#: "{{COMMAND}}\r\nlogout\r\nexit\r\nquit" echo: yes register: telnet_output - name: Debug output debug: var=telnet_output.stdout_lines
順番に行きましょう:
hosts: test_cluster
接続しているホスト
gather_facts: false
通常、ネットワーク機器では機能しません。無効にする必要があります
connection: local
PexpectはAnsibleホスト上にのみあります。
tasks:
モジュールを使い始める
ignore_errors: true
出力で何が起こるかはわかりません。expectモジュールの機能が制限されているため、結果が失敗する可能性があります。 無効にすることをお勧めします。
command: telnet "{{ inventory_hostname }}"
Ansibleホストで実行され、すべてのリモートホストに接続します。
responses:
(?i)
は、大文字と小文字が無視されることを意味します。
前
:
期待することを示した後、応答します。
#
-認証が成功したことを確認します。特権モードです。 コマンド変数と端末からの出口(logout / exit / quit)の組み合わせで応答します
expectを使用するには、リモートホストのCLIの完全な知識、Pythonの正規表現を処理するスキルの存在が必要です。 たとえば、行
#: "save"
を追加しても意味がありません。 マッチングは最初の条件でのみ発生します
#: "{{COMMAND}}\r\nlogout\r\nexit\r\nquit"
register: telnet_output
出力を収集し、telnet_output変数に入れます。
Debug
は便利な方法で出力を返します。
必要なコマンドを使用してプレイブックを開始します。
ansible-playbook raw_telnet.yml -e '{"COMMAND":"show stp"}'
実行結果:
"Command: show stp", "", "", "", "STP Bridge Global Settings", "", "---------------------------", "", "STP Status : Enabled", "", "STP Version : RSTP", "", "Max Age : 20 ", "", "Hello Time : 2 ", "", "Forward Delay : 15 ", "", "Max Hops : 20 ", "", "TX Hold Count : 3 ", "", "Forwarding BPDU : Enabled",
必要に応じて、ほとんどすべてを変数に置き換えることができ、プレイブックをまったく編集しません。 もちろん、パスワードをクリアテキストで保存することも安全ではありません。このVaultはAnsibleに存在するためです。
参考文献:
→ オリジナルのドキュメント
→ Ansible Basics
→ Ansible +ネットワーク
UPD:バージョン2.5では個別のtelnetモジュールをリリースしたため、ガイドは古くなっています
docs.ansible.com/ansible/latest/modules/telnet_module.html