前面已经介绍过Ansible的安装配置及常见模块的使用 --《Linux下使用Ansible处理批量操作

Palybook简介

palybook是由一个或多个paly组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓 task 无非是调用 ansible 的一个 module。将多个play组织在一个 playbook 中,即可以让它们联同起来按事先编排好的机制同唱一台大戏。

一个playbook由以下几个部分组成

  • hosts:运行执行任务(task)的目标主机。
  • remote_user:在远程主机上执行任务的用户。
  • tasks:任务集。
  • varniables: 内置变量或自定义变量在playbook中调用,变量替换{{ variable_name }}。
  • templates:模板,即使用模板语法的文件,比如配置文件等,使用jinja2语法。
  • handlers:和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行。
  • tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。

注意:

  1. gather_facts是一个play级别的指令设置,是负责收集目标主机信息的任务,由setup模块提供。默认情况下,每个play都会先执行这个特殊的任务,收集完信息之后才开始执行其它任务。但是,收集目标主机信息的效率很低,如果能够确保playbook中不会使用到所收集的信息,可以显式指定gather_facts: no来禁止这个默认执行的收集任务。
  2. handler用来执行某些条件下的任务,比如当配置文件发生变化的时候,通过notify触发handler去重启服务。在saltstack中也有类似的触发器,写法相对Ansible简单,只需要watch,配置文件即可。

为什么引入Playbook?

  • playBook功能比ad-hoc更全,是对ad-hoc的一种编排。
  • playBook能很好的控制先后执行顺序,以及依赖关系。
  • playBook语法展现更加的直观。
  • playbook可以持久使用,ad-hoc无法持久使用。

