【Cisco編:telnetモジュールでsshを有効にする】

---telnetモジュールでsshを有効にする---

前回は、HSRPプライオリティ変更をtelnetモジュールで実装してみた。実際のところ、commandをリストで並べるだけで冪等性を担保しない。必ずchanged=1になるのでchanged_when:Falseを入れる。teratermマクロのようにコマンド投入時のプロンプト応答文字列を判断してfaild終了させる実装もできないように見えるので、yamlの書き方や実行順序順序で実装する必要があり。今回もtelnetモジュールではコマンド投入だけ実施したところcommandの下に書いたリストが表示されなかったり、sh runが途中までしか表示されなかったり、、、で、設定確認はruning-configをコントローラにftpで転送してコントローラ側で実施した。

<<Cisco編手順>>

  • 以下の手順の工事を自動化することを想定

    f:id:pinn38:20190502155155p:plain

    ssh有効化手順書<cisco>
    *1


<<playbook>>

 ios_to_ssh_conf.yml

---
- hosts: cisco
  connection: local
  gather_facts: False
  tasks:
    - name: ssh configration
      telnet:
        user: "{{user}}"
        password: "{{pass}}"
        login_prompt: "Username: "
        prompts:
          - "[>|#|?]|Password: "
        command:
          - "enable"
          - "{{enpass}}"
          - terminal length 0
          - copy running-config ftp://{{ftpuser}}:{{ftpass}}@{{ftp_server_add}}/{{path}}
          - "{{ftp_server_add}}"
          - "ssh_pre_{{inventory_hostname}}"
          - "conf t"
          - "ip ssh version 2"
          - "ip domain name 38lab.com"
          - "crypto key generate rsa modulus 2048"
          - "line vty 0 15"
          - "transport input telnet ssh"
          - "exit"
          - "exit"
          - copy running-config ftp://{{ftpuser}}:{{ftpass}}@{{ftp_server_add}}/{{path}}
          - "{{ftp_server_add}}" 
          - "ssh_af_{{inventory_hostname}}"
      changed_when: False
      register: command_result_af

    - name: debug
      debug:
        var: command_result_af.output

    - name: debug log export
      local_action:
        module: copy
        dest: "./ssh_af_{{inventory_hostname}}.log"
        backup: yes
        content: "{{ command_result_af.output}}"
      changed_when: False

    - name: delete hostkey
      lineinfile:
        path: /root/.ssh/known_hosts
        regexp: "{{ansible_host}}"
        state: absent

    - name: change Line feed
      replace:
        dest: "./ssh_af_{{inventory_hostname}}.log"
        regexp: '\\r\\n'
        replace: '\n'
      changed_when: False

    - name: check ssh port
      wait_for:
        host: "{{inventory_hostname}}"
        port: 22
        delay: 5
        state: present
        timeout: 10

    - name: check telnet port
      wait_for:
        host: "{{inventory_hostname}}"
        port: 23
        delay: 5
        state: present
        timeout: 10

<<inventory>>

sshhosts

[cisco]
ciscoR1 ansible_host=192.168.3.215 domain=38lab.com 

[cisco:vars]
user="hoge"
pass="1234"
enpass="1234"
ansible_become=yes    
ansible_become_method=enable    
ftpuser=ktn
ftpass=ktn
ftp_server_add=192.168.3.218
path=sshconf/

 

<<確認>>

  • sshが有効になること
  • Ansibleコントローラから設定ターゲット宛てにpingが通ること
  • .ssh/known_hostsファイルのターゲットの登録行を削除できていること。(playbookを再度実行するとkeyが変更になってしまい次回のsshアクセスが失敗するため)

<<結果と課題>>

  • 前回と同じくコマンドをリストで投入。設定前後の確認はftpでコントローラにrunning-configを送り、commandモジュールで実施する方法でどうにか実装できた。
  • パイプ|で切ってincludeでコマンドを指定するとすべてのリストのコマンドが表示されず下の方のリストの出力がない。
  • show run コマンドはパイプを使わずフルコマンド投入したのに出力は途中までとなった。※NW機器依存かな?
  • local_actionを使うのもやめ、telnet接続でcommandを使ってftpでconfigやログ出力をコントローラに転送しコントローラで正常性確認をする方法にした。

<<思ったこと>>

  • telnetでの設定は、AnsibleのNWモジュールの機能が使えないので、使えるモジュールとyamlを駆使して判断処理を実装しなければならない。慣れてるteratermマクロやシェルスクリプトを使う方が楽でリスクも少なく良い。ここは割り切ってssh化する手段はAnsibleを使わず何でもよしにして、さっさとssh化してAnsibleの機能を思う存分を使うことにする!

 

*1:手順書は実在のものではなくイメージで、パラメータも架空のものです