playbook-剧本 介绍
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
写个playbook实现测试web节点状态
[root@ansible ~]# vim ping.yml
--- #固定格式
- name: 检查主机的连通性 #name的作用添加一个注释和说明
hosts: web #主机的集合
tasks: #命令的集合
- name: 命令1
ping:
# - name: 命令2
# ping:
[root@ansible ~]# ansible-playbook ping.yml --syntax-check
playbook: ping.yml #表示语法正确
[root@ansible ~]# ansible-playbook ping.yml
PLAY [检查主机的连通性]
TASK [Gathering Facts]
ok: [web2]
ok: [web1]
TASK [命令1]
ok: [web2]
ok: [web1]
user模块的使用
利用ansible-doc 模块名可以查看帮助,找到模块的例子直接可以使用
[root@ansible ~]#ansible-doc user #查看user模块的帮助信息
[root@ansible ~]# vim user.yml
---
- name: 创建用户
hosts: web
tasks:
- name: 创建用户
user:
name: z3
uid: 1040
group: users
- name: 修改密码
shell: echo 123 | passwd --stdin z3
[root@ansible ~]# ansible-playbook user.yml
练习1:
- 所有web主机安装apache
- 修改配置文件的监听端口为8080
- 设置默认主页为hello world
- 启动服务
- 设置开机自启
[root@ansible ~]# vim httpd.yml
---
- name: 部署httpd
hosts: web
tasks:
- name: 安装httpd
yum:
name: httpd
state: installed
- name: 修改端口为8080
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: 'Listen 8080'
- name: 修改默认首页#也可以使用copy模块
shell: echo 'hello world' > /var/www/html/index.html
- name: 重启httpd服务
service:
name: httpd
state: restarted
enabled: yes
: ! ansible-doc 模块名 可以不退出vim查看帮助手册
: ! ansible-doc 模块名 可以不退出vim查看帮助手册
[root@ansible ~]# ansible-playbook httpd.yml --syntax-check
playbook: user.yml
[root@ansible ~]# ansible-playbook httpd.yml
PLAY [部署httpd] ***********************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************
ok: [web1]
ok: [web2]
TASK [安装httpd] ***********************************************************************************************************************
changed: [web2]
changed: [web1]
TASK [修改端口为8080] *********************************************************************************************************************
changed: [web2]
changed: [web1]
TASK [修改默认首页#也可以使用copy模块] ************************************************************************************************************
changed: [web1]
changed: [web2]
TASK [重启httpd服务] *********************************************************************************************************************
changed: [web1]
changed: [web2]
PLAY RECAP ***************************************************************************************************************************
web1 : ok=5 changed=4 unreachable=0 failed=0
web2 : ok=5 changed=4 unreachable=0 failed=0
playbook语法进阶
vars介绍:
- 在palybook中使用vars 表示使用变量
- 定义变量的格式为key: value,变量是vars的子层所以要放在第二行写
- 调用变量的格式为 “{{value}}”
实例1:
[root@ansible ~]# vim user.yml
---
- name: 添加用户
hosts: web
vars: #vars表示使用变量
username: l4 #格式为key:values
tasks:
- name: 添加用户 "{{username}}" #调用变量用户"{{变量名}}"
user:
name: "{{username}}"
group: users
- name: 修改密码
shell: echo 123 | passwd --stdin "{{username}}"
外部向playbook传参方法:
- palybook里只需要调用变量,参数由外部传入,代码详情见下图
- 方法一 利用json语法,-e 表示调用参数
[root@ansible ~]# ansible-playbook user.yml -e’{“username”:“dachui”}’ - 方法二 利用yaml语法
[root@ansible ~]# ansible-playbook user.yml -e @test.yml
[root@ansible ~]#cat test.yml
---
username: jerry
[root@ansible ~]# vim user.yml
---
- name: 添加用户
hosts: web
tasks:
- name: 添加用户 "{{username}}" #调用变量用户"{{变量名}}"
user:
name: "{{username}}"
group: users
- name: 修改密码
shell: echo 123 | passwd --stdin "{{username}}"
ignore_errors的使用:
- play中只要执行命令的返回值不为0,就会报错,tasks停止,可以添加下面
- ignore_errors: True #忽略错误,强制返回成功
实例1:
****
Tags介绍:
- 在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了
[root@ansible ~]# cat user.yml
---
- name: 修改web集群
hosts: web
tasks:
- name: 修改配置文件
copy: src=httpd.conf dest=/etc/httpd/conf/httpd.cnf
- name: 修改默认首页
tags: conf_index #定义标签
copy: src=index.html dest=/var/www/html/index.html
- name: 重启服务
service: name=httpd state=restarted enabled=true
[root@ansible ~]# ansible-playbook user.yml -t conf_index //-t 表示 tags标签
Handlers介绍
- handlers也是一些task的列表,和一般的task并没有什么区别。
- 是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则-Handlers被执行
- 不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
when和register的使用
- when的值是一个条件表达式,如果条件判断成立,这个task就执行,如果判断不成立,则task不执行
- 在task后添加when子句即可使用条件测试
- register用来定义一个变量,来保存变量的值
- 可利用debug将变量里的值全部显示出来方便理解
[root@ansible ~]# uptime | awk -F, '{print $3}' | awk -F: '{print $2}'
0.00
[root@ansible ~]# vim user.yml
---
- name: 监控系统负载
hosts: web1
tasks:
- name: 获取系统负载
shell: "uptime | awk -F, '{print $3}' | awk -F: '{print $2}'"
register: result #将结果保存到result中
- name: 停止httpd服务
service: name=httpd state=stopped
when: result.stdout | float > 0.7 #result.stdout意思是取出标准输出 float是将结果转为整数和0.7比较
- debuge: var=result
验证:
[root@web1 ~]# awk ‘BEGIN{while(1){}}’ & #写个死循环触发系统负载
[root@web1 ~]# watch uptime //持续监控
[root@web1 ~]# uptime
15:03:08 up 6:28, 1 user, load average: 0.71, 0.23, 0.12
with_items
- with_items是palybook标准循环
- 用于迭代一个列表或字典,通过{{item}}获取每次迭代的值
- 例如创建多个用户并且要求各个用户的密码不同
实例
- name: 添加多个用户
hosts: web1
tasks:
- name: 添加用户 "{{item.username}}"
user:
name: "{{item.username}}"
group: "{{item.group}}"
password: "{{item.password | password_hash('sha512')}}"
with_items:
-
username: bob
group: games
password: '123456'
-
username: kenji
group: bin
password: qwer123
-
username: ailisi
group: adm
password: 123qqq...A