Ansibleとtelnet:そうではないが、本当に欲しい







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は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



All Articles