Ansible--Ansible之Roles

Ansible之Roles

Roles介紹

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

Roles目錄結構

各目錄含義解釋nginx

roles:          <--全部的角色必須放在roles目錄下,這個目錄能夠自定義位置,默認的位置在/etc/ansible/roles
  project:      <---具體的角色項目名稱,好比nginx、tomcat、php
    files:     <--用來存放由copy模塊或script模塊調用的文件。
    templates: <--用來存放jinjia2模板,template模塊會自動在此目錄中尋找jinjia2模板文件。
    tasks:     <--此目錄應當包含一個main.yml文件,用於定義此角色的任務列表,此文件能夠使用include包含其它的位於此目錄的task文件。
      main.yml
    handlers:  <--此目錄應當包含一個main.yml文件,用於定義此角色中觸發條件時執行的動做。
      main.yml
    vars:      <--此目錄應當包含一個main.yml文件,用於定義此角色用到的變量。
      main.yml
    defaults:  <--此目錄應當包含一個main.yml文件,用於爲當前角色設定默認變量。
      main.yml
    meta:      <--此目錄應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係。
      main.yml

Roles示例

經過ansible roles安裝配置httpd服務,此處的roles使用默認的路徑/etc/ansible/rolesgit

1)建立目錄github

[root@ansible ~]# cd /etc/ansible/roles/
# 建立須要用到的目錄
[root@ansible roles]# mkdir -p httpd/{handlers,tasks,templates,vars}
[root@ansible roles]# cd httpd/
[root@ansible httpd]# tree .
.
├── handlers
├── tasks
├── templates
└── vars

4 directories, 0 file

2)變量文件準備vars/main.ymlshell

[root@ansible httpd]# vim vars/main.yml
PORT: 8088        #指定httpd監聽的端口
USERNAME: www     #指定httpd運行用戶
GROUPNAME: www    #指定httpd運行組

3)配置文件模板準備templates/httpd.conf.j2vim

# copy一個本地的配置文件放在templates/下並已j2爲後綴
[root@ansible httpd]# cp /etc/httpd/conf/httpd.conf templates/httpd.conf.j2

# 進行一些修改,調用上面定義的變量
[root@ansible httpd]# vim templates/httpd.conf.j2
Listen {{ PORT }} 
User {{ USERNAME }}
Group {{ GROUPNAME }}

4)任務劇本編寫,建立用戶、建立組、安裝軟件、配置、啓動等centos

# 建立組的task
[root@ansible httpd]# vim tasks/group.yml
- name: Create a Startup Group
  group: name=www gid=60 system=yes

# 建立用戶的task
[root@ansible httpd]# vim tasks/user.yml
- name: Create Startup Users
  user: name=www uid=60 system=yes shell=/sbin/nologin

# 安裝軟件的task
[root@ansible httpd]# vim tasks/install.yml
- name: Install Package Httpd
  yum: name=httpd state=installed

# 配置軟件的task
[root@ansible httpd]# vim tasks/config.yml
- name: Copy Httpd Template File
  template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  notify: Restart Httpd

# 啓動軟件的task
[root@ansible httpd]# vim tasks/start.yml
- name: Start Httpd Service
  service: name=httpd state=started enabled=yes

# 編寫main.yml,將上面的這些task引入進來
[root@ansible httpd]# vim tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: start.ym

5)編寫重啓httpd的handlershandlers/main.ymltomcat

[root@ansible httpd]# vim handlers/main.yml
# 這裏的名字須要和task中的notify保持一致
- name: Restart Httpd
  service: name=httpd state=restarted

6)編寫主的httpd_roles.yml文件調用httpd角色post

[root@ansible httpd]# cd ..
[root@ansible roles]# vim httpd_roles.yml
---
- hosts: all
  remote_user: root
  roles:
    - role: httpd        #指定角色名稱

7)總體的一個目錄結構查看測試

[root@ansible roles]# tree .
.
├── httpd
│   ├── handlers
│   │   └── main.yml
│   ├── tasks
│   │   ├── config.yml
│   │   ├── group.yml
│   │   ├── install.yml
│   │   ├── main.yml
│   │   ├── start.yml
│   │   └── user.yml
│   ├── templates
│   │   └── httpd.conf.j2
│   └── vars
│       └── main.yml
└── httpd_roles.yml

5 directories, 10 files

8)測試playbook語法是否正確

[root@ansible roles]# ansible-playbook -C httpd_roles.yml 

PLAY [all] **************************************************************************************************

TASK [Gathering Facts] **************************************************************************************
ok: [192.168.1.33]
ok: [192.168.1.32]
ok: [192.168.1.31]
ok: [192.168.1.36]

TASK [httpd : Create a Startup Group] ***********************************************************************
changed: [192.168.1.31]
changed: [192.168.1.33]
changed: [192.168.1.36]
changed: [192.168.1.32]

