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 connection: local # 劇本在誰的手裏
7 tasks: # 劇情
8 - name: show 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 - {switch: 192.168.108.251, ip: 1.1.1.1, port: loop 1}
4 - {switch: 192.168.108.252, ip: 2.2.2.2, port: loop 2}
5 - {switch: 192.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 估計就到這了~