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這兩個角色的目的。若是咱們給一個角色打上多個標籤須要寫成列表的形式,用中括號把多個標籤名給括起來,每一個標籤之間用逗號隔開,同時須要注意的是,標籤上一個字符串,須要用引號將其引發來。