roles是在ansible 1.2版本中引入的一個新的特性,用於層次性、結構化的組織playbook roles可以根據層次型結構自動的裝載變量文件,tasks以及handles等,要使用roles只須要在playbook中使用include
指令便可。
簡單的來說,roles就是經過分別將變量、文件、任務、模板及處理方式,放在一個單獨的目錄中(使用模塊化的思想),並可使用include的一種機制,roles通常用於基於主機構建服務的場景中,也是能夠用於構建守護進程的場景中html
roles的模塊目錄分類: files 目錄 # 存放copy和script模塊等調用的文件 templates 目錄 # template模塊查找所須要的模板文件的目錄 tasks 目錄 # 定義tasks,role的基本元素,至少應該包含一個名爲main.yml的文件;其餘的文件經過include的進行調用 handlers 目錄 # 至少包含一個main.yml的文件;其餘的文件經過include的進行調用 vars 目錄 # 定義變量,至少包含一個main.yml的文件;其餘的文件經過include的進行調用 meta 目錄 # 定義當前角色的特殊的設定和一下依賴關係,至少包含一個main.yml的文件;其餘的文件經過include的進行調用 default 目錄 # 設定默認變量時使用此目錄中的main.yml文件
這裏使用nginx爲例介紹一下角色(roles)的使用mysql
目錄結構 [root@ansible ansible]# tree /etc/ansible/ /etc/ansible/ ├── ansible.cfg # ansible的配置文件 ├── hosts # ansible的主機清單文件 ├── nginx_role.yml # nginx角色的執行文件 └── roles # 角色目錄(安裝ansible後就生成了,能夠在其餘目錄下) └── nginx # 角色目錄(nginx爲例) ├── files # 須要拷貝或者其餘的一些文件目錄 │ └── index.html # 給nginx拷貝一個index.html文件 ├── handlers # 任務觸發器目錄 │ └── main.yml # 觸發器觸發後執行的動做 ├── tasks # 具體任務路徑 │ ├── copyfile.yml # copy index文件的任務劇本 │ ├── group.yml # 建立nginx組的任務劇本 │ ├── main.yml # 綜合每一個任務,並指定任務劇本的執行順序 │ ├── start.yml # 啓動nginx任務劇本 │ ├── templ.yml # 拷貝nginx模板文件任務劇本 │ ├── user.yml # 建立nginx用戶任務劇本 │ └── yum.yml # 安裝nginx任務劇本 ├── templates # 模板文件目錄 │ └── nginx.conf.j2 # nginx模板配置文件(必須是.j2結尾文件) └── vars # 環境變量目錄 └── main.yml # nginx所需的環境變量
下面介紹每一個目錄每一個文件具體內容和含義nginx
vars目錄: main.yml文件: 定義一些變量,給nginx的模板文件使用,內容以下: nginx_port: 123 nginx_user: brian
files目錄: index.html文件:給nginx的主頁文件使用copy模塊拷貝到被管理主機,內容以下: Welcome to Brian Ansible
templates目錄: nginx.conf.j2文件 就是在ansible主機上安裝nginx後,把/etc/nginx/nginx.conf這個文件copy過來更名爲nginx.conf.j2 主要修改以下: user nginx; 改成: user {{ nginx_user }}; worker_processes auto; 改成: worker_processes {{ ansible_processor_vcpus*4 }}; listen {{ nginx_port }} default_server;改成: listen {{ nginx_port }} default_server; listen [::]:{{ nginx_port }} default_server;改成: listen [::]:{{ nginx_port }} default_server;
tasks目錄: copyfile.yml文件:copy index.html文件給遠程主機的nginx,內容以下: - name: copy nginx index file copy: src=/etc/ansible/roles/nginx/files/index.html dest=/usr/share/nginx/html/ group.yml文件:建立nginx組的劇本,內容以下: - name: create nginx group group: name=brian user.yml文件:建立nginx用戶的劇本,內容以下: - name: create nginx user for nginx group user: name=brian group=brian system=yes shell=/sbin/nologin yum.yml文件: 安裝nginx軟件包(使用yum的方式安裝),內容以下: - name: yum install nginx package yum: name=nginx templ.yml文件: copy nginx的模板文件,內容以下: - name: copy templates nginx template: src=/etc/ansible/roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify: restart nginx start.yml: 啓動nginx,內容以下: - name: start nginx service: name=nginx state=started enabled=yes main.yml文件:使用include調用tasks目錄的劇本並指定執行的順序,內容以下: - include: group.yml - include: user.yml - include: yum.yml - include: templ.yml - include: copyfile.yml - include: start.yml
handlers目錄: main.yml文件:修改了配置文件而後重啓服務(在tasks目錄中的temlp.yml定義的notify),內容以下: - name: restart nginx service: name=nginx state=restarted
nginx_role.yml文件: 執行角色的總文件(必須和roles目錄同一個級別),內容以下: --- - hosts: web remote_user: root roles: - nginx
[root@ansible ansible]# ansible-playbook nginx_role.yml
查看服務是否啓動 [root@ansible ~]# ansible all -m shell -a "netstat -lntup | grep nginx" 192.168.192.129 | CHANGED | rc=0 >> tcp 0 0 0.0.0.0:123 0.0.0.0:* LISTEN 6102/nginx: master tcp6 0 0 :::123 :::* LISTEN 6102/nginx: master 查看啓動用戶及進程數 [root@ansible ~]# ansible all -m shell -a "ps aux | grep nginx" 192.168.192.129 | CHANGED | rc=0 >> root 6102 0.0 0.1 125092 2256 ? Ss 10:55 0:00 nginx: master process /usr/sbin/nginx brian 6103 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6104 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6105 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6106 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6107 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6108 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6109 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process brian 6110 0.0 0.3 129348 7036 ? S 10:55 0:00 nginx: worker process root 6377 45.0 0.0 113172 1196 pts/1 S+ 10:58 0:00 /bin/sh -c ps aux | grep nginx root 6379 0.0 0.0 112704 940 pts/1 S+ 10:58 0:00 grep nginx 嘗試訪問nginx [root@ansible ansible]# curl 192.168.192.129:123 Welcome to Brian Ansible
以上面的示例爲例:web
1) 定義多個角色調用 在nginx_role.yml文件中定義 --- - hosts: web remote_user: root roles: - nginx # nginx角色 - mysql # MySQL角色 2) 一個角色引用另外一個角色的任務 tasks目錄的main文件: - include: group.yml - include: user.yml - include: yum.yml - include: /etc/ansible/mysql/tasks/yum.yml # 調用MySQL角色的yum任務 - include: templ.yml - include: copyfile.yml - include: start.yml 3) 標籤(經過標籤指定要指定那個角色) 在nginx_role.yml文件中定義 --- - hosts: web remote_user: root roles: - { role: nginx, tags: ['web','http'] } - { role: mysql, tags: ['db','mysql'] } 使用(使用 -t 標籤名)執行 [root@ansible ansible]# ansible-playbook -t web /etc/ansible/nginx_role.yml 4) 使用流程控制語句 在nginx_role.yml文件中定義 --- - hosts: web remote_user: root roles: - { role: nginx, tags: ['web','http'] } - { role: mysql, tags: ['db','mysql'], when ansible_distribution_major_version == "7" }
舒適提示:
經過上面的一個nginx的示例,咱們能夠基本瞭解了ansible中role中的使用方法和規範,例子很簡單可是包含了經常使用的東西
上面的示例只是爲了學習和理解,並不適合在生產使用,後續我會退出一下在生產用的roles的文章,也能夠在https://galaxy.ansible.com/這個網站上去下載sql