Ansible之roles角色

  1、roles簡介php

  ansible自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只需在playbook中使用include指定便可。簡單來說,roles就是經過分別將變量、文件、任務、模板以及處理器放置於單獨目錄中,並能夠便捷的使用include指令將他們組織在一塊的一種機制。角色通常用於基於主機構建服務的場景中,但也能夠用於構建守護進程等場景中。複雜場景建議使用角色,代碼複用度高。mysql

  2、roles目錄結構nginx

  roles目錄結構如上所示,每一個角色以特定的層次目錄結構進行組織。其中roles/目錄下是每一個角色的目錄,好比上圖有git和user兩個角色,每一個角色下分別有tasks、files、vars等等目錄,files/目錄主要存放copy或scripts模塊等調用的文件;templates/目錄主要存放template模塊查找所須要的模板文件;tasks/定義task,role的基本元素,至少應該包含一個名爲main.yml的文件(這個文件就是tasks目錄的入口文件),其餘的文件須要在此文件中經過include進行包含;handlers/目錄主要存放觸發器任務的yml文件,一樣它裏面至少須要有一個main.yml的入口文件,其文件內容經過include指令引用其下文件;vars/目錄主要存放定義的變量文件,一樣也須要有main.yml文件;meta/目錄定義當前角色的特殊設定以及依賴關係,一樣這個目錄也須要有一個main.yml的入口文件;default/設定默認變量時使用此目錄中的main.yml文件;git

  經過上面的介紹,不難發現roles是依賴目錄的命名和擺放,默認tasks/main.yml是全部任務的入口,因此使用roles的過程能夠理解爲目錄規範化命名的過程。每一個目錄下均由main.yml定義該功能的任務集,tasks/main.yml默認執行全部指定的任務。roles的調用文件playbook_roles.yml的內容以下web

---
- hosts: websers
  remote_user: root
  
  roles:
    - roles_name  

  說明:定義好角色咱們還須要寫一個調用角色的playbook.yml 用於調用角色,其中咱們要寫明這個角色用於那些主機(在那些主機上執行),在遠程主機上以那個用戶來執行角色以及執行那些角色。sql

  角色的執行方法同執行playbook同樣,咱們只須要執行定義調用角色的playbook便可;roles目錄能夠擺放在/etc/ansible/ansible.cfg中"roles_path"定義路徑,也能夠和入口playbook文件存放在同級目錄,ansible沒有強制的要求,但仍是建議將代碼存放在代碼集預先規劃的目錄,以便管理。shell

  3、建立角色centos

  一般建立role的步驟有以下4步bash

  1)建立以roles命名的目錄memcached

  2)在roles目錄中分別建立以各自角色名稱命名的目錄,如nginx等

  3)在每一個角色命名的目錄中分別建立files、handlers、meta、tasks、templates、和vars目錄;若角色用不到的目錄能夠是空目錄,也能夠不建立

  4)在playbook文件中,調用各角色

示例:將咱們以前寫的playbook修改爲角色

playbook代碼以及目錄結構以下:

[root@test ~]#tree
.
├── install_nginx.yml
└── templates
    ├── centos6_nginx.conf.j2
    └── centos7_nginx.conf.j2

1 directory, 3 files
[root@test ~]#cat install_nginx.yml 
---
- hosts: websers
  remote_user: root

  tasks:
    - name: install nginx
      yum: name=nginx
    - name: templates config file centos6
      template: src=centos6_nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx
      when: ansible_distribution_major_version == "6"
    - name: templates config file centos 7
      template: src=centos7_nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx
      when: ansible_distribution_major_version == "7"
    - name: start service
      service: name=nginx state=started 
  handlers:
    - name: restart nginx
      service: name=nginx state=restarted

[root@test ~]#

改編成角色目錄結構以及各目錄文件內容以下

[root@test ~]#tree
.
├── install_nginx.yml
├── nginx_role.yml
├── roles
│   └── nginx
│       ├── handlers
│       │   ├── main.yml
│       │   └── restart_nginx.yml
│       ├── tasks
│       │   ├── install_nginx.yml
│       │   ├── main.yml
│       │   ├── nginx_service.yml
│       │   └── template_config_file.yml
│       └── templates
│           ├── centos6_nginx.conf.j2
│           └── centos7_nginx.conf.j2
└── templates
    ├── centos6_nginx.conf.j2
    └── centos7_nginx.conf.j2

6 directories, 12 files
[root@test ~]#cat roles/nginx/tasks/install_nginx.yml 
- name: install nginx
  yum: name=nginx
[root@test ~]#cat roles/nginx/tasks/template_config_file.yml 
- name: templates config file centos6
  template: src=centos6_nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx
  when: ansible_distribution_major_version == "6"
- name: tmeplates config file centos7
  template: src=centos7_nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx
  when: ansible_distribution_major_version == "7"

[root@test ~]#cat roles/nginx/tasks/nginx_service.yml 
- name: start service
  service: name=nginx state=started 
[root@test ~]#cat roles/nginx/tasks/main.yml 
- include: install_nginx.yml
- include: template_config_file.yml
- include: nginx_service.yml
[root@test ~]#cat roles/nginx/handlers/restart_nginx.yml 
- name: restart nginx
  service: name=nginx state=restarted
