会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 Ansible-playbook剧本!!

Ansible-playbook剧本!

时间:2025-11-04 21:08:46 来源:益强数据堂 作者:人工智能 阅读:488次

  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语法格式,后缀可以是WordPress模板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 # 取出错误信息

  | 变量小结

  为何使用变量:

  剧本,脚本使用的变量放在一个文件中,剧本开头的

  一般存放:用户名,用户组,目录,端口

(责任编辑:应用开发)

推荐内容
  • iCloud照片删除指南(掌握iCloud照片删除的方法,释放存储空间)
  • 分享一些有意思的程序员资源与工具
  • 电脑上值得推荐的10款工具软件大盘点
  • 如何快速在GitHub上做出标星10K的开源项目
  • 快速上手(轻松实现系统启动,快速解决电脑问题)
  • 刚刚,贺建奎因“基因编辑婴儿”被判三年有期徒刑