ansible使用三(ansible roles)


ansible roles 

  在實際的工作當中,一個完整的項目實際上是很多功能體的組合,如果將所有的功能寫在一個playbook中會存在如代碼耦合程度高、playbook長而維護成本大、靈活性低等一系列的問題。使用roles能巧妙的解決這一系列的問題。roles是ansible1.2版本后加入的新功能,適合於大項目playbook的編排架構。

1、ansible playbook中使用includes 

    include在ansible中起引用功能,不僅可以引用ansible的playbook文件,也可以引用vars、handlers、file等文件。

(1)includes的使用場景

         大量的playbook內容需要重復編寫

         各tasks之間的功能需要相互調用

         playbook中的內容過多

(2)include的用法

         用法:

                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

2、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

3、創建roles初始化系統

(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 }}

4、ansible galaxy
      ansible galaxy主要用於管理galaxy.ansible.com上的roles,默認下載的roles存放在/etc/ansible/roles目錄下,也可在ansible的配置文件中自動以存放目錄。在ansible使用過程中,我們可以下載別人寫好的roles直接使用,也可將自己的roles上傳於galaxy.ansible.com上,在下載使用別人的roles前最好能將下載好的roles代碼查看一遍,然后再去使用。


免責聲明!

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



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