1 概述
Playbook组织格式是YAML格式,编排的是任务(task),用来记录重复执行的命令
YAML:YAML(/?j?m?l/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy d?t Net与Oren Ben-Kiki也是这语言的共同设计者。目前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
基本数据结构:
标量、数组、关联数组
表量:直接值
数组:用花括号组成的键值对
2 playbook的基础组件
1)Hosts:运行指定任务的目标主机;
2)remoute_user: 在远程主机上执行任务的用户;
sudo_user:
3)tasks:任务列表
模块,模块参数;
格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2) 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;
4)handlers:
任务,在特定条件下触发;
接收到其它任务的通知时被触发;
notify: HANDLER TASK NAME
5)variables:
(1) facts:可直接调用;
注意:可使用setup模块直接获取目标主机的facters;
例子
收集172.18.50.72内置变量,通过setup模块实现收集主机的变量
ansible 172.18.50.72 -m setup
(2) 用户自定义变量:
两种设定的方式
(a) ansible-playbook命令的命令行中的,-e可以重复使用
-e VARS, --extra-vars=VARS
(b) 在playbook中定义变量的方法:
vars:
- var1: value1
- var2: value2
变量引用:{{ variable }},变量两侧有空格
(3) 通过roles传递变量;
(4) Host Inventory
(a) 用户自定义变量
(i) 向不同的主机传递不同的变量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向组中的主机传递相同的变量;
[groupname:vars]
variable=value
(b) invertory参数
用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
3 运行playbook的方式
(1) 测试
ansible-playbook --check
只检测可能会发生的改变,但不真正执行操作;
ansible-playbook --list-hosts
例子
ansible-playbook --list-hosts installpkg.yml
列出运行任务的主机;
ansible-playbook --syntax-check
检查语法,没有输出表示没有语法错误
ansible-playbook --syntax-check installpkg.yml
(2) 运行
ansible-playbook 脚本
例子:
ansible-playbook installpkg.yml
4 例子
例一:编写一个yaml文档,用来安装redis和ngnix服务,并启动相关服务
注意,语法里有横线用来引导,区分不同的功能的语句,如下面语句有多个hosts,因此在hosts前加横杆,tasks有多个,用横杆区分每个tasks,而且缩进是有要求的,同一层级,一般缩进一样。注意横杆和冒号后有空格。
vim installpkg.yaml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 - name: start redis service service: name=redis state=started
准备redis的配置模板
更改redis配置模板监听端口为0.0.0.0 和 端口为6380
vim redis.conf vim /root/redis.conf bind 0.0.0.0 port 6380
查看playbook里的主机
ansible-playbook --list-hosts installpkg.yml
查看playbook里的tasks
ansible-playbook --list-tasks installpkg.yml
测试执行脚本,添加选项-C,并没有实际执行
ansible-playbook -C installpkg.yml
以上脚本,测试正常的话,就去掉-C选项,实际执行
ansible-playbook installpkg.yml
例二:handler的使用
条件式触发:handler,满足条件的时候触发条件
handlers:处理器,配置文件被修改的时候才执行,条件定义在notify
以下命令,表示当配置文件被更改的时候,notify就会触发handler,实现重启的操作.注意格式的书写。
vim /root/ansible/handler.yml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 tags: instconf notify: restart redis service - name: start redis service service: name=redis state=started handlers: - name: restart redis service service: name=redis state=restarted
例三:tag的使用
更改websrvs的配置内容,设置tag为instnginx
vim /root/ansible/installpkg.yml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest tags: instnginx - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 tags: instconf notify: restart redis service - name: start redis service service: name=redis state=started handlers: - name: restart redis service service: name=redis state=restarted
查看任务,会显示对应的标签
ansible-playbook --list-tasks installpkg.yml
指定标签,可以重新跑指定的标签命令,如他部分的命令不执行,如这里指定tag为instnginx,则只安装nginx包,但是不启动服务,其他部分的命令不会执行
ansible-playbook -t instnginx installpkg.yml
同时跑多个标签,多个任务可以指定同一标签,比较灵活 。如以下配置中,把安装不同的服务包的tag都设置为instpkg,同时设置了 复制dbsrvs组的配置文件,设备复制文件的tag为instconf,同时执行多个tag间用逗号隔开
vim /root/ansible/installpkg.yml - hosts: websrvs remote_user: root tasks: - name: install nginx package yum: name=nginx state=latest tags: instpkg - name: start nginx service service: name=nginx enabled=true state=started - hosts: dbsrvs remote_user: root tasks: - name: install redis package yum: name=redis state=latest tags: instpkg - name: install conf file copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644 tags: instconf notify: restart redis service - name: start redis service service: name=redis state=started handlers: - name: restart redis service service: name=redis state=restarted
执行如下
ansible-playbook -t instpkg,instconf installpkg.yaml
结果是websrvs组只安装nginx,但是没有启动nginx服务,同时dbsrvs安装了redis包而且复制了配置文件到对应的主机,而且在install conf file任务中配置了notify任务,所以dbsrvs组的redis服务会被启动
例四:变量的使用
通过变量pkgname安装相关的包
vim installvar.yml - hosts: websrvs remote_user: root vars: - pkgname: tree tasks: - name: install package yum: name={{ pkgname }} state=latest
运行脚本,不指定变量默认是安装tree
ansible-playbook installvar.yml
指定变量,playbook命令行里定义的变量优先级比脚本里高, 这里会安装memcached,而不是脚本里的tree
ansible-playbook -e "pkgname=memcached" installvar.yaml
直接在host里定义变量,但是这个变量级别很低,比脚本里的变量还低
vim /etc/ansible/hosts [websrvs] 172.18.50.72 pkgname=redis 172.18.50.75 pkgname=memcached
vim /root/ansible/installvar.yml - hosts: websrvs remote_user: root vars: - pkgname: tree tasks: - name: install package yum: name={{ pkgname }} state=latest
执行命令
ansible-playbook installvar.yaml
则websrvs安装的服务包是tree,而不是/etc/ansible/hosts里赋值的变量
去掉脚本里的变量
vim /root/ansible/installvar.yaml - hosts: websrvs remote_user: root tasks: - name: install package yum: name={{ pkgname }} state=latest
重新执行
ansible-playbook installvar.yml
则72主机安装服务包redis,75主机安装memcached
例五:在配置文件里传递参数
vim /etc/ansible/hosts [websrvs] 172.18.50.72 pkgname=redis ansible_ssh_user=root ansible_ssh_pass=Pass123456 172.18.50.75 pkgname=memcached
Ansible 之 playbook使用