ansible roles linux
在實際的工做當中,一個完整的項目其實是不少功能體的組合,若是將全部的功能寫在一個playbook中會存在如代碼耦合程度高、playbook長而維護成本大、靈活性低等一系列的問題。使用roles能巧妙的解決這一系列的問題。roles是ansible1.2版本後加入的新功能,適合於大項目playbook的編排架構。c++
一、ansible playbook中使用includes shell
include在ansible中起引用功能,不只能夠引用ansible的playbook文件,也能夠引用vars、handlers、file等文件。vim
(1)includes的使用場景windows
大量的playbook內容須要重複編寫centos
各tasks之間的功能須要相互調用架構
playbook中的內容過多函數
(2)include的用法spa
用法:操作系統
tasks:
- include: playbookname.yaml
修改主機名並添加用戶admin,在修改主機名的playbook中使用include導入添加用戶的playbook。
#修改主機名的playbook --- - hosts: test remote_user: root tasks: - name: change hostname hostname: name={{ servername }} - include: useradd.yaml #添加用戶的playbook --- - name: user add user: name=admin state=present ---------------------
(3)動態includes
動態的includes是指在知足必定的條件時,加載includes。
編寫安裝配置zabbix-agent的ansible playbook以下:
--- - hosts: "*" remote_user: root tasks: # 將安裝文件拷貝到遠程主機的/tmp目錄下 - name: copy zabbix-agent copy: src=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/ # 安裝zabbix-agent - name: install zabbix_agent yum: name=/tmp/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present # 啓動zabbix-agent - name: start zabbix_agent service: name="zabbix-agent" state=started # 導入配置zabbix-agent的playbook - include: configzabbix.yaml # 只有當系統爲centos6時才導入configzabbix.yaml when: ansible_distribution_major_version == "6" # 導入重啓zabbix-agent 的playbook - include: zabbix_agent_restart.yaml congfigzabbix.yaml的文件內容以下: --- - name: configure zabbix_agent template: src=/home/dayi123/ansible/0418/zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf
重啓zabbix_agent的配置文件zabbix_agent_restart.yaml內容以下:
---
- name: restart zabbix_agent
service: name=zabbix-agent state=restarted
二、ansible roles
經過includes能夠在playbook中導入playbook,在必定程度上解決了將代碼寫入一個playbook中耦合性低及維護困難等一些列的問題。若是使用include導入大量的playbook及模板文件時,沒有規範及統一的存放目錄及命名規範,也不利於維護,roles正好解決了這一問題。
roles主要依賴於目錄的命名和擺放,默認tasks/main.yml是全部任務的人口,使用roles的過程也能夠認爲是目錄規範化命名的過程。roles每一個目錄下均由main.yml定義該功能的任務集,tasks/main.yml默認執行全部定義的任務;roles目錄建議放在ansible.cfg中」roles_path」定義的目錄下。
(1)ansible roles目錄結構
一個完整的roles是由task、handlers、files、vars、templates、meta等一系列目錄組成,各目錄存放不一樣的文件實現不一樣的功能,在調用時直接下文件名便可調用。ansible roles目錄結構圖以下:
1)tasks目錄
tasks目錄用於存放ansible執行的任務,tasks目錄下必須存在main.yml文件,main.yml爲主函數,用於導入須要執行的任務。
2)handlers 目錄
handlers常常和notify搭配使用,當文件、進程及返回狀態發生變化時,notify經過handlers作響應的變動。handlers目錄下也須要包含main.yml,包含在在main.yml中的handlers將被執行
3)templates及file目錄
templates目錄及file目錄均用於ansible目錄文件處理,兩個目錄下均用於存放傳輸的文件,但templates目錄下存放的是」.j2」格式的文件模板,文件中能夠寫變量。
4)vars目錄
vars目錄下用於定義當前roles執行時使用的變量,應當存在main.yml文件。
5)default目錄
爲當前角色定義默認變量時使用此目錄,應該包含一個main.yml文件
6)meta目錄
應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係。
(2)ansible roles的執行方法
roles的執行方法同ansible-playbook執行方法同樣,須要調用roles的調用文件Rolesname.yml文件
rolesname.yml文件格式以下:
---
- hosts: all
remote_user: root
roles:
- Rolename
若是存在不一樣版本的操做系統是,roles調度文件能夠根據不一樣的操做系統類型執行不一樣的roles。
--- - hosts: all remote_user: root roles: - { role: rolename1, when: when: ansible_distribution_major_version == "6" } - { role: rolename1, when: when: ansible_distribution_major_version == "7" }
roles執行方式以下:
ansible-playbook rolesname.yml
(1)系統出書化的roles目錄結構:
[root@ansible-server ansible]# tree roles/ roles/ ├── init_system6 │ ├── files │ │ └── zabbix-agent-3.0.9-1.el6.x86_64.rpm │ ├── tasks │ │ ├── init_system.yml │ │ ├── installpack.yaml │ │ ├── install_zabbixagent.yml │ │ └── main.yml │ ├── templates │ │ └── zabbix_agent.conf.j2 │ └── vars │ └── main.yml └── initsystem.yml
(2)各配置文件內容
roles/initsystem.yml 中的內容:
---
- hosts: 10.0.0.13
remote_user: root
roles:
- init_system
roles/init_system/tasks/main.yml 中的內容:
--- - include: init_system.yml - include: installpack.yaml - include: install_zabbixagent.yml
roles/init_system/tasks/init_system.yml 中的內容(變量」servername」是配置在/etc/ansible/hosts中):
--- - name: hostname hostname: name={{ servername }} - name: disabled iptables service: name=iptables state=started enabled=no - name: shutdown selinux replace: dest=/etc/selinux/config regexp=^SELINUX=enforcing replace=SELINUX=disabled tags: selinux - name: install ntpdate yum: name=ntpdate state=present - name: lock-in time shell: ntpdate {{ timeserver }} && hwclock -w - name: crontab ntpdate cron: minute=1 hour=*/2 job='/usr/bin/ntpdate {{ timeserver }}' name=ntpdate - name: Change nofile limits. lineinfile: dest=/etc/security/limits.conf line={{ item }} with_items: - '* - nofile 65535' - '* soft nofile 65535' - '* hard nofile 65535'
roles/init_system/tasks/installpack.yaml 中的內容:
- name: Install RPM package yum: name={{ item }} state=present with_items: - gcc - gcc-c++ - make - lrzsz - vim
roles/init_system/tasks/install_zabbixagent.yml 中配置:
--- - name: mkdir /tmp/tools shell: mkdir /tmp/tools -p - name: copy zabbix-agent copy: src=zabbix-agent-3.0.9-1.el6.x86_64.rpm dest=/tmp/tools/ - name: install zabbix_agent yum: name=/tmp/tools/zabbix-agent-3.0.9-1.el6.x86_64.rpm state=present - name: configure zabbix_agent template: src=zabbix_agent.conf.j2 dest=/etc/zabbix/zabbix_agent.conf - name: start zabbix_agent service: name="zabbix-agent" state=started
roles/init_system/vars/main.yml 中的內容:
---
timeserver: time.windows.com
roles/init_system/templates/zabbix_agent.conf.j2爲zabbix的模板文件,其中部分配置了使用了模板
[root@ansible-server ansible]# egrep ^Hostname roles/init_system/templates/zabbix_agent.conf.j2 Hostname={{ servername }}
四、ansible galaxy ansible galaxy主要用於管理galaxy.ansible.com上的roles,默認下載的roles存放在/etc/ansible/roles目錄下,也可在ansible的配置文件中自動以存放目錄。在ansible使用過程當中,咱們能夠下載別人寫好的roles直接使用,也可將本身的roles上傳於galaxy.ansible.com上,在下載使用別人的roles前最好能將下載好的roles代碼查看一遍,而後再去使用。