【linux云计算SRE课程】Ansible-playbook剧本!
老男孩IT教育
技术博客
2022年10月12日 16:13
Playbook 与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用
Playbook 与ad-hoc相比,是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色
从根本上来讲,所谓的task无非是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务

Playbook使用场景
1、执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行的ad-hoc命令是不合适的,这时候最好使用playbook
2、就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式
3、使用playbook可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码
4、在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook可以把常见的应用都编写playbook,之后管理服务器会变得很简单
Playbook核心元素
Hosts 执行的远程主机列表
Tasks 任务集
Varniables 内置变量或自定义变量在playbook中调用
Templates 模板,即使用模板语法的文件,比如配置文件等
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码
Playbook语法
playbook使用yaml语法格式,后缀可以是yaml,也可以是yml
在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略
次行开始正常写playbook的内容,一般都会写上描述该playbook的功能
使用#号注释代码
缩进必须统一,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的
YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
k/v的值可同行写也可以换行写。同行使用:分隔
v可以是个字符串,也可以是一个列表
一个完整的代码块功能需要最少元素包括 name: task
playbook与AD-Hoc的关系
①playbook是对AD-Hoc的一种编排方式
②playbook可以持久运行(重复),而Ad-Hoc只能临时运行
③playbook适合复杂的任务,而Ad-Hoc适合做快速简单的任务(检查,查询, 巡检)
④playbook能控制任务执行的先后顺序
ad-hoc 用于检查,测试,临时获取数据
playbook剧本适用于,重复性操作(部署环境、服务,初始化操作(优化))
Playbook急速入门
剧本格式叫yaml格式为yml
缩进不要用tab键,要用空格键

核心格式剧本中所有的内容要对齐
对齐的时候不能使用tab键
只能使用空格,2个空格
hosts用于指定在哪些主机执行指令
tasks: 用于对于这些主机,运行什么模块及选项
| hosts 配置介绍
# cat /etc/ansible/hosts
[web]
10.0.0.101
10.0.0.102
[nfs]
10.0.0.103
[backup]
10.0.0.104
| 在所有机器的/tmp下面创建oldboy.txt
# 创建存放剧本的目录
mkdir -p /oldboyedu/ansible/playbook/
# yml文件配置
cat >01.touch.yml<<EOF
- hosts: all
vars:
filename: oldboy.txt
tasks:
- name: touch file
shell: touch /tmp/{{ filename }}
EOF
# 运行playbook剧本
ansible-playbook 01.touch.yml

| 添加定时同步时间的定时任务
原始命令行的ansible命令:
ansible all -m cron -a 'name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present'
ansible all -a 'crontab -l'
修改为剧本之后:
# 简单粗暴版本
---
- hosts: all
tasks:
- name: add cron sync time
cron: name="sync time by lidao996 20221111" minute="*/2" job="/sbin/ntpdate ntp1.aliyun.com &>/dev/null" state=present
# 格式优化后
---
- hosts: all
tasks:
- name: add cron sync time
cron:
name: "sync time by oldboyedu"
minute: "*/2"
job: "/sbin/ntpdate ntp1.aliyun.com &>/dev/null"
state: present
在剧本中使用模块和选项
选项最好是一行一个选项,选项后面的跟着冒号
选项要对齐与缩进

| 批量下载安装zabbix-agent2客户端并启动
部署流程

剧本编写
- hosts: 10.0.0.101
tasks:
- name: 1. download zabbix agent2 rpm
get_url:
url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.0-1.el7.x86_64.rpm
dest: /tmp/
validate_certs: no
- name: 2. install zabbix agent2 rpm
yum:
name: /tmp/zabbix-agent2-6.0.0-1.el7.x86_64.rpm
state: installed
- name: 3. start zabbix agent2 service
systemd:
name: zabbix-agent2
enabled: yes
state: started
| 部署rsync服务端
准备:当前目录中包含,rsyncd.conf配置文件
剧本编写
- hosts: backup
tasks:
- name: 1)服务部署:yum 安装rsync
yum:
name: rsync
state: latest
- name: 2)配置文件分发
copy:
src: /tmp/rsyncd.conf
dest: /etc/rsyncd.conf
backup: yes
- name: 3)创建虚拟用户rsync
user:
name: rsync
shell: /sbin/nologin
create_home: no
state: present
- name: 4)密码文件和权限
lineinfile:
path: /etc/rsync.password
mode: 0600
line: "rsync_backup:1"
create: yes
- name: 5)修改模块对应目录的所有者
file:
path: /data/
owner: rsync
group: rsync
state: directory
- name: 6)重启rsync服务
systemd:
name: rsync
enabled: yes
state: started
Ansible变量相关
变量分类