TASK [httpd : Create Startup Users] *************************************************************************
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]
changed: [192.168.1.36]

TASK [httpd : Install Package Httpd] ************************************************************************
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]
changed: [192.168.1.36]

TASK [httpd : Copy Httpd Template File] *********************************************************************
changed: [192.168.1.33]
changed: [192.168.1.36]
changed: [192.168.1.32]
changed: [192.168.1.31]

TASK [httpd : Start Httpd Service] **************************************************************************
changed: [192.168.1.36]
changed: [192.168.1.31]
changed: [192.168.1.32]
changed: [192.168.1.33]

RUNNING HANDLER [httpd : Restart Httpd] *********************************************************************
changed: [192.168.1.36]
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]

PLAY RECAP **************************************************************************************************
192.168.1.31               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.32               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.33               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.36               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

9)上面的測試沒有問題,正式執行playbook

[root@ansible roles]# ansible-playbook -C httpd_roles.yml 

PLAY [all] **************************************************************************************************

TASK [Gathering Facts] **************************************************************************************
ok: [192.168.1.33]
ok: [192.168.1.32]
ok: [192.168.1.31]
ok: [192.168.1.36]

TASK [httpd : Create a Startup Group] ***********************************************************************
changed: [192.168.1.31]
changed: [192.168.1.33]
changed: [192.168.1.36]
changed: [192.168.1.32]

TASK [httpd : Create Startup Users] *************************************************************************
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]
changed: [192.168.1.36]

TASK [httpd : Install Package Httpd] ************************************************************************
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]
changed: [192.168.1.36]

TASK [httpd : Copy Httpd Template File] *********************************************************************
changed: [192.168.1.33]
changed: [192.168.1.36]
changed: [192.168.1.32]
changed: [192.168.1.31]

TASK [httpd : Start Httpd Service] **************************************************************************
changed: [192.168.1.36]
changed: [192.168.1.31]
changed: [192.168.1.32]
changed: [192.168.1.33]

RUNNING HANDLER [httpd : Restart Httpd] *********************************************************************
changed: [192.168.1.36]
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]

PLAY RECAP **************************************************************************************************
192.168.1.31               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.32               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.33               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.36               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@ansible roles]# ansible-playbook httpd_roles.yml 

PLAY [all] **************************************************************************************************

TASK [Gathering Facts] **************************************************************************************
ok: [192.168.1.32]
ok: [192.168.1.33]
ok: [192.168.1.31]
ok: [192.168.1.36]

TASK [httpd : Create a Startup Group] ***********************************************************************
changed: [192.168.1.32]
changed: [192.168.1.31]
changed: [192.168.1.33]
changed: [192.168.1.36]

TASK [httpd : Create Startup Users] *************************************************************************
changed: [192.168.1.31]
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.36]

TASK [httpd : Install Package Httpd] ************************************************************************
changed: [192.168.1.31]
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.36]

TASK [httpd : Copy Httpd Template File] *********************************************************************
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]
changed: [192.168.1.36]

TASK [httpd : Start Httpd Service] **************************************************************************
fatal: [192.168.1.36]: FAILED! => {"changed": false, "msg": "httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf: Include directory '/etc/httpd/conf.modules.d' not found\n"}
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]

RUNNING HANDLER [httpd : Restart Httpd] *********************************************************************
changed: [192.168.1.33]
changed: [192.168.1.32]
changed: [192.168.1.31]

PLAY RECAP **************************************************************************************************
192.168.1.31               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.32               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.33               : ok=7    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.36               : ok=5    changed=4    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

這裏有看到報錯,其緣由是由於192.168.1.36這臺機器是centos6系統,別的都是centos7系統,兩個系統安裝的httpd默認版本是不同的,因此報錯。若是須要優化。參考這裏

ansible roles總結

一、編寫任務(task)的時候,裏面不須要寫須要執行的主機,單純的寫某個任務是幹什麼的便可,裝軟件的就是裝軟件的,啓動的就是啓動的。單獨作某一件事便可,最後經過main.yml將這些單獨的任務安裝執行順序include進來便可,這樣方便維護且一目瞭然。
二、定義變量時候直接安裝k:v格式將變量寫在vars/main.yml文件便可,而後task或者template直接調用便可,會自動去vars/main.yml文件裏面去找。
三、定義handlers時候,直接在handlers/main.yml文件中寫須要作什麼事情便可,多可的話能夠所有寫在該文件裏面,也能夠像task那樣分開來寫,經過include引入同樣的能夠。在task調用notify時直接寫與handlers名字對應便可(兩者必須高度一直)。
四、模板文件同樣放在templates目錄下便可,task調用的時後直接寫文件名字便可,會自動去到templates裏面找。注意:若是是一個角色調用另一個角色的單個task時後,那麼task中若是有些模板或者文件,就得寫絕對路徑了。

相關文章
相關標籤/搜索