本節內容:
- 什么場景下會用roles?
- roles示例
一、什么場景下會用roles?
假如我們現在有3個被管理主機,第一個要配置成httpd,第二個要配置成php服務器,第三個要配置成MySQL服務器。我們如何來定義playbook?
第一個play用到第一個主機上,用來構建httpd,第二個play用到第二個主機上,用來構建php,第三個play用到第三個主機上,用來構建MySQL。這些個play定義在playbook中比較麻煩,將來也不利於模塊化調用,不利於多次調。比如說后來又加進來一個主機,這個第4個主機既是httpd服務器,又是php服務器,我們只能寫第4個play,上面寫上安裝httpd和php。這樣playbook中的代碼就重復了。
為了避免代碼重復,roles能夠實現代碼重復被調用。定義一個角色叫websrvs,第二個角色叫phpappsrvs,第三個角色叫dbsrvs。那么調用時如下來調用:
hosts: host1 role: - websrvs hosts: host2 role: - phpappsrvs hosts: host3 role: - dbsrvs hosts: host4 role: - websrvs - phpappsrvs
這樣代碼就可以重復利用了,每個角色可以被獨立重復調用。下面舉例說明使用方式。
二、roles示例
假設有3台主機,172.16.7.151主機上安裝MySQL,172.16.7.152上安裝httpd,172.16.7.153上安裝MySQL和httpd。我們建立兩個角色websrvs和dbsrvs,然后應用到這幾個主機上。
1. 創建roles的必需目錄
[root@node1 opt]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}
每個role下面有個目錄叫meta,在里面可以新建文件main.yml,在文件中可以設置該role和其它role之前的關聯關系。
2. 配置角色
(1)配置角色websrvs
[root@node1 opt]# cd ansible_playbooks/roles/ [root@node1 roles]# cd websrvs/ [root@node1 websrvs]# ls files handlers meta tasks templates vars
a. 將httpd配置文件上傳到files目錄下,我這里假設httpd.conf每台主機都是一樣的,實際上應該用模板,先用一樣的配置文件舉例
[root@node1 websrvs]# cp /etc/httpd/conf/httpd.conf files/
直接復制的靜態文件都放在files目錄下。打算用模板文件的都放在templates目錄下。
b.編寫任務列表tasks
[root@node1 websrvs]# vim tasks/main.yml - name: install httpd package yum: name=httpd - name: install configuration file copy: src=httpd.conf dest=/etc/httpd/conf tags: - conf notify: - restart httpd - name: start httpd service: name=httpd state=started
c.由於上面的tasks中定義了notify,所以要定義handlers
[root@node1 websrvs]# vim handlers/main.yml - name: restart httpd service: name=httpd state=restarted
如果需要定義變量,則在vars目錄下創建main.yml文件,在文件中寫入變量,以key:value的形式定義,比如:
http_port: 8080
(2)配置角色dbsrvs
[root@node1 roles]# cd dbsrvs/ [root@node1 dbsrvs]# ls files handlers meta tasks templates vars
a.將MySQL配置文件上傳到files目錄下。
b.編寫任務列表tasks
[root@node1 dbsrvs]# vim tasks/main.yml - name: install mysql-server package yum: name=mysql-server state=latest - name: install configuration file copy: src=my.cnf dest/etc/my.cnf tags: - conf notify: - restart mysqld - name: service: name=mysqld enabled=true state=started
c.定義handlers
[root@node1 dbsrvs]# vim handlers/main.yml - name: restart mysqld service: name=mysqld state=restarted
(3)定義playbook
【注意】:要在roles目錄同級創建playbook。
[root@node1 ansible_playbooks]# vim web.yml - hosts: 172.16.7.152 roles: - websrvs [root@node1 ansible_playbooks]# vim db.yml - hosts: 172.16.7.151 roles: - dbsrvs [root@node1 ansible_playbooks]# vim site.yml - hosts: 172.16.7.153 roles: - websrvs - dbsrvs
運行:
[root@node1 ansible_playbooks]# ansible-playbook web.yml [root@node1 ansible_playbooks]# ansible-playbook db.yml [root@node1 ansible_playbooks]# ansible-playbook site.yml
當然也可以把這些內容寫入同一個playbook中。playbook的名字可以自定義。