Ansible-playbook 应用梳理
前面已经介绍过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中的部分代码。
注意:
gather_facts
是一个play级别的指令设置,是负责收集目标主机信息的任务,由setup
模块提供。默认情况下,每个play都会先执行这个特殊的任务,收集完信息之后才开始执行其它任务。但是,收集目标主机信息的效率很低,如果能够确保playbook中不会使用到所收集的信息,可以显式指定gather_facts: no
来禁止这个默认执行的收集任务。- 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 应用梳理的更多相关文章
- Ansible playbook API 开发 调用测试
Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...
- ansible playbook实践(四)-如何调试写好的playbook文件
有时,我们写了一个长长,功能很强悍的yaml文件,但是,我们有可能会担心,写的yaml文件是否正确,是否有漏洞危机,毕竟是要修改线上的机器,那么,有可能我们可以从以下几个检查维度来进行,确保在大规模应 ...
- ansible playbook批量改ssh配置文件,远程用户Permission denied
最近手里的数百台服务器需要改/etc/ssh/sshd_config的参数,禁止root直接登陆,也就是说 [root@t0 ~]# cat /etc/ssh/sshd_config | grep R ...
- ansible笔记(11):初识ansible playbook(二)
ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...
- ansible笔记(10):初识ansible playbook
ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...
- Ansible playbook 批量修改服务器密码 先普通后root用户
fsckzy Ansible playbook 批量修改服务器密码 客户的需求:修改所有服务器密码,密码规则为Rfv5%+主机名后3位 背景:服务器有CentOS6.7,SuSE9.10.11,r ...
- 写Ansible playbook添加zabbix被监控的对象
本主题达到的效果是能通过编写Ansible Playbook,创建zabbix主机组,把被监控的对象加入到zabbix监控系统中,同时链接到对象的模板. 1.准备工作 在zabbix服务器上面,我们需 ...
- Ansible playbook基础组件介绍
本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...
- ansible playbook基本操作
一.ansible playbook简单使用 相当于是把模块写入到配置文件里面 vim /etc/ansible/test.yml //写入如下内容: --- - hosts: 127.0.0.1 r ...
- ansible入门四(Ansible playbook基础组件介绍)
本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...
随机推荐
- Linux 驱动:LED子系统
Linux 驱动:LED子系统 背景 在调试aw9523的时候,为了实现客户要的一个效果.需要修改驱动,但是大概看了一下驱动,但是因为不太熟悉LED子系统,所以有点云里雾里. 参考: https:// ...
- C#去除时间格式化之后中间的T字母
需求是这样的, 前后端传参,然后后端序列化把字符串存在数据库. 然后发现时间类型的字段,序列化之后 ,有个字母T, DateTime dt = DateTime.Parse("2024-05 ...
- 开发板测试手册——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 ...
- 【JavaScript】聊聊js中关于this的指向
前言 最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下Ja ...
- 用const修饰指针
1)常量指针 语法:const 数据类型 *变量名; 不能通过解引用的方法修改内存地址中的值(用原始的变量名是可以修改的). 注意: l 指向的变量(对象)可以改变(之前是指向变量a的,后来可以改为指 ...
- python使用flask框架生成excle返回前端(包含图片、表格、表头灰色、表格加边框)
python使用flask框架生成excle文档,文档中包含图片和表格,其中表格要包含图片.表格.表头灰色.表格加边框,照片和表格不重叠. 逻辑:获得图片的高度,根据高度计算表格从第几行开始插入. 效 ...
- 万维网WWW
万维网是一个大规模的联机式信息储存场所,能方便地从一个网络站点访问另一个网络站点.万维网是一个分布式的超媒体系统. 统一资源定位符URL URL表示从互联网上得到的资源位置和访问这些资源的方法,实际上 ...
- 基于CFX的小型风电机组流场计算流程
一.Workbench界面框架 二.Geometry模块操作 1.打开Geometry模块,导入txt格式模型 File >> Import External Geometry File ...
- AI时代你一定要知道的Agent概念
这两年,随着人工智能(AI)和计算能力的发展,AI应用的落地速度大大加快.以ChatGPT为代表的AI应用迅速火遍全球,成为打工人的常用工具.紧接着,多模态.AI Agent等各种高大尚的名词也逐渐进 ...
- Aic 应用开发基础一(概念与场景)
Agi通用人工智能应用概念与场景 大家看到,自美国OpenAI主导的GPT发布以来,全球科技领域掀起了革命性的浪潮.比如最近看到的aigc 人工绘图,智能机器人等行业,很多新概念掘起, 随着人工智能技 ...