Linux----------自動化運維工具-ansible


一、ansible簡介

Ansible
創始人,Michael DeHaan( Cobbler 與 Func 的作者)
2012-03-09,發布0.0.1版,紅帽收購
2015-10-17,Red Hat宣布收購

1.1 ansible特性

ansible的特性:

  • 模塊化:調用特定的模塊,完成特定任務
  • 有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
  • 支持自定義模塊
  • 基於Python語言實現
  • 部署簡單,基於python和SSH(默認已安裝),agentless
  • 安全,基於OpenSSH
  • 支持playbook編排任務
  • 冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況
  • 無需代理不依賴PKI(無需ssl)
  • 可使用任何編程語言寫模塊
    -YAML格式,編排任務,支持豐富的數據結構
  • 較強大的多層解決方案

1.2 ansible架構

1.3 ansible工作原理

1.4 ansible主要組成部分

ansible主要組成部分:

  • 1 ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
  • 2 INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
  • 3 MODULES:Ansible執行命令的功能模塊,多數為內置的核心模塊,也可自定義
  • 4 PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
  • 5 API:供第三方程序調用的應用程序編程接口
  • 6 ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執行工具

Ansible命令執行來源:

  • USER,普通用戶,即SYSTEM ADMINISTRATOR
  • CMDB(資產管理系統) API 調用
  • PUBLIC/PRIVATE CLOUD API調用
  • USER-> Ansible Playbook -> Ansibile

利用ansible實現管理的方式:

  • Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
  • Ansible-playbook 主要用於長期規划好的,大型項目的場景,需要有前提的規划

1.4.1 Ansible-playbook(劇本)

  • Ansible-playbook(劇本)執行過程:
    將已有編排好的任務集寫入Ansible-Playbook
    通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行

  • Ansible主要操作對象:
    HOSTS主機
    NETWORKING網絡設備

  • 注意事項
    執行ansible的主機一般稱為主控端,中控,master或堡壘機
    主控端Python版本需要2.6或以上
    被控端Python版本小於2.4需要安裝python-simplejson
    被控端如開啟SELinux需要安裝libselinux-python
    windows不能做為主控端

二、ansible配置

2.1 安裝ansible

(1)rpm包安裝: EPEL源
yum install ansible

(2)編譯安裝:
yum -y install python-jinja2 PyYAML python-paramiko
python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible

2.2 ansible配置文件

(1)配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄

(2)程序
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官

(3)網平台
/usr/bin/ansible-playbook 定制自動化任務,編排劇本工具
/usr/bin/ansible-pull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具

2.3 主機清單inventory

(1)Inventory 主機清單

  • ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名
  • 默認的inventory file為/etc/ansible/hosts
  • inventory file可以有多個,且也可以通過Dynamic
  • Inventory來動態生成

(2)/etc/ansible/hosts文件格式
inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸並到多個不同的組中;此外,當如若=目標主機使用了非默認的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明

ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機

  • 示例:
    [websrvs]
    www[01:100].example.com
    [dbsrvs]
    db-[a:f].example.com

2.4 ansible配置文件

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)

[defaults]
inventory = /etc/ansible/hosts             //主機列表配置文件
library = /usr/share/my_modules/       //庫文件存放目錄
remote_tmp = $HOME/.ansible/tmp   //臨時py命令文件存放在遠程主機目錄
local_tmp = $HOME/.ansible/tmp       //本機的臨時命令執行目錄
forks = 5                                              //默認並發數
sudo_user = root                                 // 默認sudo 用戶
ask_sudo_pass = True                        //每次執行ansible命令是否詢問ssh密碼
ask_pass = True
remote_port = 22
host_key_checking = False                 //檢查對應服務器的host_key,建議取消注釋

三、ansible系列命令

Ansible系列命令
ansible ansible-doc ansible-playbook ansible-vault
ansible-console ansible-galaxy ansible-pull

3.1 ansible-doc

ansible-doc: 顯示模塊幫助
ansible-doc [options] [module...]
-a 顯示所有模塊的文檔
-l, --list 列出可用模塊
-s, --snippet 顯示指定模塊的playbook片段
示例:
ansible-doc –l 列出所有模塊
ansible-doc ping 查看指定模塊幫助用法
ansible-doc –s ping 查看指定模塊幫助用法

3.2 ansible [-m module_name] [-a args]

ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯系各被管理節點
ansible [-m module_name] [-a args]
--version 顯示版本
-m module 指定模塊,默認為command
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫—list
-k, --ask-pass 提示連接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入sudo
-C, --check 檢查,並不執行
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
-b, --become 代替舊版的sudo 切換

