運維少年系列 - ansible and cisco(2)

ansible and cisco (2)

一、ansible playbook二、playbook的使用1) 第一個playbook的使用2) 第二個playbook3) 最後一個playbook三、最後

一、ansible playbook

  • playbook

playbook 翻譯過來就是劇本,什麼是劇本?就是編劇寫好了所有的情景話語,演員去執行、表達出來。在ansible中,我們就是編劇,而路由器交換機等設備就是演員。所以這個劇本需要我們去寫,然後由設備去執行。(講得不太專業,大家可以自行百度ansible playbook),playbook要以yaml格式編寫。

  • playbook可以做什麼

之前的我們的文章演示了單條命令執行,playbook相對於之前的模式更加靈活,我們可以在playbook中加入循環、判斷、調用多個模塊、執行多個命令等等…所以playbook是(裝13)必不可少的。

二、playbook的使用

  • YAML

YAML跟JSON和XML的區別不大,都有特定的格式。大家可以去看一下YAML的簡單用法。一定要注意空格,縮進只能使用空格縮進。

  • 模塊

需要查看網絡模塊可以點擊這裏查看。我們今天主要使用的是ios_command和ios_config模塊,如下圖:


點擊模塊名,可以看到裏面的參數和使用的例子,如下圖:


  • ios_command

ios_command 模塊,可以在IOS的路由器交換機上面使用,該模塊只能在(# )特權模式下使用,而不能在(config# )全局配置模式下使用。

  • ios_config

ios_config 模塊,同上,不過只能在(config# )全局配置模式下使用,而不能在(# )特權模式下使用

1) 第一個playbook的使用

第一個playbook比較簡單,以下注釋我以編劇的身份來解釋:

 1[root@yunwei ~]# cat ywsn_playbook1.yaml 
2---  # yaml以---開頭  # 一定要注意以下參數的空格,-和: 後面一定要有空格!!!
3- name: show clock  # 劇本的名字
4  hosts: cisco-2    # 表演的演員 -- 執行的主機(在hosts文件中)
5  gather_facts: false # 檢查演員的基本信息 -- 檢查主機配置等信息
6  connectionlocal # 劇本在誰的手裏
7  tasks:  # 劇情
8    - nameshow clock # 劇情的名字(第1集)
9      ios_command:    # 使用ios_command模塊
10        commands:     # 使用ios_command模塊下的commands參數(即命令執行)
11          - show clock # 執行的命令
12      register: print_output # 保存在一個文件中(執行的目錄下會多出一個.retry文件)
13    - debug: var=print_output.stdout_lines # 將文件中的內容打印出來
14
15    - name: configure loop interfact # 劇情的名字(第2集)
16      ios_config:  # 使用ios_config模塊
17        parents: int loop 0  # 使用 parents參數,表示執行了這個命令之後,才能執行lines
18        lines:  # 使用lines參數,執行多條命令
19          - ip add 1.1.1.1 255.255.255.0
20          - no sh
21      register: print_output
22    - debug: var=print_output
23
24... # yaml以...結尾

執行效果如下(動圖比較慢):

2) 第二個playbook

第二個playbook,我將實現免密登錄和循環。playbook如下:

 1[root@yunwei ~]# cat ywsn_playbook2.yaml 
2---
3- name: yunweishaonian ansible and cisco 2 
4  hosts: cisco-1
5  gather_facts: false
6  connection: local
7
8  vars:  # 定義一個變量
9    authinfo: # 變量名稱
10      username: "cisco"  # 變量值
11      password: "123456" # 變量值
12
13  tasks:
14    - name: config loop interfact
15      ios_config:
16        provider: "{{ authinfo }}"  # 驗證,驗證時使用前面定義的變量
17        lines:  # 命令
18          - switchport trunk encapsulation dot1q
19          - switchport mode trunk
20        parents: "{{ item }}"  # 父配置 -- 執行這個,再執行上面的lines(子配置)
21      with_items:  # 循環以下變量,循環的值爲 item
22        - int Ethernet 1/0
23        - int Ethernet 1/1
24        - int Ethernet 1/2
25    - name: show int trunk
26      ios_command:
27        provider: "{{ authinfo }}"
28        commands:
29          - show int trunk
30      register: print_output
31    - debug: var=print_output.stdout_lines
32
33...
34
35[root@yunwei ~]

執行結果如下(動圖比較慢):

3) 最後一個playbook

最後一個playbook,實現引用外部文件的變量、判斷。

外部文件config.yaml內容,裏面是字典dict,當循環inter的時候,會有三個key,分別是switch、ip、port

1---
2inter:
3  - {switch192.168.108.251, ip: 1.1.1.1, port: loop 1}
4  - {switch192.168.108.252, ip: 2.2.2.2, port: loop 2}
5  - {switch192.168.108.253, ip: 3.3.3.3, port: loop 3}
6...

hosts 文件

1[root@yunwei ~]# cat /etc/ansible/hosts
2[cisco]
3192.168.108.251
4192.168.108.252
5192.168.108.253
6[root@yunwei ~]

最終代碼:

 1[root@yunwei ~]# cat ywsn_playbook3.yaml 
2---
3- name: yunweishaonian ansible and cisco 2
4  hosts: cisco
5  gather_facts: false
6  connection: local
7  vars_files:  # 變量文件,多個變量文件的變量名請不要重複
8    - config.yaml  
9
10  vars:
11    authinfo:
12      username: "cisco"
13      password: "123456"
14
15  tasks:
16    - name: config int loop
17      ios_config:
18        provider: "{{ authinfo }}"
19        lines:
20          - ip add {{ item.ip }} 255.255.255.0
21          - no sh
22        parents:
23          - interface {{ item.port }}
24      with_items: "{{ inter }}"  # 循環inter 字典,得到switch\ip\port三個key
25      when: (item.switch == inventory_hostname)  # 判斷 switch的值是否等於登錄的IP,inventory_hostname是一個默認參數,判斷之後,執行上parents和lines
26
27    - name: config ospf
28      ios_config:
29        provider: "{{ authinfo }}"
30        lines:
31          - network 0.0.0.0 255.255.255.255 area 0
32        parents:
33          - router ospf 10
34
35    - name: save switch configure  # 保存配置
36      ios_config: 
37        provider: "{{ authinfo }}"
38        save_when: modified  # 保存配置的條件是,配置發生變化。
39...

運行效果如下(動圖比較慢):

查看swithc1的路由表,如圖:

三、最後

ansible and cisco 估計就到這了~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章