| vars, vars_files, group_vars方式
方法一:vars
剧本中定义变量
- hosts: all
vars:
dir_name: /oldboyedu
file_name: oldboy.txt
tasks:
- name;01. mkdir
file:
path: "{{ dir_name }}"
state: directory
- name: 02. touch
file:
path: "{{ dir_name }}/{{ file_name }}"
state;touch
方法二:vars_files
把变量存放到一个文件中. 剧本比较大的时候
cat >vars.yml<EOF
dir_name: /oldboyedu
file_name: oldboy.txt
EOF
剧本编写
- hosts: all
vars_file: ./vars.yml
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory
- name: 02. touch
file:
path: "{{ dir_name }}/{{ file_name }}"
state: touch
方法三:group_vars
创建一个变量文件,给某个组共用
用法:
需要创建一个group_vars目录
目录下面创建以主机组命名的目录
存放变量文件vars.yml

根据不同的主机组创建对应的目录
变量文件内容
# cat group_vars/backup/vars.yml
dir_name: /oldboy_backup
# cat group_vars/web/vars.yml
dir_name: /oldboy_web
剧本内容
- hosts: all
tasks:
- name: 根据不同主机创建不同目录
file:
path: "{{ dir_name }}"
state: directory

使用group_vars的all组定义变量
变量文件内容
# cat group_vars/all/vars.yml
dir_name: /oldboyedu_all
file_name: oldboy.txt
剧本内容
- hosts: all
tasks:
- name: 01. mkdir
file:
path: "{{ dir_name }}"
state: directory
- name: 02. touch
file:
path: "{{ dir_name }}/{{ file_name }}"
state: touch

变量基础定义小结

| ansible-facts变量
facts变量说明 : ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息
查看 ansible facts变量内容
ansible web -m setup
常用fact变量

系统巡检
获取所有机器的基础信息保存到/tmp/主机名命名文件中
步骤:
创建文件
写入内容
# 剧本内容
- hosts: all
tasks:
- name: 创建文件并写入系统基本信息
lineinfile:
path: /tmp/{{ ansible_hostname }}
create: yes
line: "主机名:{{ ansible_hostname }}\n
ip地址:{{ ansible_default_ipv4.address }}\n
内存总计:{{ ansible_memtotal_mb }}"
facts小结
如果ans中使用到了一些系统的基础信息. 比如: ip地址,主机名,时间
如果没有这种需求或通过别的方式实现这个需求,可以关闭facts功能,让剧本执行加速. 使用gather_facts: no
- hosts: all
gather_facts: no
vars:
dir_name: /oldboyedu
file_name: oldboy.txt
tasks:
- name;01. mkdir
file:
path: "{{ dir_name }}"
state: directory
- name: 02. touch
file:
path: "{{ dir_name }}/{{ file_name }}"
state;touch
| ansible-register变量
相当于创建压缩包压缩包名字包含时间;tar打包压缩,date获取时间
tar zcf /tmp/etc-`date +%F`.tar.gz /etc/
创建以主机名命名文件/opt/主机名
步骤:
获取主机名:hostname
创建文件,使用上一步的结果
register: 变量名字 # 这个变量的内容,叫json格式.
register: hostname # json格式,只想要输出标准输出 stdout standard output 标准输出.
hostname.stdout #取出命令的结果 `hostname`
# 剧本编写
- hosts: all
tasks:
- name: 01. 获取主机名
shell: hostname
register: hostname
- name: 输出变量内容
debug:
msg: "{{ hostname }}"
- name: 02. 创建文件
file:
path: /opt/{{ hostname.stdout }}
state: touch

register: hostname
hostname.stdout # 正常输出信息
hostname.rc # 取出返回值.
hostname.stderr # 取出错误信息
| 变量小结
为何使用变量:
剧本,脚本使用的变量放在一个文件中,剧本开头的
一般存放:用户名,用户组,目录,端口

老男孩教育Linux运维云计算课程汇集了虚拟化、云计算、安全攻防、Python开发、SRE等技术,课堂效率高、内容丰富全面,由浅入深,循序渐进,帮助学员稳扎稳打,夯实基础,在有限的时间内帮助学员高效提升,成为符合企业需求的技术型人才。
老男孩教育专注IT教育10余年,只培养IT技术精英
全国免费咨询电话(渠道合作):400-609-2893