YAML的基本语法规则

  • playbook文件扩展名可以是yaml,也可以是yml。使用“#”号表示注释至行尾。
  • 在playbook文件中,可以连续三个减号(---)区分多个play。还有选择性的连续三个点(...)用来表示play的结尾,也可省略。
  • 第二行开始正常写playbook的内容,一般都会写上描述该playbook的功能。建议尽量为每个play和每个task都命名,且名称具有唯一性。
  • 只允许使用空格,缩进的级别必须是一致的,同样的缩进代表同样的级别,不能用Tab键缩进;程序判别配置的级别是通过缩进结合换行实现的。
  • YAML文件内容是区分大小写的,key/value的值均需大小写敏感。多个key/value可同行写也可换行写。同行使用分号( 分隔,换行写需要以减号(-)分隔。

YAML支持以下常用几种数据类型

  • 标量:单个的、不可再分的值 ;不可在分的量。包括字符串,布尔值,整数,浮点数,Null,时间,日期。key对应value
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

三种常见的数据格式

  • XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置。
  • JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释。
  • YAML:YAML Ain't Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab。

Playbook命令及用法

ansible-playbook  <filename.yml> ... [options]

ansible-playbook官方命令选项:https://docs.ansible.com/ansible/2.9/cli/ansible-playbook.html

[root@AnsibleControl ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] [root@AnsibleControl ~]# ansible-playbook --h
optional arguments:
--ask-vault-pass ask for vault password
  #加密playbook文件时提示输入密码
--flush-cache clear the fact cache for every host in inventory
  #清除清单中每个主机的缓存
--force-handlers run handlers even if a task fails
  #强制运行handlers的任务,即使任务失败也运行处理程序
--list-hosts outputs a list of matching hosts; does not execute anything else
  #输出匹配主机列表;不执行任何其他操作
--list-tags list all available tags
  #列出所有可用的标签
--list-tasks list all tasks that would be executed
  #列出所有将要执行的任务
--skip-tags SKIP_TAGS  only run plays and tasks whose tags do not match these values
  #跳过指定的tags任务
--start-at-task START_AT_TASK  start the playbook at the task matching this name
  #在匹配此名称的任务处开始运行剧本
--step one-step-at-a-time: confirm each task before running
  #在运行前确认每个任务,逐个执行
--syntax-check perform a syntax check on the playbook, but do not execute it
  #对playbook执行语法检查,并不实际执行
--vault-id VAULT_IDS the vault identity to use
  #使用的密码标识
--vault-password-file VAULT_PASSWORD_FILES vault password file
  #密码文件
--version show program's version number, config file location,configured module search path, module location,executable location and exit
  #显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出
-C, --check don't make any changes; instead, try to predict some of the changes that may occur
  #不做任何改变,不会真正在机器上执行(查看执行会产生什么变化),只是测试
-D, --diff when changing (small) files and templates, show the differences in those files; works great with --check
  #更改(小)文件和模板时,显示这些文件中的差异;与-C配合使用效果更好
-M MODULE_PATH, --module-path MODULE_PATH
prepend colon-separated path(s) to module library (def
ault=~/.ansible/plugins/modules:/usr/share/ansible/plu
gins/modules)
  #将冒号分隔的路径添加到模块库
-e EXTRA_VARS, --extra-vars EXTRA_VARS set additional variables as key=value or YAML/JSON, if filename prepend with @
  #在Playbook中引入外部参数变量
-f FORKS, --forks FORKS specify number of parallel processes to use (default=5)
  #指定要使用的并行进程数(默认值=5)FORKS被指定为一个整数
-h, --help show this help message and exit
-i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
  #指定清单主机路径或逗号分隔的主机列表,代替--inventory-file
-l SUBSET, --limit SUBSET further limit selected hosts to an additional pattern
  #限制选定的主机
-t TAGS, --tags TAGS only run plays and tasks tagged with these values
  #只运行带有tags标记的任务
-v, --verbose verbose mode (-vvv for more, -vvvv to enable
connection debugging) Connection Options:
control as whom and how to connect to hosts --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE use this file to authenticate the connection
  #使用此文件来验证连接
--scp-extra-args SCP_EXTRA_ARGS specify extra arguments to pass to scp only (e.g. -l)
  #指定仅传递给scp的额外参数
--sftp-extra-args SFTP_EXTRA_ARGS specify extra arguments to pass to sftp only (e.g. -f,-l)
  #指定仅传递给sftp的额外参数
--ssh-common-args SSH_COMMON_ARGS specify common arguments to pass to sftp/scp/ssh (e.g.ProxyCommand)
  #指定要传递给 sftp/scp/ssh 的常用参数
--ssh-extra-args SSH_EXTRA_ARGS specify extra arguments to pass to ssh only (e.g. -R)
  #指定仅传递给 ssh 的额外参数
-T TIMEOUT, --timeout TIMEOUT override the connection timeout in seconds (default=10)
  #SSH连接超时时间设定,默认10s
-c CONNECTION, --connection CONNECTION connection type to use (default=smart)
  #指定连接方式
-k, --ask-pass ask for connection password
-u REMOTE_USER, --user REMOTE_USER connect as this user (default=None)
  #指定远程主机以什么用户身份运行命令 Privilege Escalation Options:
control how and which user you become as on target hosts --become-method BECOME_METHOD privilege escalation method to use (default=sudo), use `ansible-doc -t become -l` to list valid choices.
  #要使用的权限提升方法 (default=%(default)s),使用ansible-doc -t become -l列出有效选项。
--become-user BECOME_USER run operations as this user (default=root)
  #以该用户身份运行操作(默认=root)
-K, --ask-become-pass ask for privilege escalation password
  #要求输入提权密码
-b, --become run operations with become (does not imply password prompting)
  #使用指定用户运行操作(不暗示密码提示)

在inventory中定义主机及主机组, 默认/etc/ansible/hosts文件中

[root@AnsibleControl ansible]# pwd
/etc/ansible
[root@AnsibleControl ansible]# tail -11 hosts
[ansible]
ansible-01 ansible_host=172.16.70.181
ansible-02 ansible_host=172.16.70.182
AnsibleControl ansible_ssh_host=172.16.70.37 [webservers]
ansible-01 ansible_host=172.16.70.181
ansible-02 ansible_host=172.16.70.182 [control]
AnsibleControl ansible_ssh_host=172.16.70.37

示例:服务器初始化 init.yaml

[root@AnsibleControl ansible]# cat init.yaml
---
- name: Set Hostname    #PLAY名称
hosts: webservers     #在inventory中定义主机及主机组,等其他组合
gather_facts: false    #禁止执行默认setup模块,不收集目标主机信息
vars:            #设置变量,可在play级别,也可在task级别
hostnames:
- host: 172.16.70.181
name: ansible-01
- host: 172.16.70.182
name: ansible-01
tasks:
- name: set hostname  #TASK名称
hostname:
name: "{{ item.name }}"
when: item.host == inventory_hostname
loop: "{{ hostnames }}" - name: Disable Selinux
hosts: all
gather_facts: false
tasks:
- block:
- name: disable on the fly
shell: setenforce 0 - name: disable forever in config
lineinfile:
path: /etc/selinux/config
line: "SELINUX=disabled"
regexp: '^SELINUX='
ignore_errors: true - name: Modify sshd_config
hosts: webservers
gather_facts: false
tasks:
- name: backup sshd config
shell:
/usr/bin/cp -f {{path}} {{path}}.bak
vars:
- path: /etc/ssh/sshd_config - name: disable root login
lineinfile:
path: "/etc/ssh/sshd_config"
line: "PermitRootLogin no"
insertafter: "^#PermitRootLogin"
regexp: "^PermitRootLogin"
notify: "restart sshd" - name: disable password auth
lineinfile:
path: "/etc/ssh/sshd_config"
line: "PasswordAuthentication no"
regexp: "^PasswordAuthentication yes"
notify: "restart sshd" handlers:
- name: "restart sshd"
service:
name: sshd
state: restarted

Ansible-playbook 应用梳理的更多相关文章

  1. Ansible playbook API 开发 调用测试

    Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...

  2. ansible playbook实践(四)-如何调试写好的playbook文件

    有时,我们写了一个长长,功能很强悍的yaml文件,但是,我们有可能会担心,写的yaml文件是否正确,是否有漏洞危机,毕竟是要修改线上的机器,那么,有可能我们可以从以下几个检查维度来进行,确保在大规模应 ...

  3. ansible playbook批量改ssh配置文件,远程用户Permission denied

    最近手里的数百台服务器需要改/etc/ssh/sshd_config的参数,禁止root直接登陆,也就是说 [root@t0 ~]# cat /etc/ssh/sshd_config | grep R ...

  4. ansible笔记(11):初识ansible playbook(二)

    ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...

  5. ansible笔记(10):初识ansible playbook

    ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...

  6. Ansible playbook 批量修改服务器密码 先普通后root用户

    fsckzy   Ansible playbook 批量修改服务器密码 客户的需求:修改所有服务器密码,密码规则为Rfv5%+主机名后3位 背景:服务器有CentOS6.7,SuSE9.10.11,r ...

  7. 写Ansible playbook添加zabbix被监控的对象

    本主题达到的效果是能通过编写Ansible Playbook,创建zabbix主机组,把被监控的对象加入到zabbix监控系统中,同时链接到对象的模板. 1.准备工作 在zabbix服务器上面,我们需 ...

  8. Ansible playbook基础组件介绍

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

  9. ansible playbook基本操作

    一.ansible playbook简单使用 相当于是把模块写入到配置文件里面 vim /etc/ansible/test.yml //写入如下内容: --- - hosts: 127.0.0.1 r ...

  10. ansible入门四(Ansible playbook基础组件介绍)

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

随机推荐

  1. Linux 驱动:LED子系统

    Linux 驱动:LED子系统 背景 在调试aw9523的时候,为了实现客户要的一个效果.需要修改驱动,但是大概看了一下驱动,但是因为不太熟悉LED子系统,所以有点云里雾里. 参考: https:// ...

  2. C#去除时间格式化之后中间的T字母

    需求是这样的, 前后端传参,然后后端序列化把字符串存在数据库. 然后发现时间类型的字段,序列化之后 ,有个字母T, DateTime dt = DateTime.Parse("2024-05 ...

  3. 开发板测试手册——SPI FLASH 读写、USB WIFI 模块(2)

    目录 1.8 SPI FLASH 读写测试 20 1.9 USB 接口读写测试 21 1.10 网络接口测试 23 1.10.1 网络连通测试 23 1.10.2 网络速度测试 25 2 网络静态 I ...

  4. 【JavaScript】聊聊js中关于this的指向

    前言 最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下Ja ...

  5. 用const修饰指针

    1)常量指针 语法:const 数据类型 *变量名; 不能通过解引用的方法修改内存地址中的值(用原始的变量名是可以修改的). 注意: l 指向的变量(对象)可以改变(之前是指向变量a的,后来可以改为指 ...

  6. python使用flask框架生成excle返回前端(包含图片、表格、表头灰色、表格加边框)

    python使用flask框架生成excle文档,文档中包含图片和表格,其中表格要包含图片.表格.表头灰色.表格加边框,照片和表格不重叠. 逻辑:获得图片的高度,根据高度计算表格从第几行开始插入. 效 ...

  7. 万维网WWW

    万维网是一个大规模的联机式信息储存场所,能方便地从一个网络站点访问另一个网络站点.万维网是一个分布式的超媒体系统. 统一资源定位符URL URL表示从互联网上得到的资源位置和访问这些资源的方法,实际上 ...

  8. 基于CFX的小型风电机组流场计算流程

    一.Workbench界面框架 二.Geometry模块操作 1.打开Geometry模块,导入txt格式模型 File >> Import External Geometry File ...

  9. AI时代你一定要知道的Agent概念

    这两年,随着人工智能(AI)和计算能力的发展,AI应用的落地速度大大加快.以ChatGPT为代表的AI应用迅速火遍全球,成为打工人的常用工具.紧接着,多模态.AI Agent等各种高大尚的名词也逐渐进 ...

  10. Aic 应用开发基础一(概念与场景)

    Agi通用人工智能应用概念与场景 大家看到,自美国OpenAI主导的GPT发布以来,全球科技领域掀起了革命性的浪潮.比如最近看到的aigc 人工绘图,智能机器人等行业,很多新概念掘起, 随着人工智能技 ...