11-Role

2020-01-14 17:51:25 浏览数 (1)

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 目录名

代码语言:txt复制
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角色再创建就会报错,所以使用这个参数强制创建)

代码语言:txt复制
[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

0 人点赞