[root@test ~]#cat roles/nginx/handlers/main.yml 
- include: restart_nginx.yml
[root@test ~]#

  說明:以上目錄編排就實現了一個簡單角色,咱們把playbook內容分別用一個文件存放,而後按照每一個目錄的main.yml文件定義的順序依次執行,這裏只是定義好了一個角色,咱們還須要寫一個playbook來調用該角色便可。

[root@test ~]#cat nginx_role.yml 
---
- hosts: websers
  remote_user: root

  roles:
    - nginx
[root@test ~]#

  說明:以上就是一個調用咱們剛纔編排好的nginx角色的playbook。用ansilble-playbook 命令去執行以上調用角色的playbook,就至關於咱們以前寫的playbook功能徹底同樣。

[root@test ~]#ansible-playbook nginx_role.yml 

PLAY [websers] ******************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.0.128]
ok: [192.168.0.218]

TASK [nginx : install nginx] ****************************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218]

TASK [nginx : templates config file centos6] ************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218]

TASK [nginx : tmeplates config file centos7] ************************************************************************
skipping: [192.168.0.128]
skipping: [192.168.0.218]

TASK [nginx : start service] ****************************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218]

RUNNING HANDLER [nginx : restart nginx] *****************************************************************************
changed: [192.168.0.128]
changed: [192.168.0.218]

PLAY RECAP **********************************************************************************************************
192.168.0.128              : ok=5    changed=4    unreachable=0    failed=0   
192.168.0.218              : ok=5    changed=4    unreachable=0    failed=0   

[root@test ~]#ansible websers -m shell -a 'ss -ntl'     
192.168.0.128 | SUCCESS | rc=0 >>
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
LISTEN     0      128                      :::80                      :::*     
LISTEN     0      128                       *:80                       *:*     
LISTEN     0      128                      :::22                      :::*     
LISTEN     0      128                       *:22                       *:*     

192.168.0.218 | SUCCESS | rc=0 >>
State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
LISTEN     0      128                       *:35725                    *:*     
LISTEN     0      128                      :::111                     :::*     
LISTEN     0      128                       *:111                      *:*     
LISTEN     0      128                      :::80                      :::*     
LISTEN     0      128                       *:80                       *:*     
LISTEN     0      128                      :::22                      :::*     
LISTEN     0      128                       *:22                       *:*     
LISTEN     0      128               127.0.0.1:631                      *:*     
LISTEN     0      128                     ::1:631                     :::*     
LISTEN     0      100                     ::1:25                      :::*     
LISTEN     0      100               127.0.0.1:25                       *:*     
LISTEN     0      128                      :::47546                   :::*     

[root@test ~]#

  說明:可看到咱們把playbook改編成角色同咱們寫的playbook執行後的結果是同樣的,都實現了一樣的功能。

   4、角色調用

  方法一:寫好要調用的角色列表

---
- hosts: websers
  remote_user: root
 
  roles:
    - mysql
    - nginx
    - memcached        

  說明:此方法同上面示例同樣,咱們須要調用那些角色,只須要把角色名寫在角色列表裏便可

  方法二:調用角色的同時給角色傳遞變量

---
- hosts: websers
  remote_user: root
 
  roles:
    - mysql
    - {role: nginx,username: nginx}                                                                                  
    - memcached

  說明:此方法在調用nginx角色的同時,還給nginx角色傳遞了一個變量和值,role鍵用於指定角色名,後續能夠多個k/v,用於給角色傳遞變量。

  方法三:基於條件測試實現角色調用

---
- hosts: websers
  remote_user: root
 
  roles:
    - mysql
    - {role: nginx,username: nginx}
    - {role: memcached,when: ansible_distribution_major_version == "7",username: memcached}     

  說明:此方法實現了當系統版本爲7 的時候才調用memcached角色,換句話說只有在目標系統版本爲7 的系統才能調用memchched角色,同時它也能夠向腳本傳遞變量。

  5、roles playbook tags 的使用

上面角色調用的時候咱們介紹了三種方式,事實上咱們不只能給角色傳遞變量,咱們還能夠給角色打標籤,經過執行playbook 指定標籤 就能夠實現只執行具備指定標籤的角色,以下所示

---
- hosts: websers
  remote_user: root
 
  roles:
    - {role: mysql,tags: ["mysql","db"]}
    - {role: marridb,tags: ["mysql","db"]}
    - {role: nginx,tags: ["nginx","web"],username: nginx}
    - {role: memcached,when: ansible_distribution_major_version == "7",username: memcached}
    - {role: httpd,tags: ["httpd","web"]}
    - {role: php,tags: php}                                                                 

  說明:咱們在調用角色的時候,咱們能夠給角色打上多個標籤,其做用在於,這樣把同類角色打上相同的標籤,咱們在執行其playbook的時候就能夠選擇性的執行某些指定標籤的角色,好比以上咱們執行標籤爲「web」的角色,咱們能夠在執行playbook的時候用-t選項指定「web」,這樣咱們就能夠實現只在目標主機上執行httpd和nginx這兩個角色的目的。若是咱們給一個角色打上多個標籤須要寫成列表的形式,用中括號把多個標籤名給括起來,每一個標籤之間用逗號隔開,同時須要注意的是,標籤上一個字符串,須要用引號將其引發來。

相關文章
相關標籤/搜索