1. 程式人生 > >Ansible使用介紹(三)templates及Roles角色

Ansible使用介紹(三)templates及Roles角色

role內各目錄中可用的檔案

  • tasks目錄:至少應該包含一個名為main.yml的檔案,其定義了此角色的任務列表;此檔案可以使用include包含其他的位於此目錄中的task檔案;
  • files目錄:存放由copy或script等模組呼叫的檔案;
  • templates目錄:templates模組會自動在此目錄中尋找Jinja2模板檔案;
  • handlers目錄:此目錄中應當包含一個main;
  • yml檔案,用於定義此角色用到的各handler:在handler中使用include包含的其他的handler檔案也應該位於此目錄中;
  • vars目錄:應當包含一個main.yml檔案,用於定義此角色用到的變數;
  • meta目錄:應當包含一個main.yml檔案,用於定義此角色的特殊設定及其依賴關係;ansible 1.3及其以後的版本才支援;
  • default目錄:為當前角色設定預設變數時使用此目錄;應當包含一個main.yml檔案;

一、前期環境準備

二、Playbook中模板templates的用法

三、Playbook中邏輯語句的用法

四、Roles角色詳解

2[JZOSNRRIKI@ZJKJ40O67C

一、環境搭建:

前期準備:一臺虛擬機器作為ansible,三臺虛擬機器作為被控端node

主控端:

主機名:ansible

系統版本:CentOS6.9

被控端:

主機名:node1

CPU核心數:4

系統版本:CentSO7.4

主機名:node2

CPU核心數:2

系統版本:CentSO6.9

主機名:node3

CPU核心數:1

系統版本:CentSO6.9

前期準備

/etc/ansible/hosts檔案主機列表配置如下:

前期準備host

二、Playbook中模板templates的用法

templates模板:

功能:根據模組檔案動態生成對應的配置檔案

使用方法:

(1)templates檔案必須存放在templates目錄下,且以.j2為字尾

(2)templates模組只能被playbook呼叫

(3)yam檔案需和templates目錄平級,目錄結構如下:

./

├── temnginx.yml

└── templates

└── nginx.conf.j2

templates使用形式:

字串:使用單引號或雙引號

數字:整數,浮點數

列表:[item1, item2, …]

元組:(item1, item2, …)

字典:{key1:value1, key2:value2, …}

布林型:true/false

算術運算:+, -, *, /, //, %, **

比較操作:==, !=, >, >=, <, <=

邏輯運算:and, or, not

流表示式:For If When

示例1:使用template傳輸配置檔案

cp /etc/nginx/nginx.conf  templates/nginx.conf.j2

vim testtemplate.yml

– hosts: os6

  remote_user: root

  tasks:

    – name: install package

      yum: name=nginx

    – name: copy template

      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

    – name: start service

      service: name=nginx state=started enabled=yes

執行結果:執行playbook後,我們發現work process程序數量與虛擬機器cpu核心數量是一致的,接下來我

們將把配置模板中的work process程序數量與系統自帶變數結合起來引用。

temp1

示例2:template引用系統變數

ansible websrvs -m setup |grep ‘cpu’

vim templates/nginx.conf.j2

worker_processes {{ ansible_processor_vcpus+2 }};

tmpl2

vim testtemplate.yml

– hosts:os6

  remote_user: root

  tasks:

    – name: install package

      yum: name=nginx

    – name: copy template

      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

      notify: restart service

    – name: start service

      service: name=nginx state=started enabled=yes

  handlers:

    – name: restart service

      service:name=nginx state=restarted

執行結果:再次執行playbook後,我們發現worker process程序數量等於cpu核心數量加2,這樣template

就能幫我們實現根據不同主機效能定製相應的配置。

temp3

示例3:hosts檔案普通變數修改nginx服務埠

vim /etc/ansible/hosts

192.168.30.101 httpd_port=81

192.168.30.102 httpd_port=82

vim templates/nginx.conf.j2

 server {

       listen       {{ http_port }} default server

       listen       [::]:{{ http_prot }} default server

  }

三、Playbook中邏輯語句的使用

When:

條件測試:如果需要根據變數、facts或此前任務的執行結果來做為某task執行與

否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法

檢視發行版本系統變數:

ansible srv -m setup filter=”*distribution”

when1

示例1:

vim testtemplate.yml

– hosts: all

  remote_user: root

  tasks:

    – name: install package

      yum: name=nginx

    – name: copy template for centos7

      template: src=nginx.conf7.j2 dest=/etc/nginx/nginx.conf

      when: ansible_distribution_major_version == “7”

      notify: restart service

    – name: copy template for centos6

      template: src=nginx.conf6.j2 dest=/etc/nginx/nginx.conf

      when: ansible_distribution_major_version == “6”

      notify: restart service

    – name: start service

      service: name=nginx state=started enabled=yes

  handlers:

    – name: restart service

      service:name=nginx state=restarted

執行結果:當when語句不匹配時,將skipping直接跳過,僅執行與when語句匹配的語句內容,最終

CentOS6,7根據不同的版本號生成對應的配置並啟動服務。

when2

with_items:迭代

迭代:當有需要重複性執行的任務時,可以使用迭代機制

對迭代項的引用,固定變數名為“item”

要在task中使用with_items給定要迭代的元素列表

列表格式:

字串

字典

示例1:利用迭代一次建立多個檔案,安裝多個命令包

vim testitem.yml

– hosts: all

  remote_user: root

  tasks:

    – name: create some file

      file: name=/data/{{ item}}  state=touch

      when: ansible_distribution_major_version == “7”

      with_items:

        – file1

        – file2

        – file3

    – name: install some packages

      yum: name={{ item }}

      with_items:

        – htop

        – sl

        – hping3

執行結果:當系統為CentOS7版本時,在/data目錄下建立file1-3檔案,安裝htop,sl,hping3命令

迭代1

示例2:使用迭代建立組

vim testitem2.yml

– hosts: all

  remote_user: root

  tasks:

    – name: create some groups

      group: name={{ item }}

      when: ansible_distribution_major_version == “7”

      with_items:

        – g1

        – g2

        – g3

執行結果:當系統版本為CentOS7時,建立g1,g2,g3組

迭代2

示例3:使用迭代配合字典建立使用者與組

vim testitem2.yml

– hosts: all

  remote_user: root

  tasks:

    – name: create some groups

      group: name={{ item }}

      with_items:

        – g1

        – g2

        – g3

    – name: create some users

      user: name={{ item.name }} group={{ item.group }}

      with_items:

        – { name: ‘user1’,group: ‘g1’ }

        – { name: ‘user2’,group: ‘g2’ }

        – { name: ‘user3’,group: ‘g3’ }

執行結果:所有主機上建立user1,user2,user3使用者,且主組為g1,g2,g3

迭代3

for 與  if

示例1:template,for

vim for1.conf.j2

{% for port in ports %}

server{

         listen {{ port }}

}

{% endfor %}

vim testfor.yml

– hosts: websrvs

  remote_user: root

  vars:

    ports:

      – 81

      – 82

      – 83

  tasks:

    – name: copy conf

       template: src=for1.conf.j2  dest=/data/for1.conf

執行結果:每臺主機生成for1.conf檔案,內容如下

for1

示例2:template,for,引用字典

vim for2.conf.j2

{% for port in ports %}

server{

         listen {{ port.listen_port }}

}

{% endfor %}

cp testfor.yml testfor2.yml

vim testfor2.yml

– hosts: websrvs

  remote_user: root

  vars:

    ports:

      – listen_port: 81

      – listen_port: 82

      – listen_port: 83

  tasks:

    – name: copy conf

      template:src=for2.conf.j2  dest/data/for2.conf

執行結果:每臺主機生成for2.conf檔案,內容如下

for2

示例3:for迴圈中呼叫字典

vim for3.conf.j2

{% for p in ports %}

server{

         listen {{ p.port }}

         servername {{ p.name }}

    documentroot {{ p.rootdir }}

}

{% endfor %}

cp testfor2.yml testfor3.yml

vim testfor3.yml

– hosts: websrvs

  remote_user: root

  vars:

    ports:

      – web1:

        port: 81

        name: web1.magedu.com

        rootdir: /data/website1

      – web2:

        port: 82

        name: web2.magedu.com

        rootdir: /data/website2

      – web3:

        port: 83

        name: web3.magedu.com

        rootdir: /data/website3

  tasks:

    – name: copy conf

      template:src=for3.conf.j2  dest/data/for3.conf

執行結果:每臺主機生成for3.conf檔案,內容如下

for3

示例4:for迴圈中呼叫if

vim for4.conf.j2

{% for p in ports %}

server{

         listen {{ p.port }}

{% if p.name is defined %}

         servername {{ p.name }}

{% endif %}

        documentroot {{ p.rootdir }}

}

{% endfor %}

cp testfor3.yml testfor4.yml

vim testfor4.yml

– hosts: websrvs

  remote_user: root

  vars:

    ports:

      – web1:

        port: 81

        #name: web1.magedu.com

         rootdir: /data/website1

      – web2:

        port: 82

        name: web2.magedu.com

         rootdir: /data/website1

      – web3:

        port: 83

        #name: web3.magedu.com

         rootdir: /data/website1

  tasks:

    – name: copy conf

      template:src=for4.conf.j2  dest/data/for4.conf

執行結果:每臺主機生成for3.conf檔案,內容如下,web1與web3的name沒賦值,所有跳過,web2的

name被賦值,檔案中輸出結果

for4

四、Roles角色

角色(roles):角色集合

roles/

  mysql/

   httpd/

   nginx/

   memcached/

/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檔案

建議:roles建立在ansible目錄

mkdir roles

mkdir roles/{httpd,mysql,memcache,nginx} -pv

示例1:定義nginx角色

思路:

niginx

1.group:nginx

2.user:nginx

3.yum:nginx

4.template:nigin.conf.j2

5.service:nginx

目錄結構如下:

nginx目錄結構

cd nginx

mkdir tasks templates

cd tasks

vim group.yml

– name: create group

  group: name=nginx gid=80

vim user.yml

– name: create user

  user: name=nginx group=nginx uid=80 shell=/sbin/noligin

vim yum.yml

– name: install package

  yum: name=nginx

vim start.yml

– name: start service

  service: name=nginx state=started enabled=yes

vim restart.yml

– name: restart service

  service: name=nginx state=restarted

cp /etc/nginx/nginx.conf  template/nginx.conf.j2

vim template/nginx.conf.j2

worker_processes {{ ansible_processes_vcpus+2 }};

vim templ.yml

– name: copy conf

template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

vim main.yml

– include: group.yml

– include: user.yml

– include: yum.yml

– include: templ.yml

– include: start.yml

呼叫角色的劇本要和roles目錄在同一資料夾

vim nginx_roles.yml

– hosts: websrvs

  romete_user: root

  roles:

    – role: nginx

ansible-playbook -C nginx_role.yml

執行結果如下:

nginx

示例2:增加httpd角色

結構目錄如下:

httpd目錄機構

cd httpd/

mkdir tasks

cd tasks/

vim user.yml

– name: create user

  user: name=apache system=yes shell=/sbin/nologin

cd httpd/

mkdir files

cp httpd.conf   files/

cd /tasks/

模擬編譯安裝yum

vim copyfile.yml

– name: copy files

  copy: src=httpd.conf dest=/data/ own=apache

vim main.yml

– incluse: user.yml

– incluse: copyfile.yml

vim httpd_role.yml

– hosts: websrvs

  romete_user: root

  roles:

    – role: httpd

執行結果如下:

httpd執行結果

示例3:同時呼叫兩個roles角色

目錄結構:

somerole目錄結構

cp niginx_role.yml some_role.yml

vim some_role.yml

– hosts: websrvs

  romete_user: root

  roles:

    – role: httpd

    – role: nginx

執行結果如下:

somerole執行結果

示例4:一個roles角色呼叫另一個roles角色的task任務

目標:nginx呼叫httpd的copyfile

vim main.yml

– include: group.yml

– include: user.yml

– include: yum.yml

– include: templ.yml

– include: start.yml

– inclide: roles/httpd/tasks/copyfile.yml

示例5:roles playbook tags

目錄結構如下:

tags目錄結構

cp -r nginx/ app/     首先虛構一個app的role

vim some_role2.yml

– hosts: websrvs

  romete_user: root

  roles:

    – { role: httpd,tags:[‘web’,’httpd’]}

    – { role: nginx,tags:[‘web’,’nginx’]}

    – { role: app,tags:’app’}

ansible-playbook -t web some_role.yml

執行結果:只執行標籤為web的role

tags執行結果

示例6:roles playbook tags when

cp -r nginx/ app/     虛構一個role

vim some_role3.yml

– hosts: all

  romete_user: root

  roles:

   – { role: httpd,tags:[‘web’,’httpd’]}

   – { role: nginx,tags:[‘web’,’nginx’],when: ansible_distribution_major_version==”7″}

   – { role: app,tags:’app’}

ansible-playbook -t web some_role.yml

執行結果:至執行tags標籤為web的roles,當主版本號為7時,才執行nginx的role

tags when

示例7:綜合演示

結構目錄:

綜合演示結構目錄

rm -rf /app

mkdir app

cd app

mkdir tasks templates vars handlers files

cd tasks/

vim group.yml

– name: create group

  group: name=app system=yes gid=123

vim user.yml

– name: create user

  user: name=app group=app system=yes shell=/sbin/nologin uid=123

vim yum.yml

– name: install package

   yum: name=httpd

cp /etc/httpd/conf/httpd.conf /templates/httpd.conf.j2

vim temlates/httpd.conf.j2

Listen {{ ansible_processor_vcpus*10 }}

User {{ username }}

Group {{ groupname }}

vim /vars/main.yml

username: app

groupname: app

vim templ.yml

– name: copy conf

  temlplate: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

  notify: restart service

vim start.yml

– name: start service

   service: name=httpd state=started enabled=yes

vim handlers/main.yml

– name: restart service

   service: name=httpd state=restarted

touch files/vhosts.conf

vim copyfile.yml

– name: copy config

   copy: src=vhosts.conf  dest=/ect/httpd/conf.d/

vim main.yml

– include: group.yml

– include: user.yml

– include: yum.yml

– include: templ.yml

– include: copyfile.yml

– include: start.yml

cd ansible/

vim app_role.yml

– hosts: websrvs

  remote_user: root

  roles:

    – role: app

執行結果如下:

綜合演示執行結果

示例8:部署memcached,佔用記憶體為實體記憶體1/4

memcached

yum install memcached

目錄結構:

memcached目錄結構

cp /etc/sysconfig/memcached templates/memcached.j2

vim memcached.j2

CACHESIZE=”{{ ansible_memtotal_mb//4 }}”

vim tasks/yum.yml

– name: install package

   yum: name=memcached

vim templ.yum

– name: copy conf

   template: src=memcached.j2 dest=/etc/sysconfig/memcached

vim start.yml

– name: start service

  service: name=memcached state=started enabled=yes

vim main.yml

– include: yum.yml

– include: templ.yml

– inculde: start.yml

vim memcached_role.yml

– hosts: os6

   remote_user: root

   roles:

    – role: memcached

ansible-playbook memcached_role.yml

執行結果如下:

memcached執行結果

遠端檢視配置檔案,確認生效:

memcached確認生效