3.3 ansible的Host-pattern

匹配主機的列表
All :表示所有Inventory中的所有主機
ansible all –m ping

  • :通配符
    ansible “” -m ping
    ansible 192.168.1.
    -m ping
    ansible “srvs” -m ping
    或關系
    ansible “websrvs:appsrvs” -m ping
    ansible “192.168.1.10:192.168.1.20” -m ping
    邏輯與
    ansible “websrvs:&dbsrvs” –m ping
    在websrvs組並且在dbsrvs組中的主機
    邏輯非
    ansible ‘websrvs:!dbsrvs’ –m ping
    在websrvs組,但不在dbsrvs組中的主機
    綜合邏輯
    ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
    正則表達式
    ansible “websrvs:&dbsrvs” –m ping
    ansible “~(web|db).
    .magedu.com” –m ping

3.4 ansible-galaxy

連接 https://galaxy.ansible.com 下載相應的roles
列出所有已安裝的galaxy
ansible-galaxy list
安裝galaxy
ansible-galaxy install geerlingguy.redis
刪除galaxy
ansible-galaxy remove geerlingguy.redis

3.5 ansible-pull

推送命令至遠程,效率無限提升,對運維要求較高
Ansible-playbook
ansible-playbook hello.yml

3.6 Ansible-vault

功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 創建新文件

3.7 ansibleI命令執行過程

1)ansible命令執行過程

  1. 加載自己的配置文件 默認/etc/ansible/ansible.cfg
  2. 加載自己對應的模塊文件,如command
  3. 通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
  4. 給文件+x執行
  5. 執行並返回結果
  6. 刪除臨時py文件,sleep 0退出
  • 執行狀態:
    綠色:執行成功並且不需要做改變的操作
    黃色:執行成功並且對目標主機做變更
    紅色:執行失敗

2)示例
以wang用戶執行ping存活檢測
ansible all -m ping -u wang -k
以wang sudo至root執行ping存活檢測
ansible all -m ping -u wang –b -k
以wang sudo至mage用戶執行ping存活檢測
ansible all -m ping -u wang –b -k --become-user mage
以wang sudo至root用戶執行ls
ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K

3.8 ansible常有模塊

1) Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功
此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現

2) Shell:和command相似,用shell執行命令
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &> /tmp/example.txt 這些復雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器

3) Script:運行腳本
-a "/PATH/TO/SCRIPT_FILE“
snsible websrvs -m script -a f1.sh

4) Copy:從服務器復制文件到客戶端,
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
如目標存在,默認覆蓋,此處指定先備份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件

5) Cron:計划任務
支持時間:minute,hour,day,month,weekday
ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 創建任務
ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務

6) Fetch:從客戶端取文件至服務器端,copy相反,目錄可先tar
ansible srv -m fetch -a ‘src=/root/a.sh
dest=/data/scripts’

7) File:設置文件屬性
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
Hostname:管理主機名
ansible node1 -m hostname -a “name=websrv”

8) Yum:管理包
ansible srv -m yum -a ‘name=httpd state=latest’ 安裝
ansible srv -m yum -a ‘name=httpd state=absent’ 刪除

9)Service:管理服務
ansible srv -m service -a 'name=httpd state=stopped'
ansible srv -m service -a 'name=httpd state=started'
ansible srv –m service –a ‘name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted'

10) User:管理用戶
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘ 刪除用戶及家目錄等數據

11) Group:管理組
ansible srv -m group -a "name=testgroup system=yes“
ansible srv -m group -a "name=testgroup state=absent"

3.9 Ansible-console:2.0+新增,可交互執行命令,支持tab

root@test (2)[f:10] $
執行用戶@當前操作的主機組 (當前組的主機數量)[f:並發數]$
設置並發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started

四、playbook

playbook是由一個或多個“play”組成的列表
play的主要功能在於將事先歸並為一組的主機裝扮成事先通過
ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個
playbook中,即可以讓它們聯同起來按事先編排的機制同唱一台大戲
Playbook采用YAML語言編寫

4.1 playbook原理

4.2 YAML介紹

YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)

  • 特性
    YAML的可讀性好
    YAML和腳本語言的交互性好
    YAML使用實現語言的數據類型
    YAML有一個一致的信息模型
    YAML易於實現
    YAML可以基於流來處理
    YAML表達能力強,擴展性好
    更多的內容及規范參見http://www.yaml.org

4.3 YAML語法介紹

List:列表,其所有元素均使用“-”打頭

  • 示例:
    // A list of tasty fruits
  • Apple
  • Orange
  • Strawberry
  • Mango

