1.Ansible roles概述
Ansible的角色(roles)是一种组织和复用Ansible任务和变量的机制。角色允许将相关的任务、变量和文件组织在一起,以便在多个Playbook中重复使用。
角色是Ansible的一种抽象层级,它将Playbook中的任务、变量和文件组织成更高级别的概念。通过使用角色,可以将复杂的任务和配置逻辑分解为更小、更可管理的部分,并使代码更加模块化和可重用
一个角色通常包含以下目录结构:
roles/ myrole/ tasks/ main.yml handlers/ main.yml templates/ template.j2 files/ myfile.txt vars/ main.yml defaults/ main.yml meta/ main.yml
tasks/目录:包含角色执行的任务文件,通常是main.yml。这些任务定义了角色的主要功能。
handlers/目录:包含角色的处理程序文件,通常是main.yml。处理程序是在特定事件触发时执行的任务,例如服务重启或配置文件重载。
templates/目录:包含角色使用的Jinja2模板文件。这些模板可以根据变量的值生成配置文件等。
files/目录:包含角色使用的普通文件,例如脚本或配置文件。
vars/目录:包含角色使用的变量文件,通常是main.yml。这些变量可以在任务和模板中使用。
defaults/目录:包含角色的默认变量文件,通常是main.yml。这些变量的默认值会被其他变量覆盖。
meta/目录:包含角色的元数据文件,通常是main.yml。元数据文件可以包含角色的依赖关系和其他相关信息。
使用角色的步骤如下:
在Ansible项目的roles/目录下创建一个新的目录,例如myrole/。
在myrole/目录下创建相关的子目录和文件,按照上述目录结构组织角色的任务、变量和文件。
在Playbook中使用角色:在Playbook中使用roles关键字指定要使用的角色。例如:
- name: My Playbook hosts: myhosts roles: - myrole
这将使用名为myrole的角色来执行任务。
角色的优点包括:
重用性:角色可以在多个Playbook中重复使用,提高了代码的可维护性和可重用性。
组织性:角色提供了一种组织任务、变量和文件的结构化方式,使代码更易于理解和维护。
可扩展性:角色可以包含其他角色作为依赖项,使得构建复杂的配置和部署流程变得更加灵活和可扩展。
总之,Ansible的角色是一种组织和复用Ansible任务和变量的机制。通过创建角色并在Playbook中使用它们,可以提高Ansible代码的可维护性和可重用性。
2.Ansible Roles依赖关系
roles允许您在使用role时自动引入其他 role。role依赖关系存储在role目录中meta/main.yml文件中。
例如:安装wordpress需要先确保nginx与PHP都能正常运行,此时可以在 wordpress的role中定义,依赖Nginx与PHP-fpm的roles。
[root@devops ~]# cat /root/roles/wordpress/meta/main.yml
3.使用roles
创建目录
[root@ansible /server/playbook]$ mkdir basic/{tasks,templates,handlers,files} -p
[root@ansible /server/playbook]$ tree basic/ basic/ ├── files ├── handlers ├── tasks └── templates
调用角色
[root@ansible /server/playbook]$ cat top.yml --- - hosts: all roles: - role: basic
剧本
[root@ansible /server/playbook]$ cat basic/tasks/main.yml - name: Base repo yum_repository: name: Base description: Base baseurl: http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck: yes gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 - name: epel repo yum_repository: name: epel description: epel baseurl: http://mirrors.aliyun.com/epel/7/$basearch gpgcheck: no - name: released updates yum_repository: name: updates description: updates baseurl: http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ gpgcheck: yes gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 - name: extras repository yum_repository: name: extras description: extras baseurl: http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/ gpgcheck: yes gpgkey: http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 - name: nginx Repo yum_repository: name: nginx description: nginx repo baseurl: http://nginx.org/packages/centos/$releasever/$basearch/ enabled: yes gpgcheck: yes gpgkey: https://nginx.org/keys/nginx_signing.key when: ( ansible_hostname is match("web|lb") ) - name: php repo yum_repository: name: php description: php baseurl: http://us-east.repo.webtatic.com/yum/el7/x86_64/ enabled: yes gpgcheck: yes when: ( ansible_hostname is match("web") ) - name: Install Software yum: name: - tree - vim - lrzsz - iotop - htop - nc - unzip - nmap - telnet - wget - zip - psmisc - ntpdate state: present - name: Stop firewalld systemd: name: firewalld state: stopped enabled: no - name: disabled selinux selinux: state: disabled - name: groupadd group: name: dmxsp gid: 789 - name: useradd user: name: dmxsp uid: 789 group: dmxsp shell: /sbin/nologin create_home: no - name: configure crond time cron: name: sync time minute: "*/2" job: "/sbin/ntpdate ntp1.aliyun.com &>>/dev/null" - name: mkdir scripts dir file: path: /server/scripts/ state: directory - name: push server backup scripts copy: src: files/backup-conf.sh dest: /server/scripts/ - name: configure crond backup cron: name: backup everyday minute: 00 hour: 00 job: "sh /server/scripts/backup-conf.sh &>>/dev/null"
执行
[root@ansible /server/playbook]$ ansible-playbook top.yml
目录
[root@ansible /server/playbook]$ tree basic/ basic/ ├── files │ └── backup-conf.sh ├── handlers ├── tasks │ └── main.yml └── templates