Ansible-playbook
1. 什么是playbook?
简单点说,playbook就是ansible用于配置,部署和管控节点机器的剧本,将一系列命令的集合归一使用,类似于shell脚本,不过更加强大.
2. playbook与shell脚本比对
它们功能形似,playbook和shell脚本一样,都是批量处理任务.都是把很多命令组合到一起,加入对应条件判断等,要说区别就是命令结构和被执行场景有所不同;
shell脚本由一条条命令构成,一般只在当前的服务器运行;
playbook中是有一个个task任务构成,每个task都可以当做shell中的一条命令,playbook不止在一个服务器上执行,因此它需要在其中指定运行该playbook的服务器名.而且playbook有着自己的语法格式
3. playbook语法格式
playbook由YMAL语言编写,YMAL格式类似于JSON格式,便于写读和理解,它的格式如下:
#格式
1.文件的第一行应该以 "---"这三个连续字符开始,代表了YAML文件的开始
2.在一行中, # 后面的内容代表注释,python,ruby,shell都是如此
3.YAML中的列表元素以"-"开头然后紧接着一个空格,后面为元素内容
4.在同一个列表中的元素应该保持相同的缩进,否则会当作错误处理
5.play中hosts ,variables,roles,tasks等对象的表示方法都是键值对,中间以 ":"分割,且":"后面还要增加一个空格.
6.文件名称后缀为 xxx.yml/yaml
#示例
---
#复制file
- hosts: task01
remote_user: root
tasks:
- name: copyfile copy: src=/etc/passwd dest=/tmp/data
4. playbook参数
① 基本参数
# p1.yml
--- #文件开头 - hosts: dbservers #指定该playbook在哪个服务器上执行 remote_user: root #指定远程的用户名, vars: ##表示定义变量 http_port: 80 #变量形式key: value user: coco tasks: #构成playbook的tasks,每个task都有 - name: 开始,name 指定该任务的名称 - name: copyfile copy: src=/etc/fstab dest=/tmp/fs - name: install redis yum: name=redis
② ansible-playbook -h命令分析
#常用命令 -C --check #检查但是不会真的执行 -f FORKS, --forks=FORKS #并发,默认5个 --list-hosts #列出匹配的主机 --sytax-check #检查语法
-t #只执行某个task任务
③ 执行一个playbook命令 --->ansible-playbook p1.yml (单任务)
p1.yml
注解:如上图所示
- PLAY表示执行hosts 中web组远程机器
- 第一个TASK表示正在收集两台远程机器的数据信息,采集成功为显示绿色,代表执行成功
- 第二个TASK表示我们要执行任务的名称,执行成功后状态发生变化为黄色,状态没变化为绿色,执行失败为红色.
④ 再来个例子ansible-playbook p2.yml(多任务)看看效果,会更加清楚
p2.yml
执行p2.yml
注意:执行后发现第一个task任务执行完后,第二个task任务才执行的,多个task是顺序执行的,所以先创建,再删除...
5. playbook幂等性
什么意思呢?就是不管执行多少次,得到的结果永远是相同的,试着一直执行p2.yml,最终的结构都一样.
6. playbook (5种传参方式)
为什么要这么做呢?
主要防止需求不断变化嘛,总不能反复修改文件吧..
方式一
---
#方式一
- hosts: web
remote_user: root
tasks:
- name: create{{user}}
user: name={{user}}
ansible-playbook -e user=superman p1.yml
#有没有发现什么?没错就是jinja2模板语法,
方式二
[web]
192.168.220.[134:135] user=laifu
192.168.220.136 user=wangcai
#vi /etc/ansible/hosts
#针对hosts文件进行传参,执行结果web组为全部创建laifu
#实际上134,135会创建出laifu用户,136会创建出wangcai用户.
ansible-playbook p1.yml
方式三
[web:vars]
user=taidi
#还是在hosts文件传参,给web组vars进行传参
ansible-playbook p1.yml 会创建出一个taidi用户
方式四
- hosts: web
vars:
- user: jinmao
tasks:
- name: create{{user}}
user: name={{user}}
#利用vars变量参数进行传参,执行后会创建出一个jinmao用户
方式五
- hosts: web
tasks:
- name: yumbc
yum: name=bc
- name: sum
shell: echo 8+9|bc #linux 计算通过bc
register: user #得到结果注册为user,但是拿到一个字典
- name: echo
shell: echo {{user.stdout}} >/tmp/sum.txt #将user字典中的stdout值取出来
- name: createuser{{user.stdout}} user: name=keke{{user.stdout}} #执行创建出keke9 #上面先计算,注册user得到一个大字典,再取出user.stdout写到文件中,最后创建对应的参数的用户keke9
注:这五种传参优先级: -e >playbook的vars >hosts
7. setup模块
在playbook中负责收集信息,因此放在这里进行补充模块信息
① 执行命令 ansible 192.168.220.134 -m setup |more 收集信息
setup模块常用的参数
快速获取想要的setup收集的部分信息
② 正则在linux中简单实用
[root@localhost playbook]# echo 123 |grep "[0-9]\{2\}" #发现"{}"是需要转义的
123 #取到12
[root@localhost playbook]# echo 123 |grep "[0-9]\?" #?也需要转义
123 #取到123
[root@localhost playbook]# echo 123 |grep "^[0-9]"
123 #取到1
[root@localhost playbook]# echo 123 |grep "\<[0-9]" #^在linux中也可以写成\>放在起始位
123 #取到 1
[root@localhost playbook]# echo 123 |grep "[0-9]$"
123 #取到3
[root@localhost playbook]# echo 123 |grep "[0-9]\>" #^在linux中也可以写成\>放在末位
123 #取到3