Role角色
介绍
把完成目标功能需要的所有元素组合到一起,构成一个角色
角色的配置在ansible.cfg中的roles_path选项,多个目录用':'隔开
代码语言:txt复制[student@workstation ansible]$ grep roles /etc/ansible/ansible.cfg
roles_path = /home/ansible/playbooks/roles:/tmp/roles
角色集合
代码语言:txt复制tree roles/
roles/
├── httpd
├── memcached
├── mysql
└── nginx
组织结构
每个角色,以特定的目录结构进行组织
代码语言:txt复制[student@workstation ansible]$ tree nginx/
nginx/
├── default 设定默认变量时使用此目录中的main.yml文件
├── files 存放由copy或script模块等调用的文件
├── handlers 此目录的任务由notify调用,文件名为main.yml,其它文件需要通过include包含
├── meta 定义当前角色的特殊设定及其依赖关系
├── tasks 至少要有一个tasks目录,执行任务的目录下的文件名都是mian.yml
├── templates template模块查找所需要模板文件的目录
└── vars 此目录用来存储playbook变量,文件名为main.yml,其它文件需要通过include包含
实例-部署Nginx
目录结构
代码语言:txt复制[root@ansible roles]# pwd
/etc/ansible/roles
[root@ansible roles]# tree nginx/
nginx/
├── default
├── files
│ ├── CentOS-Base.repo
│ └── index.html
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── vhost1.conf.j2
└── vars
└── main.yml
Vars
代码语言:txt复制[root@ansible nginx]# cat vars/main.yml
yum_dir: /etc/yum.repos.d/
web_root: /web_data/
http_port: 6666
nginx_source: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
nginx_pkg_name: nginx-release-centos-7-0.el7.ngx.noarch
Templates
代码语言:txt复制[root@ansible nginx]# cat templates/vhost1.conf.j2
server{
listen {{ http_port }};
server_name {{ ansible_fqdn }};
location / {
root {{ web_root }};
index index.html;
}
}
Tasks
代码语言:txt复制[root@ansible nginx]# cat tasks/main.yml
- name: 0.clean ayum
shell: rm -f {{ yum_dir }}*
when: ansible_os_family == "RedHat"
- name: 1.remove old nginx source
shell: rpm -e {{ nginx_pkg_name }}
ignore_errors: yes
- name: 2.install nginx source
get_url: url={{ nginx_source }} dest={{ yum_dir }}
- name: 3.copy yum base
copy: src=CentOS-Base.repo dest={{ yum_dir }}
- name: 4.clean cache and make cache
shell: yum clean all && yum makecache
- name: 5.install nginx
yum: name=nginx state=latest
- name: 6.make web root directory
file: path={{ web_root }} state=directory
- name: 7.copy index.html to vhost1
copy: src=index.html dest={{ web_root }}
- name: 8.copy template config file
template: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost.conf
tags: init_host_config_file
notify: restart nginx
- name: 9.start nginx
service: name=nginx state=started
nginx.yml
代码语言:txt复制[root@ansible playbook]# pwd
/opt/playbook
[root@ansible playbook]# cat nginx.yml
- hosts: all
roles:
- nginx
开始部署
代码语言:txt复制[root@ansible playbook]# ansible-playbook nginx.yml
调用角色的方法
方法1
代码语言:txt复制- hosts: all
roles:
- mysqls
- memcached
- nginx
方法2
代码语言:txt复制- hosts: websrvs
roles:
#键role用于指定角色名称;后续的k/v用于传递变量给角色;
- { role: nginx, username: nginx }
#还可以基于条件测试实现角色调用
- { role: nginx, when: "ansible_distribution_major_version == '7'" }
方法3
代码语言:txt复制- hosts: websrvs
roles:
#可以指定tags来执行对应的角色
- { role: httpd,tags: ['web', 'httpd'] }
- { role: nginx,tags: ['web', 'nginx'] }
Galaxy
上面在使用角色的时候,是我们自己手工创建目录和文件的,现在有一种工具可以帮我完成这个过程,它就是Galaxy
初始化
默认模板
需求:创建一个apache
角色
语法:ansible-galaxy init
角色名 -p
目录名
cd /home/ansible/playbooks
ansible-galaxy init apache -p roles/
tree roles/
roles/
└── apache
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
自定义模板
上面在创建角色的时候没有生成templates目录,如果角色多了自己手工建立会影响效率,自定义模板可以解决这个问题
--role-skeleton
自定义模板目录
--force
强制创建,覆盖之前的 (由于上面已经创建了apache角色再创建就会报错,所以使用这个参数强制创建)
[student@workstation ansible]$ tree skele/
skele/
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
指定模板的目录来创建角色
代码语言:txt复制[student@workstation ansible]$ ansible-galaxy init --role-skeleton=skele/ apache -p roles/ --force
[student@workstation ansible]$ tree roles/apache/
roles/apache/
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
安装
可以安装,来自本地,或者来自网络中的role
网络源
从网络中安装多个角色,可以用version描述软件的版本
代码语言:txt复制[student@workstation ansible]$ cat roles.yml
- src: http://materials/haproxy.tar.gz
name: balancer
version: v1.2
- src: http://materials/phpinfo.tar.gz
name: phpinfo
version: v1.2
-r 安装源配置文件
install 安装
代码语言:txt复制[student@workstation ansible]$ ansible-galaxy install -r roles.yml -p roles/
- downloading role from http://materials/haproxy.tar.gz
- extracting balancer to roles/balancer
- balancer was installed successfully
- downloading role from http://materials/phpinfo.tar.gz
- extracting phpinfo to roles/phpinfo
- phpinfo was installed successfully
本地源
文件当前目录下
代码语言:txt复制[student@workstation ansible]$ cat get_timesync.yml
- src: ./timesync-1.0.1.tar.gz
name: timesync
安装本地源
代码语言:txt复制[student@workstation ansible]$ ansible-galaxy install -r get_timesync.yml -p roles/
- extracting timesync to roles/timesync
- timesync was installed successfully
查看
默认查看的是 ansible.cfg 里的roles_path 配置路径
代码语言:txt复制[student@workstation ansible]$ ansible-galaxy list
- apache, (unknown version)
- balancer, v1.2
- phpinfo, v1.2
- timesync, (unknown version)
删除
代码语言:txt复制[student@workstation ansible]$ ansible-galaxy remove apache
[student@workstation ansible]$ ansible-galaxy list
- balancer, (unknown version)
- phpinfo, (unknown version)
- timesync, (unknown version)
搜索
在互联网中搜索redis角色,并查看详细信息
代码语言:txt复制ansible-galaxy search redis –vvv
安装网络中下载的redis角色,并查看详细信息
代码语言:txt复制ansible-galaxy install redis –p roles/ -vvv