Ansible--roles

簡介

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目錄

vars目錄:
main.yml文件: 定義一些變量,給nginx的模板文件使用,內容以下:
nginx_port: 123
nginx_user: brian

files目錄

files目錄:
index.html文件:給nginx的主頁文件使用copy模塊拷貝到被管理主機,內容以下:
Welcome to Brian Ansible

templates目錄

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目錄

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目錄

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

本站公眾號
   歡迎關注本站公眾號,獲取更多信息