四、playbook
4.1 yaml文件介绍
- yaml就是一种文件格式,用于定义一组数据格式
案例:用yaml文件描述tom的信息
name: tom
age: 35
gender: Male
spouse:
name: jerry
age: 32
gender: Femal
children:
- name: bajie
gender: Male
age: 15
- name: bajie
gender: Male
age: 15
- 字段:一级和二级字段
yaml文件的特点
- 易读
- 扩展性好
- 和程序交互性好
4.2 ansile使用yaml文件的元素
- 变量
- 主机清单
- 循环
- 判断
4.2.1 变量
自定义变量的变量名:
- 仅仅可以是数字、字母、下划线
- 而且只能以字母为开头
内置变量
- setup模块来获得
通过命令行的方式来使用变量
[root@master ~]
4.3 如何编写playbook
为什么要用playbook
- 通过playbook可以实现一些复杂的操作,比如:安装epel,然后安装nginx的依赖包,然后编译安装nginx,启动nginx,这一系列的操作可以定义成一个yaml文件,通过调用这个yaml文件,可以自动批量的完成全部工作。
playbook中包含的内容
- play:一个play就是一组要执行的操作
- inventory:要对哪些主机进行操作
- tasks:具体要完成操作
- template:通过template可以动态生成服务的配置文件
- handler:检查一个事件,并触发另一个事件
- roles:通过roles可以实现文件的复用
案例:编译yaml文件实现批量自动安装apache,然后启动apache
首先创建yaml文件
[root@master ~]
- hosts: myservers
tasks:
- name: install epel repo
yum: name=epel-release state=latest
- name: install nginx
yum: name=nginx state=latest
- name: start nginx
service: name=nginx state=started
然后执行yaml文件来创建服务
[root@master ~]
4.3.1 hosts参数
- 就是用来指定被管理主机的ip或者组名
4.3.2 remote_user参数
- 让远程主机以特定的用户身份来运行
- hosts: myservers
remote_user: root
tasks:
- name: install epel repo
yum: name=epel-release state=latest
- name: install nginx
yum: name=nginx state=latest
- name: start nginx
service: name=nginx state=started
4.3.3 tasks参数
用了指定需要完成具体的操作
通常由两部分构成一个操作
- name:指定一个输出的名称
- 模块 和 参数:指定要做的事情
tasks:
- name: install epel repo
yum: name=epel-release state=latest
- name: install nginx
yum: name=nginx state=latest
- name: start nginx
service: name=nginx state=started
task的执行流程
- 如果有多个task操作,那么首先在第一个被管理阶段上执行第一个任务;所有阶段的这个任务执行完成后,才会开始在所有节点执行第二个任务,以此类推;
- 一旦某个指定执行任务失败,那么所有的阶段都会停止继续执行,甚至会执行回滚操作
案例:在所有的节点上,创建用户组gp002,然后再创建用户user002,要求user002的组为gp002
- name: create user
hosts: all
remote_user: root
tasks:
- name: create group
group: name=gp002 state=present
- name: create user
user: name=user002 group=gp002
4.3.4 handler参数
作用
- 用来监控一个task操作是否执行了,一旦这个监控的task执行,那么立刻触发一个特定的操作
使用方法:
- 第一步:定义handler事件和要执行的操作
- 第二步:在需要监控的对象下面通过notify指定handler的名称
案例:安装nginx,将本地的nginx配置文件发生到远程节点,作为nginx服务的配置文件
1)在本地生成nginx的配置文件
[root@master ~]
[root@master ~]
[root@master ~]
将nginx的端口改为8800
2)编写yaml文件,在远处主机安装nginx,并使用这个配置文件
- hosts: myservers
tasks:
- name: install epel repo
yum: name=epel-release state=latest
- name: install nginx
yum: name=nginx state=latest
- name: send nginx config file
copy: src=/root/nginx.conf dest=/etc/nginx/nginx.conf
notify:
- restart nginx service
- name: start nginx
service: name=nginx state=started
handlers:
- name: restart nginx service
service: name=nginx state=restarted
3)执行yaml文件,检查远程主机端口
[root@master ~]
4.3.5 案例:部署tomcat服务
梳理思路:操作有4个
1. 安装jdk:java-1.8.0-openjdk
2. 下载tomcat:http://mirror.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz
3. 解压tomcat
4. 启动tomcat
- name: install tomcat
hosts: all
tasks:
- name: 安装openjdk
yum: name=java-1.8.0-openjdk state=present
- name: 下载tomcat
get_url: url=http://mirror.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.51/bin/apache-tomcat-8.5.51.tar.gz dest=/tmp
- name: 解压tomcat
unarchive: src=/tmp/apache-tomcat-8.5.51.tar.gz dest=/usr/local/ copy=no
- name: 启动tomcat
shell: cd /usr/local/apache-tomcat-8.5.51/bin/ && nohup ./startup.sh &
从yum中找openjdk的安装包
[root@master ~]
使用变量的方式定义
- name: install tomcat
hosts: all
vars:
version: 8.5.51
dir: /usr/local/
tasks:
- name: 安装openjdk
yum: name=java-1.8.0-openjdk state=present
- name: 下载tomcat
get_url: url=http://mirror.hust.edu.cn/apache/tomcat/tomcat-8/v{{ version }}/bin/apache-tomcat-{{ version }}.tar.gz dest=/tmp
- name: 解压tomcat
unarchive: src=/tmp/apache-tomcat-{{ version }}.tar.gz dest={{ dir }} copy=no
- name: 启动tomcat
shell: cd {{ dir }}apache-tomcat-{{ version }}/bin/ && nohup ./startup.sh &
4.3.7 vars参数
vars是用来在playbook中使用变量的。
playbook使用变量有4种方式:
- 直接在yaml文件中定义和使用变量
- 使用ansible的内置变量
- 在主机清单中定义变量
- 主机组变量
第一种变量:yaml中自定义变量
- 定义变量方法:vars
- 使用变量方法:{{ xx }}
嗯嗯- hosts: all
remote_user: root
vars:
- package: mariadb-server
- serviceName: mariadb
- configFile: /tmp/my.cnf
tasks:
- name: install maraidb
yum: name={{ package }} state=latest
- name: create my.cnf
copy: src={{ configFile }} dest=/etc/my.cnf
notify:
- restart sql
- name: start sql
service: name={{ serviceName }} state=started
handlers:
- restart sql
service: name={{ serviceName }} state=restarted
第二种变量:使用ansible中的内置变量
1)获取内置变量:setup模块
案例:获取主机的完全限定名称变量
[root@master ~]
"ansible_fqdn": "node2",
"ansible_fqdn": "node1",
2)使用内置变量
案例:在每个主机上创建一个用户,用户名是当前主机的主机名(主机名就是fqdn)
- name: create user
hosts: tomcatservers
tasks:
- name: create new user
user: name={{ ansible_fqdn }} state=present
第三种变量:清单文件主机变量
- 在主机清单中,为每个和自己设置一个变量
案例:通过主机清单设置id值
1)在主机清单中定义变量
[tomcatservers]
192.168.31.65 id=5 state=no
192.168.31.66 id=3 state=yes
2)在yaml文件中使用变量
- hosts: tomcatservers
tasks
- name: user vars
shell: echo "{{ id }}">/tmp/{{ state }}.log
- 此时在每个被管理节点的tmp下,都会生成一个t.log,但是其中的值不同,一个是5一个是3
第四种变量:主机组变量
- 和主机变量相同,也是定义在主机清单中
案例:为tomcatservs主机组添加四个变量
[tomcatservers]
192.168.31.65 id=5 state=no
192.168.31.66 id=3
[tomcatservers:vars]
node=workNode
addrs=beijing
type=webServer
pro=https
思考:什么时候用主机变量?什么时候用主机组变量?
4.3.8 循环
思考:怎么在所有主机都安装gcc gcc-c++ pcre-devel ncurses-devel zlib-devel
答案:
- shell模块:-m shell -a “yum isntall xxxxxx”
ansible的循环依赖两部分
- 内置变量:item
- tasks的子选项:with_items
案例:循环创建5个用户
- hosts: all
tasks:
- name: create user
user: name=user{{ item }} state=present
with_items:
- 1
- 2
- 3
- 4
- 5
4.3.9 判断
- ansible实现判断是用tasks的when字句实现的判断的
- 通常都是在when中对自定义和内置变量进行判断
案例:在node2上创建用test007
- hosts: all
tasks:
- name: create user
user: name=test007 state=present
when: ansible_fqdn == "node1"
- name: install zsh
yum: name=zsh state=present
4.4 template
- template称之为模板
- 模板通常用来动态生成配置文件
案例:在所有节点安装nginx,两个节点的nginx分别监听在810和820的端口上,两个nginx的虚拟主机名分别为www.当前节点名称.com,两个节点的keepalived的超时时间分别是30和80.
1)创建存储模板的目录
[root@master ~]
[root@master ~]
- nginx.conf.j2是用于作为模板的配置文件
2)编辑配置文件模板
[root@master ~]
修改模板文件的4个位置
keepalive_timeout {{ keepalive_timeout }};
listen {{ listen_port }} default_server;
listen [::]:{{ listen_port }} default_server;
server_name www.{{ ansible_fqdn }}.com;
3)通过主机变量向模板传递参数
[root@master ~]
[myservers]
192.168.31.65 keepalive_timeout=30 listen_port=810
192.168.31.66 keepalive_timeout=80 listen_port=820
4)编写yaml安装nginx,并基于模提供配置信息
- hosts: all
tasks:
- name: 安装epel源
yum: name=epel-release state=present
- name: 安装nginx
yum: name=nginx state=latest
- name: 基于模板生成配置文件,并发送
template:
src=/root/template/nginx.conf.j2
dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: 启动服务
service: name=nginx state=started enabled=on
handlers:
- name: restart nginx
service: name=nginx state=restarted
5)执行yaml文件,并检查结果
- 略
4.5 tag
- hosts: all
vars:
- listen_port: 888
tasks:
- name: 安装epel源
yum: name=epel-release state=present
- name: 安装nginx
yum: name=nginx state=latest
- name: 基于模板生成配置文件,并发送
tags:
- sendFile
template:
src=/root/template/nginx.conf.j2
dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: 启动服务
service: name=nginx state=started enabled=on
handlers:
- name: restart nginx
service: name=nginx state=restarted
执行
[root@master ~]