(1)簡介
在單一檔案中,可用連續三個連字號(——)區分多個檔案。另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾
次行開始正常寫Playbook的內容,一般建議寫明該Playbook的功能
使用#號注釋代碼
縮進必須是統一的,不能空格和tab混用
縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行來實現的
YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
k/v的值可同行寫也可換行寫。同行使用:分隔
v可是個字符串,也可是另一個列表
一個完整的代碼塊功能需最少元素需包括 name: task
一個name只能包括一個task
YAML文件擴展名通常為yml或yam

(2)示例
Dictionary:字典,通常由多個key與value構成

  • 示例:

// An employee record
name: Example Developer
job: Developer
skill: Elite
也可以將key:value放置於{}中進行表示,用,分隔多個key:value

  • 示例

// An employee record
{name: Example Developer, job: Developer, skill: Elite}

4.4 playbook核心元素

Hosts 執行的遠程主機列表
Tasks 任務集
Varniables 內置變量或自定義變量在playbook中調用
Templates 模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
Handlers 和notity結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
tags 標簽 指定某條任務執行,用於選擇運行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
ansible-playbook –t tagsname useradd.yml

4.4.1 playbook基礎組件

(1)Hosts:
playbook中的每一個play的目的都是為了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用於指定要執行指定任務的主機,須事先定義在主機清單中
可以是如下形式:
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs 兩個組的並集
Websrvs:&dbsrvs 兩個組的交集
webservers:!phoenix 在websrvs組,但不在dbsrvs組
示例: - hosts: websrvs:dbsrvs

(2)remote_user: 可用於Host和task中。也可以通過指定其通
過sudo的方式在遠程主機上執行任務,其可用於play全局或某
任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切
換的用戶

  • hosts: websrvs
    remote_user: root
    tasks:
  • name: test connection
    ping:
    remote_user: magedu
    sudo: yes 默認sudo為root
    sudo_user:wang sudo為wang

(3)task列表和action
play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后再開始第二個。在運行自下而下某playbook時,如果中途發生錯誤,所有已執行任務都將回滾,因此,在更正playbook后重新執行一次即可

  • task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味着多次執行是安全的,因為其結果均一致
    每個task都應該有其name,用於playbook的執行結果輸出,建議其內容盡可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用於輸出

tasks:任務列表
格式:(1) action: module arguments
(2) module: arguments 建議使用
注意:shell和command模塊后面跟命令,而非key=value
某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers
任務可以通過"tags“打標簽,而后可在ansible-playbook命令上使用-t指定進行調用
示例:
tasks:

  • name: disable selinux command: /sbin/setenforce 0

  • 如果命令或腳本的退出碼不為零,可以使用如下方式替代
    tasks:

  • name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true

  • 或者使用ignore_errors來忽略錯誤信息:
    tasks:

    • name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True

4.4.2 Handlers,notify

Handlers
是task列表,這些task與前述的task並沒有本質上的不同,用於當關注的資源發生變化時,才會采取一定的操作

notify
notify這個action可用於在每個play的最后被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成后一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作

示例1:

示例2:

4.4.3 tags使用

4.5 運行playbook

運行playbook的方式
ansible-playbook <filename.yml> ... [options]

常見選項
--check 只檢測可能會發生的改變,但不真正執行操作
--list-hosts 列出運行任務的主機
--limit 主機列表 只針對主機列表中的主機執行
-v 顯示過程 -vv -vvv 更詳細

示例:
ansible-playbook file.yml --check 只檢測
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs

示例:

4.6 playbook中變量

4.6.1 變量名

變量名:僅能由字母、數字和下划線組成,且只能以字母開頭
變量來源:
1 ansible setup facts 遠程主機的所有變量都可直接調用
2 在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高於公共變量
公共(組)變量:針對主機組中所有主機定義統一變量
3 通過命令行指定變量,優先級最高
ansible-playbook –e varname=value
4 在playbook中定義
vars:

  • var1: value1
  • var2: value2
    5 在role中定義

4.6.2 變量命名

變量名僅能由字母、數字和下划線組成,且只能以字母開頭
變量定義:key=value
示例:http_port=80
變量調用方式:
通過{{ variable_name }} 調用變量,且變量名前后必須有空格,有時用“{{ variable_name }}”才生效
ansible-playbook –e 選項指定
ansible-playbook test.yml -e "hosts=www user=mageedu"

示例:變量
示例:var.yml

  • hosts: websrvs
    remote_user: root
    tasks:
    • name: install package
      yum: name={{ pkname }} state=present
      ansible-playbook –e pkname=httpd var.yml

