1. 程式人生 > 其它 >第十八章 Ansible-playbook-Role基礎介紹

第十八章 Ansible-playbook-Role基礎介紹

一、Ansible Roles概述

roles不管是Ansible還是saltstack,我在寫一鍵部署的時候,都不可能把所有的步驟全部寫入到一個'劇本'檔案當中,我們肯定需要把不同的工作模組,拆分開來,解耦,那麼說到解耦,我們就需要用到roles官方推薦,因為roles的目錄結構層次更加清晰。

例如:我們之前推薦大家寫一個base.yml裡面寫所有基礎優化的專案,其實把所有東西摞進去也是很雞肋的,不如我們把這些功能全部拆分開,誰需要使用,就呼叫即可。

建議:每個roles最好只使用一個tasks這樣方便我們去呼叫,能夠很好的做到解耦。(SOA)

二、Ansible Roles目錄結構

角色期望檔案位於某些目錄名稱中。角色必須至少包含其中一個目錄,但是排除任何未使用的目錄是完全正確的。在使用時,每個目錄必須包含一個main.yml檔案,其中包含相關內容:
production                # inventory file for production servers
staging                   # inventory file for staging environment

group_vars/
   group1.yml             # here we assign variables to particular groups
   group2.yml
host_vars/
   hostname1.yml          # here we assign variables to particular systems
   hostname2.yml

library/                  # if any custom modules, put them here (optional)
module_utils/             # if any custom module_utils to support modules, put them here (optional)
filter_plugins/           # if any custom filter plugins, put them here (optional)

site.yml                  # master playbook
webservers.yml            # playbook for webserver tier
dbservers.yml             # playbook for dbserver tier

roles/
    common/               # this hierarchy represents a "role"
        tasks/            #
            main.yml      #  <-- tasks file can include smaller files if warranted
        handlers/         #
            main.yml      #  <-- handlers file
        templates/        #  <-- files for use with the template resource
            ntp.conf.j2   #  <------- templates end in .j2
        files/            #
            bar.txt       #  <-- files for use with the copy resource
            foo.sh        #  <-- script files for use with the script resource
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role
        meta/             #
            main.yml      #  <-- role dependencies
        library/          # roles can also include custom modules
        module_utils/     # roles can also include custom module_utils
        lookup_plugins/   # or other types of plugins, like lookup in this case

    webtier/              # same kind of structure as "common" was above, done for the webtier role
    monitoring/           # ""
    fooapp/               # ""
site:是ansible的統一入口,就行呼叫的安裝服務總配置
webservers.yaml:主要是對ansible裡一些能做功能,yum等
roles:角色目錄
common:公共的roles目錄
nginx:角色的軟體目錄
tasks:包含角色要執行的主要任務列表
handlers:包含處理程式,可以由此角色使用,甚至可以在此角色之外的任何位置使用
defaults:角色預設的變數
vars:角色其他的變數
files:包含可以通過此角色部署的檔案
templates:包含可以通過此角色部署的模板
meta:角色定義的一些元資料

三、Ansible Roles目錄建立

1.手動建立

[root@m01 ~]# mkdir /project
[root@m01 ~]# cd /project/
[root@m01 /project]# touch site.yml
[root@m01 /project]# mkdir roles
[root@m01 /project]# cd roles/
[root@m01 /project/roles]# mkdir {nginx,php,myriadb,nfs-server,nfs-client}

2.使用命令建立

[root@m01 /project/roles]# ansible-galaxy init nginx
- Role nginx was created successfully
[root@m01 /project/roles]# tree ./
./
├── mariadb
├── nfs-client
├── nfs-server
├── nginx
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│     └── main.yml
└── php

13 directories, 8 files
[root@m01 /project/roles]#

四、Ansible Roles 依賴

roles允許你再使用roles時自動引入其他的roles。role依賴關係儲存在roles目錄中meta/main.yml檔案中。

例如:推送wordpress並解壓,前提條件,必須要安裝nginx和php,把服務跑起來,才能執行wordpress的頁面,此時我們就可以在wordpress的roles中定義依賴nginx和php的roles

[root@m01 roles]# vim /etc/ansible/roles/wordpress/meta/main.yml
dependencies:
  - { role: nginx }
  - { role: php }
  
如果編寫了meta目錄下的main.yml檔案,那麼Ansible會自動先執行meta目錄中main.yml檔案中的dependencies檔案,如上所示,就會先執行nginx和php的安裝。