ansible 角色定义及调用
==========================================================================
概述:
本章是上篇ansible的后续,将主要介绍ansible中角色的定义和调用,内容如下:
- handlers:由特定条件触发的Tasks;
- tags:给指定的任务定义一个调用标识;
- Variables的类型、定义及调用方法;
- Templates模板的介绍及使用;
- 条件测试when语句的使用;
-
循环:迭代,需要重复执行的任务;
·基于字符串列表给出元素
·基于字典列表给元素
- 角色目录的定义方法
- 在playbook中调用角色的方法;
- 示例:
定义nginx角色并调用;
定义memcached角色并调用;
定义mysql角色并调用;
★调用及定义方式注意:![]()
Ansible 的角色定义及调用
- 在实际生产中,有些服务不能重启(如:nginx),但是ansible又不支持reload,这时就要调用shell模块执行reload操作
- 如果跨版本的话要加条件判断,或者二者兼容的命令(如6和7都支持service命令)
![]()
Ansible 的角色定义及调用
演示:
1.定义一个playbook使其监听在8080端口,操作如下:
# 复制控制端主机的httpd服务的配置文件,修改其监听端口为8080,作为远程主机httpd服务的配置文件
[root@centos7 ~]# cp /etc/httpd/conf/httpd.conf ./
[root@centos7 ~]# vim httpd.conf
Listen 8080
# 定义playbook
[root@centos7 ~]# vim web.yaml
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd packpage # 首先安装httpd程序包
yum: name=httpd
- name: install conf file # 然后把本机httpd的配置文件复制给远程主机
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: start httpd service # 启动服务
service: name=httpd state=started
2.检测语法,测试运行,发现因为远程主机上的httpd服务已经安装并正在运行,所以,只是配置文件可以被修改,其他两项任务并没有被触发,还是监听在80端口,如下:
# 语法检查
[root@centos7 ~]# ansible-playbook --syntax-check web.yaml
playbook: web.yaml
[root@centos7 ~]# ansible-playbook -C web.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install httpd packpage] **************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install conf file] *******************************************************
changed: [10.1.252.156] # 只有安装配置文件项的任务可以被执行改变
changed: [10.1.252.161]
TASK [start httpd service] *****************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=4 changed=1 unreachable=0 failed=0
10.1.252.161 : ok=4 changed=1 unreachable=0 failed=0
3.现在我们要定义触发器,去监控配置文件,一旦配置文件发生了修改,就要触发执行handlers定义的任务,如下:
4.现在,再去执行此任务,可以发现,当配置文件发生修改后,会通知触发器,然后执行触发器的任务,如下:
[root@centos7 ~]# ansible-playbook --syntax-check web.yaml
playbook: web.yaml
[root@centos7 ~]# ansible-playbook -C web.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install httpd packpage] **************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install conf file] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
TASK [start httpd service] *****************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
RUNNING HANDLER [restart httpd service] ****************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=5 changed=2 unreachable=0 failed=0
10.1.252.161 : ok=5 changed=2 unreachable=0 failed=0
5.如果我们再执行一次playbook,因为配置文件没有被触发,所以并没有引起触发器执行任务。
[root@centos7 ~]# ansible-playbook -C web.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install httpd packpage] **************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install conf file] *******************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [start httpd service] *****************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=4 changed=0 unreachable=0 failed=0
10.1.252.161 : ok=4 changed=0 unreachable=0 failed=0
★tags:给指定的任务定义一个调用标识;
☉定义方法
![]()
Ansible 的角色定义及调用
- 多个任务可以使用同一个标签;
- 也可以在一次ansible-playbook执行时调用多个标签(用逗号分隔)
上面的演示中,我们只是修改了配置文件,只想运行修改配置文件的任务,但是其他的两项任务因为没有发生改变,所有白白的执行了一次,针对这种情况,我们就可以,给指定的任务定义一个标识,然后只执行次标识就可以,如下:
[root@centos7 ~]# ansible-playbook -C -t instconf --list-tags web.yaml
playbook: web.yaml
play #1 (websrvs): websrvs TAGS: []
TASK TAGS: [instconf] # 定义的标签
# 这里再次修改一下配置文件中的端口,测试运行可以发现,我们指定运行的标签后,只运行了配置文件
# 的任务和触发的handler任务,其余的2个任务,没有被执行
[root@centos7 ~]# ansible-playbook -C -t instconf web.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install conf file] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
RUNNING HANDLER [reload httpd service] *****************************************
skipping: [10.1.252.156]
skipping: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=2 changed=1 unreachable=0 failed=0
10.1.252.161 : ok=2 changed=1 unreachable=0 failed=0
Variables:变量
★类型:
☉内建:
☉自定义:
- facts 可直接调用
★变量调用:![]()
Ansible 的角色定义及调用
- ` var_name `
定义一个playbook可以任意安装程序包,
方法一:
1)命令行传递;如下:
2)然后在执行ansible-playbook是直接传递给定义的变量要安装的程序包即可,如下:
方法二:
1)在playbook中定义变量值;
2)执行命令,此时就不用在命令行传递变量了,因为在vars中已经定义好了;
如果此时在命令行给定了变量值,以命令行给定的为准,也就是说,命令行中传递的变量值的优先级要比vars中给定的高。
方法三:
在hosts Inventory中为每个主机定义专用变量值;
向不同的主机传递不同的变量
1)定义变量调用:
2)在/etc/ansible/hosts中为每个主机定义专用变量值;
3)执行后可以发现两个主机各自安装各自定义的变量程序包,从而实现向不同的主机传递不同的变量
[root@centos7 ~]# ansible-playbook -C pkg.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install a package] *******************************************************
ok: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=2 changed=0 unreachable=0 failed=0
10.1.252.161 : ok=2 changed=1 unreachable=0 failed=0
在不同的主机传递相同的变量,除了在playbook中定义vars之外,还可以在hosts Inventory中定义组,向组内的所有主机传递相同的变量 ;
1)变量调用的定义同上,在/etc/ansible/hosts中自定义的变量组如下:
2)执行后发现两台主机都安装相同的程序包,如下:
[root@centos7 ~]# ansible-playbook -C pkg.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install a package] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=2 changed=1 unreachable=0 failed=0
10.1.252.161 : ok=2 changed=1 unreachable=0 failed=0
Templates:模板
---为文本文件,内部嵌套有模板语言(jinjia2)脚本(使用模板语言编写)
★作用:
- 为某一个服务提供配置文件时,配置文件对于不同的主机,需要提供的配置也不尽相同,具体到底是什么,要依赖于此主机上的属性才能生成,这时,使用模板是最为有效的;
★jinjia2语法:
☉字面量:
☉算术运算:
- 字符串:使用单引号或双引号;
- 数字:整数、浮点数;
- 列表:[item1, item2, ...]
- 元组:(item1, item2, ...)
- 字典:{key1:value1, key2:value2, ...}
- 布尔型:true/false
☉比较操作:
- +, -, *, /, //, %, **
☉逻辑运算:
- ==, !=, >, <, >=, <=
★执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
- and, or, not
![]()
Ansible 的角色定义及调用
1.定义nginx的一个playbook,使其能够基于模板复制配置文件
1)首先复制nginx的配置文件修改其worker_process为一个变量值,然后复制配置文件到远程主机
[root@centos7 ~]# cp /etc/nginx/nginx.conf ./nignx.conf.j2
# 修改其变量值如下:
[root@centos7 ~]# vim nginx.conf
worker_processes {{ ansible_processor_vcpus }};
------------------------------------------------------------------------------
此时如果我们使用copy模块直接复制到远程主机的话,发现其配置文件还是变量的字符串,并没有被解析成cpu的核心数。这是因为,是把文件直接当做文本流copy过去的;要想使变量能够被解析,就要使用template模块,它能够理解模板文件中的脚本,并生成结果数据流。
------------------------------------------------------------------------------
2)因为template不能在命令行使用,只能用于playbook,所以这里我们定义一个playbook 为test.yaml
执行定义的playbook,并在远程主机查看,可以发现nginx.conf文件的worker_processes分别为各自的cpu核心数
[root@centos7 ~]# ansible-playbook test.yaml
PLAY [websrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [generate conf file] ******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=2 changed=1 unreachable=0 failed=0
10.1.252.161 : ok=2 changed=1 unreachable=0 failed=0
[root@centos7 ~]# !999
ansible websrvs -m setup |grep vcpus
"ansible_processor_vcpus": 2,
"ansible_processor_vcpus": 1,
2.现在我们在控制端主机定义一个完整的nginx playbook的模板,包括:安装程序包,复制配置文件,启动服务,定义tags,并完成通知触发器完成服务重载,如下:
1)首先在/etc/ansible的配置文件中定义组清单
[root@centos7 ~]# vim /etc/ansible/hosts
[ngxsrvs]
10.1.252.156
10.1.252.161
2)复制nginx的配置文件修改其worker_process为一个变量值
[root@centos7 ~]# cp /etc/nginx/nginx.conf ./nignx.conf.j2
[root@centos7 ~]# vim nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
3)定义nginx的playbook,如下:
[root@centos7 ~]# vim nginx.yaml
- hosts: ngxsrvs
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: install conf file
template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: ngxconf
notify: reload nginx service
- name: start nginx service
service: name=nginx state=started enabled=true
handlers:
- name: reload nginx service
shell: /usr/sbin/nginx -s reload
4)检测playbook语法,测试运行,成功完成如下:
[root@centos7 ~]# ansible-playbook --syntax-check nginx.yaml
playbook: nginx.yaml
[root@centos7 ~]# ansible-playbook -C nginx.yaml
PLAY [ngxsrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install nginx package] ***************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install conf file] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
TASK [start nginx service] *****************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
RUNNING HANDLER [reload nginx service] *****************************************
skipping: [10.1.252.156]
skipping: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=4 changed=2 unreachable=0 failed=0
10.1.252.161 : ok=4 changed=2 unreachable=0 failed=0
总结,
ansible配置nginx模板
条件测试:
★when语句:在tasks中使用,遵循Jinja2的语法格式;
1.我们在启动nginx时,由于系统不同,执行的命令也不同,这时我们就可以使用when语句,直接调用fetch变量,来进行条件判断,如下:
测试运行play-book,如下:
[root@centos7 ~]# ansible-playbook -C nginx2.yaml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.205]
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [install nginx package] ***************************************************
ok: [10.1.252.156]
changed: [10.1.252.205]
ok: [10.1.252.161]
TASK [start nginx service On CentOS6] ******************************************
skipping: [10.1.252.161]
skipping: [10.1.252.156]
skipping: [10.1.252.205]
TASK [start nginx service On CentOS7] ******************************************
skipping: [10.1.252.205]
skipping: [10.1.252.156]
skipping: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=2 changed=0 unreachable=0 failed=0
10.1.252.161 : ok=2 changed=0 unreachable=0 failed=0
10.1.252.205 : ok=2 changed=1 unreachable=0 failed=0
★循环:迭代,需要重复执行的任务;☉元素:
- 对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;
- 字符串列表,字典
1.基于字符串列表给出元素示例:
基于列表的方式,循环迭代安装多个程序包,如下:
测试运行,可以发现明确给出了要安装的程序包
2.基于字典列表给元素示例:
1)每个远程主机创建三个组,三个用户,使每个用户位于三个不同的组,如下:
执行playbook,成功完成创建,如下:
[root@centos7 ~]# ansible-playbook users.yaml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.205]
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [create groups] ***********************************************************
changed: [10.1.252.205] => (item=groupx1)
changed: [10.1.252.156] => (item=groupx1)
changed: [10.1.252.161] => (item=groupx1)
changed: [10.1.252.205] => (item=groupx2)
changed: [10.1.252.156] => (item=groupx2)
changed: [10.1.252.205] => (item=groupx3)
changed: [10.1.252.161] => (item=groupx2)
changed: [10.1.252.156] => (item=groupx3)
changed: [10.1.252.161] => (item=groupx3)
TASK [create users] ************************************************************
changed: [10.1.252.205] => (item={u'group': u'groupx1', u'name': u'userx1'})
changed: [10.1.252.156] => (item={u'group': u'groupx1', u'name': u'userx1'})
changed: [10.1.252.161] => (item={u'group': u'groupx1', u'name': u'userx1'})
changed: [10.1.252.205] => (item={u'group': u'groupx2', u'name': u'userx2'})
changed: [10.1.252.156] => (item={u'group': u'groupx2', u'name': u'userx2'})
changed: [10.1.252.205] => (item={u'group': u'groupx3', u'name': u'userx3'})
changed: [10.1.252.161] => (item={u'group': u'groupx2', u'name': u'userx2'})
changed: [10.1.252.156] => (item={u'group': u'groupx3', u'name': u'userx3'})
changed: [10.1.252.161] => (item={u'group': u'groupx3', u'name': u'userx3'})
PLAY RECAP *********************************************************************
10.1.252.156 : ok=3 changed=2 unreachable=0 failed=0
10.1.252.161 : ok=3 changed=2 unreachable=0 failed=0
10.1.252.205 : ok=3 changed=2 unreachable=0 failed=0
角色:roles
---以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files(依赖的文件)等;
★角色目录的定义:
role_name/(以角色名命名的目录)
☉files/:
☉tasks/:
- 存储由copy或script等模块调用的文件;
☉handlers/:
- 此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
☉vars/:
- 此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
☉templates/:
- 此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
☉meta/:
- 存储由template模块调用的模板文本;
☉default/:
- 此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
★在playbook中调用角色的方法:
- 此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
![]()
Ansible 的角色定义及调用
演示:
创建角色,并在playbook中调用角色
在/etc/ansible/roles(路径不唯一)中定义role_name以及各role_name中的模块文件如下:
[root@centos7 roles]# mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv
[root@centos7 roles]# ls
httpd memcached mysql nginx
[root@centos7 roles]# tree
.
├── httpd
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── memcached
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── mysql
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── nginx
├── default
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
定义nginx角色,并调用:
1.现在我们首先定义nginx角色的任务目录,其中会调用到一些其他的模块,它会自动到对应的模块中获取文件内容,如下:
[root@centos7 roles]# vim nginx/tasks/main.yml
- name: copy nginx package to remote host # 调用files模块
copy: src=nginx-1.10.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm
tags: cppkg
- name: install nginx package
yum: name=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm state=present
- name: install conf file nginx.conf # 调用templates模块
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
tags: ngxconf
notify: reload nginx service # 调用handlers模块
- name: install conf file default.conf
template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
tags: ngxconf # 定义tags标识
notify: reload nginx service
- name: start nginx service
service: name=nginx state=started enabled=true
2.定义在nignx/tasks中要调用模块的目录,如下:
1)handlers
2)准备templates的模板文件,并修改其进程数为系统变量,监听端口为自定义变量如下:
[root@centos7 roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2
[root@centos7 roles]# vim nginx/templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
[root@centos7 roles]# cp /etc/nginx/conf.d/default.conf nginx/templates/default.conf.j2
[root@centos7 roles]# vim nginx/templates/default.conf.j2
listen {{ ngxport }}; # 自定义变量
3)准备files文件
[root@centos7 roles]# cp /root/nginx/nginx-1.10.0-1.el7.ngx.x86_64.rpm nginx/files/
[root@centos7 roles]# ls nginx/files/
nginx-1.10.0-1.el7.ngx.x86_64.rpm
4)因为我们在templates中用到了自定义变量,所以,在/etc/ansible/roles/nginx/vars中定义变量,如下:
[root@centos7 roles]# vim nginx/vars/main.yml
1 ngxport: "8088"
定义的文件概览
[root@centos7 roles]# pwd
/etc/ansible/roles
[root@centos7 roles]# tree
.
├── httpd
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── memcached
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── mysql
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── nginx
├── default
├── files
│ └── nginx-1.10.0-1.el7.ngx.x86_64.rpm
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ ├── default.conf.j2
│ └── nginx.conf.j2
└── vars
└── main.yml
3.如上,我们要调用的各模块都已经准备好了,现在我们要去调用nginx角色
1)首先定义play-book,指明远程主机,和要调用的角色
[root@centos7 ansible]# pwd
/etc/ansible
[root@centos7 ansible]# ls
ansible.cfg ansible.cfg.bak hosts hosts.bak roles
[root@centos7 ansible]# vim roles.yaml
- hosts: ngxsrvs
remote_user: root
roles: # 这里要写调用的角色roles
- nginx
2)编辑/etc/ansible/ansible.cfg,修改其调用roles的路径
4.检测语法,测试运行
[root@centos7 roles]# ansible-playbook --syntax-check /etc/ansible/nginx.yaml
playbook: /etc/ansible/nginx.yaml
# 首先把程序包复制过去(因为如果远程主机没有程序包的话,测试执行后面的任务会报错)
[root@centos7 roles]# ansible-playbook -t cppkg /etc/ansible/nginx.yaml
PLAY [ngxsrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : copy nginx package to remote host] *******************************
changed: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=2 changed=1 unreachable=0 failed=0
10.1.252.161 : ok=2 changed=1 unreachable=0 failed=0
# 测试执行,
[root@centos7 roles]# ansible-playbook -C /etc/ansible/nginx.yaml
PLAY [ngxsrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : copy nginx package to remote host] *******************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : install nginx package] *******************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : install conf file nginx.conf] ************************************
changed: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : install conf file default.conf] **********************************
changed: [10.1.252.156]
changed: [10.1.252.161]
TASK [nginx : start nginx service] *********************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
RUNNING HANDLER [nginx : reload nginx service] *********************************
changed: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=7 changed=4 unreachable=0 failed=0
10.1.252.161 : ok=7 changed=3 unreachable=0 failed=0
5.测试运行没有问题,然后真正的运行,在远程主机上查看,可以发现已经监听在8088端口;
[root@centos7 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 128 *:8088 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 ::1:6010
6.假如我们现在不想监听在8088端口,而是想监听在80端口,这时除了可以修改vars中的变量ngxport外,还可以在playbook中调用角色时,直接向角色传递变量(以字典的方式传递),如下:
因为,这里我只是修改了一下配置文件,所以只需要执行配置文件的标签ngxconf跑下配置文件即可,执行之后可以发现,远程主机监听的端口为80端口,说明直接在调用角色是传递变量要比在vars中定义的变量的优先级要高,如下:
[root@centos7 ansible]# ansible-playbook --check --list-tags nginx.yaml # 列出标签
playbook: nginx.yaml
play #1 (ngxsrvs): ngxsrvs TAGS: []
TASK TAGS: [cppkg, ngxconf]
[root@centos7 ansible]# ansible-playbook -C -t ngxconf nginx.yaml
PLAY [ngxsrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : install conf file nginx.conf] ************************************
ok: [10.1.252.156]
ok: [10.1.252.161]
TASK [nginx : install conf file default.conf] **********************************
changed: [10.1.252.156] # 只运行配置文件default.conf
changed: [10.1.252.161]
RUNNING HANDLER [nginx : reload nginx service] *********************************
changed: [10.1.252.156] # 因为配置文件发生了改变,notify通知触发脚本
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=4 changed=2 unreachable=0 failed=0
10.1.252.161 : ok=4 changed=2 unreachable=0 failed=0
===========================================================================
如上,就是整个定义nginx角色并调用的整个过程,如果我们以后要在多台主机上安装运行nginx,只需要把/etc/ansible/roles/nginx目录拷贝过去然后定义主机,运行ansible-playbook就可以了,大大减轻了我们的工作量!
===========================================================================
注意:
- ansible默认一次只可以调用5个主机,如果我们系统主机的性能比较好,可以根据实际情况适当的调大一些,-f forks 也可以定义一批处理几个主机;
============================================================================
2.定义memcached角色,并调用:
1.首先定义memcached角色的任务目录,
[root@centos7 ansible]# vim roles/memcached/tasks/main.yml
1 - name: install memcached
2 yum: name=memcached state=latest
3 - name: install conf file
4 template: src=memcached.j2 dest=/etc/sysconfig/memcached
5 tags: mcconf
6 notify: reload memcached
7 - name: start memcached
8 service: name=memcached state=started
2.我们这里要定义memcached的可用缓存空间为系统可用空间的四分之一,所以要调用template模块文件,定义如下:
[root@centos7 ansible]# cp /etc/sysconfig/memcached roles/memcached/templates/memcached.j2
[root@centos7 ansible]# vim roles/memcached/templates/memcached.j2
1 PORT="11211"
2 USER="memcached"
3 MAXCONN="1024"
4 CACHESIZE="{{ ansible_memtotal_mb // 4 }}"
5 OPTIONS=""
3.定义notify通知的触发器handler模块文件
[root@centos7 ansible]# vim roles/memcached/handlers/main.yml
1 - name: reload memcached
2 service: name=memcached state=restarted
4.如上,memcached的角色就已经定义好了,现在我们在之前定义好的roles.yaml的剧本中添加上memecached角色,就可以直接调用了,如下:
[root@centos7 ansible]# vim roles.yaml
1 - hosts: ngxsrvs
2 remote_user: root
3 roles:
4 - { role: nginx, ngxport: 80 }
5 - { role: memcached,tags: mechd }
5.列出tags,检查语法,运行如下:
[root@centos7 ansible]# ansible-playbook --syntax-check roles.yaml # 检测语法
playbook: roles.yaml
[root@centos7 ansible]# ansible-playbook -C --list-tags roles.yaml # 列出tags
playbook: roles.yaml
play #1 (ngxsrvs): ngxsrvs TAGS: []
TASK TAGS: [cppkg, mcconf, mechd, ngx, ngxconf]
[root@centos7 ansible]# ansible-playbook -C -t mechd roles.yaml # 运行如下
PLAY [ngxsrvs] *****************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.161]
ok: [10.1.252.156]
TASK [memcached : install memcached] *******************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
TASK [memcached : install conf file] *******************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
TASK [memcached : start memcached] *********************************************
changed: [10.1.252.156]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.156 : ok=4 changed=0 unreachable=0 failed=0
10.1.252.161 : ok=4 changed=0 unreachable=0 failed=0
6.在远程主机查看端口11211,并查看memcached缓存大小如下:
[root@centos7 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:11211 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 :::11211 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 ::1:6010 :::*
[root@centos7 ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="244"
OPTIONS=""
============================================================
3.定义mysql角色,并调用:
1)定义mysql角色的任务目录,
[root@centos7 ansible]# vim roles/mysql/tasks/main.yml
1 - name: isntall mysql-server
2 yum: name=mysql-server state=latest
3 when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
4 - name: isntall mariadb-server
5 yum: name=mariadb-server state=latest
6 when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
7 - name: start mysql service
8 service: name=mysqld state=started
9 when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
10 - name: start mariadb service
11 service: name=mariadb state=started
12 when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
2)调用mysql如下:
[root@centos7 ansible]# vim mysql.yaml
1 - hosts: dbsrvs
2 remote_user: root
3 roles:
4 - mysql
3)运行如下:
[root@centos7 ansible]# ansible-playbook mysql.yaml
PLAY [dbsrvs] ******************************************************************
TASK [setup] *******************************************************************
ok: [10.1.252.205]
ok: [10.1.252.161]
TASK [mysql : isntall mysql-server] ********************************************
skipping: [10.1.252.161]
changed: [10.1.252.205]
TASK [mysql : isntall mariadb-server] ******************************************
skipping: [10.1.252.205]
ok: [10.1.252.161]
TASK [mysql : start mysql service] *********************************************
skipping: [10.1.252.161] # when语句,不符合就跳过
changed: [10.1.252.205]
TASK [mysql : start mariadb service] *******************************************
skipping: [10.1.252.205]
changed: [10.1.252.161]
PLAY RECAP *********************************************************************
10.1.252.161 : ok=3 changed=1 unreachable=0 failed=0
10.1.252.205 : ok=3 changed=2 unreachable=0 failed=0
总结:
nginx角色的定义
memcached角色定义:
nginx和memcached的角色调用:
mysql角色定义:
roles目录中个角色的模块文件概览
[root@centos7 ansible]# tree roles
roles
├── httpd
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
├── memcached
│ ├── default
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── memcached.j2
│ └── vars
├── mysql
│ ├── default
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ └── vars
└── nginx
├── default
├── files
│ └── nginx-1.10.0-1.el7.ngx.x86_64.rpm
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ ├── default.conf.j2
│ └── nginx.conf.j2
└── vars
└── main.yml
32 directories, 10 files
如上就是整个ansible中角色roles的定义和调用。。。
Ansible上篇文章链接:http://1992tao.blog.51cto.com/11606804/1871264