ansible使用三(ansible roles)

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

三、建立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 }}

四、ansible galaxy      ansible galaxy主要用于管理galaxy.ansible.com上的roles,默认下载的roles存放在/etc/ansible/roles目录下,也可在ansible的配置文件中自动以存放目录。在ansible使用过程当中,咱们能够下载别人写好的roles直接使用,也可将本身的roles上传于galaxy.ansible.com上,在下载使用别人的roles前最好能将下载好的roles代码查看一遍,而后再去使用。

相关文章
相关标签/搜索