2019年10月31日 星期四

S小魚仔S Ansible 開發 H3C (華三) 交換機

很多初學 ansible 的都會誤以為,ansible 是 ssh 到目的主機上,然後直接運行 cli 命令,其實並不是,ansible 對管理網路設備雖然不需要安裝 agent,但是需要其擁有「python」。「ansible」主機會把需要執行的「module」(完成特定功能的python程式) 傳送到目的主機去執行,因此我們其實需要一個「moudle」能完成「ssh」到網路設備上並下發指定命令的功能。Ansible Host 安裝 Python 我們完全可以透過「Ansible Host」下發指令,這樣就不需要「ansible」通過「paramiko」傳輸「module」,只需要在設定檔(vi /etc/ansible/hosts)中指定「connection」為「local」即可。
PS. H3C 網路設備必須啟用「ssh」登入

1. 修改「vi /etc/ansible/hosts」設定「交換機」IP  為 local


2. 編輯「vi /etc/ansible/ansible.cfg」啟用「library」模組

3. 建立「my_modules」資料夾

mkdir -p /usr/share/my_modules/

4. 下載 GitHub 作者「luffycjf」( network_automation ) 開發「模塊

cd /opt ; git clone https://github.com/luffycjf/network_automation

5. 搬移「ssh_command.py」模塊,放到「ansible library」位置

mv /opt/network_automation/module/ssh_command.py /usr/share/my_modules/

6. 編寫「ansible - playbook
PS. Playbook 採用 yml 描述語言檔,縮排位置一定要對齊
- hosts: localhost
  gather_facts: no
  vars:
   - ssh_port: 22                    #ssh端口号
     ssh_username: "test"            #设备用户名
     ssh_password: "test2019"        #设备密码
     device_address: "172.21.6.2"    #设备地址
     command_interval: 0.5           #命令之间等待的最小间隔,默认0.5s,可以不改
  tasks:
    #     command: ''                                   #指定操作的命令。
    #     configfile: '/opt/h3c_switch/h3c_config.txt'  #指定操作「h3c」配置腳本。
    - name: display version
      ssh_command:
        port: "{{ssh_port}}"
        address: "{{device_address}}"
        username: "{{ssh_username}}"
        password: "{{ssh_password}}"
        command_interval: 0.1
        command: 'display ip interface brief'
        configfile: ''
      register: h3c_log
 
    - name: print h3c_log
      debug:
        var: h3c_log.stdout_lines
      with_items: h3c_log.results
7. 執行結果


參考資料
Cheng's Blog」-「网络设备配置建模 Ⅰ
Ansible Web Site」-「Ansible for Network Automation 

2 則留言:

  1. 你好,我是ansible得初学者。在自学中,目前遇到以下问题,查了很多资料都不行,想请教一下。
    "changed": false,
    "msg": "Authentication or permission failure. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote temp path in ansible.cfg to a path rooted in \"/tmp\". Failed command was: ( umask 77 && mkdir -p \"` echo $HOME/.ansible/tmp/ansible-tmp-1586711281.83-115780261019156 `\" && echo ansible-tmp-1586711281.83-115780261019156=\"` echo $HOME/.ansible/tmp/ansible-tmp-1586711281.83-115780261019156 `\" ), exited with result 1, stdout output: \r\r\n\u0000******************************************************************************\r\r\n* Copyright (c) 2004-2017 New H3C Technologies Co., Ltd. All rights reserved.*\r\r\n* Without the owner's prior written consent, *\r\r\n* no decompiling or reverse-engineering shall be allowed. *\r\r\n******************************************************************************\r\r\n\r\r\n\u0000/bin/sh -c '( umask 77 && mkdir -p \"` echo $HOME/.ansible/tmp/ansible-tmp-1586711281.83-115780261019156 `\" && echo ansible-tmp-1586711281.83-115780261019156=\"` echo $HOME/.ansible/tmp/ansible-tmp-1586711281.83-115780261019156 `\" ) && sleep 0'\r\r\n ^\r\r\n % Unrecognized command found at '^' position.\r\r\n",

    回覆刪除
  2. 從您提供的日誌分析,應該是權限不足。

    回覆刪除