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