Ansible roles简介
- Ansible roles是为了层次化、结构化地组织Playbook。
- roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。
- roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高。
- 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割成片段来执行。
roles目录结构
roles: <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles
project: <---具体的角色项目名称,比如nginx、tomcat、php
files: <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks: <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
main.yml
handlers: <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
main.yml
vars: <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
main.yml
defaults: <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
main.yml
meta: <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
main.yml
角色基本使用:
创建role的步骤
1.创建以roles命名的目录
2.在roles目录中分别创建以各角色名称命名的目录,如httpd等
在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
3.在playbook文件中,调用个角色
先创建一个roles目录:
[root@browserlb ~]# mkdir ansible
[root@browserlb ~]# cd ansible/
[root@browserlb ansible]# mkdir roles
[root@browserlb ansible]# mkdir roles/{httpd,mysql,memcache} -pv
mkdir: created directory ‘roles/httpd’
mkdir: created directory ‘roles/mysql’
mkdir: created directory ‘roles/memcache’
[root@browserlb ansible]# tree roles/
roles/
├── httpd
├── memcache
└── mysql
3 directories, 0 files
创建nginx目录
[root@browserlb ansible]# mkdir roles/nginx
卸载之前安装的nginx:
[root@browserlb ansible]# ansible all -m shell -a "yum -y remove nginx"
删除已有的nginx组和nginx用户:
[root@browserlb ansible]# ansible all -m shell -a "userdel -r nginx"
确保已删除:
[root@browserlb ansible]# ansible all -m shell -a "getent passwd | grep nginx"
[root@browserlb ansible]# ansible all -m shell -a "getent group | grep nginx"
# roles(角色)和playbook.yml(剧本)是同级单位;
创建需要的任务文件和模板文件:
[root@browserlb roles]# cd nginx/
[root@browserlb nginx]# mkdir tasks templates
[root@browserlb nginx]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 14 13:40 tasks
drwxr-xr-x. 2 root root 6 Apr 14 13:40 templates
编写所需的任务
[root@browserlb nginx]# cd tasks/
创建组
[root@browserlb tasks]# vi group.yml
- - name: create group
- group: name=nginx gid=80
创建用户
[root@browserlb tasks]# vi user.yml
- - name: create user
- user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin
安装nginx软件
[root@browserlb tasks]# vi yum.yml
- - name: install package
- yum: name=nginx
启动服务
[root@browserlb tasks]# vi start.yml
- - name: start service
- service: name=nginx state=started enabled=yes
重启服务
[root@browserlb tasks]# vi restart.yml
- - name: restart service
- service: name=nginx state=restarted
copy一个本地的配置文件放在templates/下并已j2为后缀
[root@browserlb tasks]# cd /root/ansible/roles/nginx/templates/
[root@browserlb templates]# yum -y install nginx
[root@browserlb templates]# cp /etc/nginx/nginx.conf ./nginx.conf.j2
创建一个调用模板:
[root@browserlb templates]# cd ../tasks/
[root@browserlb tasks]# vi temp1.yml
- - name: copy conf
- template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
创建总tasks文件来控制tasks执行顺序:
[root@browserlb tasks]# vi main.yml
- - include: group.yml
- - include: user.yml
- - include: yum.yml
- - include: temp1.yml
- - include: start.yml
创建调用角色的剧本:(这个总的playbook要与roles平级)
[root@browserlb tasks]# cd /root/ansible/
[root@browserlb ansible]# vi nginx_role.yml
执行剧本并查看结果
[root@browserlb ansible]# ansible-playbook nginx_role.yml
- - hosts: local
- become: yes
- become_user: root
- roles:
- - role: nginx
[root@browserlb ansible]# ansible local -m shell -a "ps aux | grep nginx"
roles高级用法:
部署一个httpd服务
[root@browserlb ansible]# cd roles/httpd/
[root@browserlb httpd]# mkdir tasks
卸载之前安装的httpd
[root@browserlb httpd]# ansible all -m shell -a 'yum -y remove httpd'
删除用户apache
[root@browserlb httpd]# ansible all -m user -a 'name=apache state=absent'
创建用户
[root@browserlb httpd]# cd tasks/
[root@browserlb tasks]# vi user.yml
- - name: create user
- user: name=apache system=yes shell=/sbin/nologin
创建files目录并把要复制的文件放进去
[root@browserlb httpd]# mkdir files
[root@browserlb httpd]# yum -y install httpd
[root@browserlb httpd]# cp /etc/httpd/conf/httpd.conf ./files/
复制文件
[root@browserlb tasks]# vi copyfile.yml
- - name: copy files
- copy: src=httpd.conf dest=/data/ owner=apache
创建总tasks文件来控制tasks执行顺序
[root@browserlb tasks]# vi main.yml
- - include: user.yml
- - include: copyfile.yml
创建调用角色的剧本:
[root@browserlb tasks]# cd /root/ansible/
[root@browserlb ansible]# vi httpd_role.yml
- - hosts: local
- become: yes
- become_user: root
- roles:
- - httpd
执行并验证上面配置的两个任务
- [root@browserlb ansible]# ansible-playbook httpd_role.yml
- [root@browserlb ansible]# ansible local -m shell -a "ls -l /data"
- [root@browserlb ansible]# ansible local -m shell -a "getent passwd | grep apache"
跨项目调用角色(roles):
以httpd和nginx为例,假设同时应用于一组服务器上,在此之前的操作清除:
[root@browserlb ansible]# ansible local -m user -a "name=apache state=absent"
[root@browserlb ansible]# ansible local -m shell -a "rm -rf /data/*"
[root@browserlb ansible]# ansible local -m shell -a "yum -y remove nginx"
[root@browserlb ansible]# ansible local -m shell -a "userdel -r nginx"
创建调用角色的剧本
[root@browserlb ansible]# cp nginx_role.yml some_role.yml
[root@browserlb ansible]# vi some_role.yml
- - hosts: local
- become: yes
- become_user: root
- roles:
- - role: httpd
- - role: nginx
执行剧本并查看结果
- [root@browserlb ansible]# ansible-playbook some_role.yml
- [root@browserlb ansible]# ansible local -m shell -a "ls -l /data/"
- [root@browserlb ansible]# ansible local -m shell -a "ss -nltp"
跨角色引用任务:
比如我们想用nginx角色调用httpd里的copy任务
只需要在nginx的main.yml里面加入一条带路径的调用任务即可解决:
[root@browserlb ansible]# vi roles/nginx/tasks/main.yml
- - include: group.yml
- - include: user.yml
- - include: yum.yml
- - include: temp1.yml
- - include: start.yml
- - include: roles/httpd/tasks/copyfile.yml
记得还要修改httpd的copy剧本为绝对路径,要不然会出错
[root@browserlb ansible]# vi roles/httpd/tasks/copyfile.yml
- - name: copy files
- copy: src=/etc/httpd/conf/httpd.conf dest=/data/ owner=apache
测试之前把原有的文件删掉:
[root@browserlb ansible]# ansible local -m shell -a "ls -l /data"
[root@browserlb ansible]# ansible local -m shell -a "rm -rf /data/*"
执行nginx角色的剧本并查看结果:
- [root@browserlb ansible]# ansible-playbook nginx_role.yml
- [root@browserlb ansible]# ansible local -m shell -a "ls -l /data"
[root@browserlb ansible]# tree
├── httpd_role.yml
├── nginx_role.yml
├── roles
│ ├── app
│ │ ├── tasks
│ │ │ ├── group.yml
│ │ │ ├── main.yml
│ │ │ ├── restart.yml
│ │ │ ├── start.yml
│ │ │ ├── temp1.yml
│ │ │ ├── user.yml
│ │ │ └── yum.yml
│ │ └── templates
│ │ └── nginx.conf.j2
│ ├── httpd
│ │ ├── files
│ │ │ └── httpd.conf
│ │ └── tasks
│ │ ├── copyfile.yml
│ │ ├── main.yml
│ │ └── user.yml
│ ├── memcache
│ ├── mysql
│ └── nginx
│ ├── tasks
│ │ ├── group.yml
│ │ ├── main.yml
│ │ ├── restart.yml
│ │ ├── start.yml
│ │ ├── temp1.yml
│ │ ├── user.yml
│ │ └── yum.yml
│ └── templates
│ └── nginx.conf.j2
├── some_role.yml
├── tags_role.yml
└── when_tags_role.yml
12 directories, 25 files
综合
用httpd服务实现:
查看路径
[root@browserlb app]# pwd
/root/ansible/roles/app
删除目录里所有的内容
[root@browserlb app]# rm -rf *
[root@browserlb app]# ll
total 0
创建目录用来存放任务
[root@browserlb app]# mkdir tasks templates vars handlers files
[root@browserlb app]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 14 14:55 files
drwxr-xr-x. 2 root root 6 Apr 14 14:55 handlers
drwxr-xr-x. 2 root root 6 Apr 14 14:55 tasks
drwxr-xr-x. 2 root root 6 Apr 14 14:55 templates
drwxr-xr-x. 2 root root 6 Apr 14 14:55 vars
创建组
[root@browserlb app]# cd tasks/
[root@browserlb tasks]# vi group.yml
- - name: create group
- group: name=app system=yes gid=123
创建用户
[root@browserlb tasks]# vi user.yml
- - name: create user
- user: name=app group=app system=yes shell=/sbin/nologin uid=123
安装httpd软件
[root@browserlb tasks]# vi yum.yml
- - name: install package
- yum: name=httpd
提前装好httpd,并复制一份配置文件到templates下还要改名:
[root@browserlb tasks]# cp /etc/httpd/conf/httpd.conf ../templates/httpd.conf.j2
由于用户和组没有指定系统变量,所以需要我们在规划好的vars下手动定义变量剧本以备调用
[root@browserlb tasks]# vi ../vars/main.yml
- username: app
- groupname: app
创建调用模板
[root@browserlb tasks]# vi tempp1.yml
- - name: copy conf
- template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
- notify: restart service
[root@browserlb tasks]# cd ..
重启服务
[root@browserlb app]# vi handlers/restart.yml
- - name: restart service
- service: name=httpd state=restarted
启动服务
[root@browserlb app]# vi tasks/start.yml
- - name: start service
- service: name=httpd state=started enabled=yes
[root@browserlb app]# tree
.
├── files
│ └── vhosts.conf
├── handlers
│ ├── main.yml
│ └── restart.yml
├── tasks
│ ├── group.yml
│ ├── start.yml
│ ├── temppl.yml
│ └── yum.yml
├── templates
│ └── httpd.conf.j2
└── vars
└── main.yml
5 directories, 9 files
创建一个copy任务
[root@browserlb app]# vi tasks/copyfile.yml
- - name: copy config
- copy: src=vhosts.conf dest=/etc/httpd/conf.d/ owner=app
创建一个执行次序的剧本
[root@browserlb app]# vi tasks/main.yml
- - include: group.yml
- - include: user.yml
- - include: yum.yml
- - include: temp1.yml
- - include: copyfile.yml
- - include: start.yml
创建角色剧本
[root@browserlb ansible]# cp httpd_role.yml app_role.yml
[root@browserlb ansible]# vi app_role.yml
- - hosts: local
- become: yes
- become_user: root
- roles:
- - app
执行剧本并查看结果
- [root@browserlb ansible]# ansible-playbook app_role.yml
- [root@browserlb ansible]# ansible local -m shell -a "ss -nltp | grep httpd"
- [root@browserlb ansible]# ansible local -m shell -a "ps aux | grep app"