示例:變量
示例:var2.yml

  • hosts: websrvs
    remote_user: root
    vars:

    • username: user1
    • groupname: group1

    tasks:

    • name: create group
      group: name={{ groupname }} state=present
    • name: create user
      user: name={{ username }} state=present
      ansible-playbook var2.yml
      ansible-playbook -e "username=user2 groupname=group2” var2.yml

4.6.3 主機變量,組變量

可以在inventory中定義主機時為其添加主機變量以便於在playbook中使用
示例:
[websrvs]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=8080 maxRequestsPerChild=909

組變量
組變量是指賦予給指定組內所有主機上的在playbook中可用的變量
示例:
[websrvs]
www1.magedu.com
www2.magedu.com
[websrvs:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com

示例:
普通變量
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2

公共(組)變量
[websvrs:vars]
http_port=808
mark=“_”
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
ansible websvrs –m hostname –a ‘name={{ hname }}{{ mark }}{{http_port }}’

命令行指定變量:
ansible websvrs –e http_port=8000 –m hostname –a ‘name={{hname }}{{ mark }}{{ http_port }}’

4.6.4 模板templates

(1)模板介紹
文本文件,嵌套有腳本(使用模板編程語言編寫)
Jinja2語言,使用字面量,有下面形式
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and, or, not
流表達式:For If When

templates功能:根據模塊文件動態生成對應的配置文件
templates文件必須存放於templates目錄下,且命名為 .j2 結尾
yaml/yml 文件需和templates目錄平級,目錄結構如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2

(2)Templates示例
示例:利用templates 同步nginx配置文件

(3)Playbook中template變更替換

(4)Playbook中template算術運算
算法運算:
示例:
vim nginx.conf.j2
worker_processes {{ ansible_processor_vcpus*2 }};
worker_processes {{ ansible_processor_vcpus+2 }};

(5)when語句測試

  • 條件測試:如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法格式
    when語句
    在task后添加when子句即可使用條件測試;when語句支持Jinja2表達式語法
    示例:
    tasks:
  • name: "shutdown RedHat flavored systems"
    command: /sbin/shutdown -h now
    when: ansible_os_family == "RedHat"

示例1:

示例2:

4.6.5 迭代:with_items

迭代:當有需要重復性執行的任務時,可以使用迭代機制
對迭代項的引用,固定變量名為”item“
要在task中使用with_items給定要迭代的元素列表
列表格式:
字符串
字典

示例:

示例:

示例:

示例:

示例:

五、roles

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

  • 復雜場景:建議使用roles,代碼復用度高
    變更指定主機或主機組
    如命名不規范維護和傳承成本大
    某些功能需多個Playbook,通過Includes即可實現

5.1ansible roles目錄編排

5.2 roles目錄結構

每個角色,以特定的層級目錄結構進行組織
roles目錄結構:
playbook.yml
roles/
project/
tasks/
files/
vars/ 不常用
default/ 不常用
templates/
handlers/
meta/ 不常用

5.2.1 roles各目錄作用

roles/project/ :項目名稱,有以下子目錄
files/ :存放由copy或script模塊等調用的文件
templates/:template模塊查找所需要模板文件的目錄
tasks/:定義task,role的基本元素,至少應該包含一個名為
main.yml的文件;其它的文件需要在此文件中通過include進行包含
handlers/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
vars/:定義變量,至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含
meta/:定義當前角色的特殊設定及其依賴關系,至少應該包含一個名為main.yml的文件,其它文件需在此文件中通過include進行包含
default/:設定默認變量時使用此目錄中的main.yml文件

5.3 創建role

創建role的步驟
(1) 創建以roles命名的目錄
(2) 在roles目錄中分別創建以各角色名稱命名的目錄,如webservers等
(3) 在每個角色命名的目錄中分別創建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創建為空目錄,也可以不創建
(4) 在playbook文件中,調用各角色

5.3.1使用示例

5.4 playbook調用角色

(1)調用角色方法1:

  • hosts: websrvs
    remote_user: root
    roles:
  • mysql
  • memcached
  • nginx

(2)調用角色方法2:
傳遞變量給角色

  • hosts:
    remote_user:
    roles:
  • mysql
  • { role: nginx, username: nginx }
    鍵role用於指定角色名稱
    后續的k/v用於傳遞變量給角色

(3)調用角色方法3:還可基於條件測試實現角色調用
roles:

  • { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }

5.5 roles playbook tags使用

roles playbook tags使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM