Ansible_编写Playbook文件
一、Playbook的实施
1、Ansible playbook与临时命令概述:
- 临时命令可以作为一次性命令对一组目标主机运行一项简单的任务
- play是针对清单中选定的主机运行的一组有序任务。playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表
- Play可以将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成功成果
- 在playbook中,可以将play内的任务序列保存为人类可读并可立即运行的形式
2、Ansible playbook的编写规则
- Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存
- Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格
- 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量
- 如果项目属于其他项目的子项,其缩进量必须大于父项
- Playbook开头的一行由三个破折号(---)组成,这是文档开始标记。其末尾可能使用三个圆点(...)作为文档结束标记,尽管在实践中这通常会省略
- YAML列表中的项目以一个破折号加空格开头
- Play本身是一个键值对集合。同一play中的键应当使用相同的缩进量
- 作为play中的一部分,tasks属性按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合
- playbook中play和任务列出的顺序很重要,Ansible会按照相同的顺序运行它们
3、编写规则实例
- 执行单个任务实例:
//安装httpd服务
[root@localhost ~]# vim example.yml
---
- name: This is test example playbook
hosts: 192.168.121.81 #如果是多个主机,可以使用all表示对所有主机操作
tasks:
- name: install httpd
yum:
name: httpd
state: present //执行example.yml文件
[root@localhost ~]# ansible-playbook example.yml
PLAY [This is test example playbook] ************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [192.168.121.81] TASK [install httpd] ******************************************************************************************************************************************************
changed: [192.168.121.81] PLAY RECAP ****************************************************************************************************************************************************************
192.168.121.81 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 执行多个任务实例:
//执行多个任务,先安装httpd服务,然后启动httpd服务
[root@localhost ~]# vim example.yml
---
- name: This is test example playbook
hosts: 192.168.121.81
tasks:
- name: install httpd
yum:
name: httpd
state: present - name: start httpd service
service:
name: httpd
state: started
enabled: yes //执行example.yml文件
[root@localhost ~]# ansible-playbook example.yml PLAY [This is test example playbook] ************************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************************
ok: [192.168.121.81] TASK [install httpd] ******************************************************************************************************************************************************
ok: [192.168.121.81] TASK [start httpd service] ************************************************************************************************************************************************
changed: [192.168.121.81] PLAY RECAP ****************************************************************************************************************************************************************
192.168.121.81 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 //查看受管主机上httpd服务状态
[root@localhost ~]# ansible 192.168.121.81 -m shell -a 'systemctl status httpd'
192.168.121.81 | CHANGED | rc=0 >>
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-08-29 14:34:37 CST; 2min 15s ago
Docs: man:httpd.service(8)
Main PID: 17031 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 11340)
Memory: 43.4M
CGroup: /system.slice/httpd.service
├─17031 /usr/sbin/httpd -DFOREGROUND
├─17033 /usr/sbin/httpd -DFOREGROUND
├─17034 /usr/sbin/httpd -DFOREGROUND
├─17035 /usr/sbin/httpd -DFOREGROUND
└─17036 /usr/sbin/httpd -DFOREGROUND Aug 29 14:34:37 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Aug 29 14:34:37 localhost.localdomain httpd[17031]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Aug 29 14:34:37 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Aug 29 14:34:37 localhost.localdomain httpd[17031]: Server configured, listening on: port 80
4、执行playbook
- absible-playbook命令可用于运行playbook。该命令在控制节点上执行,要运行的playbook的名称则作为参数传递。
[root@localhost ~]# ansible-playbook example.yml- 在运行playbook时,将生成输出来显示所执行的play和任务。输出中也会报告执行的每一项任务的结果
- 在playbook运行时,屏幕中会显示每个play和任务的name键的值
- Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务
- 对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展
- 通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改
5、执行ansible-playbook,提高输出信息详细程度
- 输出详细程度命令:
选项 描述 -v 显示任务结果 -vv 任务结果和任务配置都会显示 -vvv 包含关于与受管主机连接的信息 -vvvv 增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本
6、语法验证
- 在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个--syntax-check选项,可用于验证playbook的语法
- 语法实例:
[root@ansible roles]# ansible-playbook --syntax-check vhosts.yaml playbook: vhosts.yaml
//没有报错,说语法没有错误
7、检测文件执行是否出错
- 可以使用-C选项对playbook执行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改
- 检测实例:
[root@ansible roles]# ansible-playbook -C vhosts.yaml
........
二、执行多个play
1、编写多个play规则
- Playbook是一个YAML文件,含有由一个或多个play组成的列表,记住一个play按顺序列出了要对清单中的选定主机执行的任务
- Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项
- 演示实例:
---
- name: first play
hosts: 192.168.121.81
tasks:
- name: first task
yum:
name: httpd
status: present - name: second task
service:
name: httpd
enabled: true - name: second play
hosts: 192.168.121.82
tasks:
- name: first task
service:
name: mariadb
enabled: true
2、playbook中的远程用户和特权
Playbook可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在playbook本身中与hosts或tasks关键字相同的级别上设置
1️⃣:用户属性
- playbook中的任务通常通过与受管主机的网络连接来执行
- 用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字
- 运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用
- 如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在playbook中使用remote_user关键字覆盖
- 演示实例:(remote_user 表示连接远程主机的用户名)
---
- name: test file
hosts: all
remote_user: lisi
2️⃣:特权升级属性
- Ansible也提供额外的关键字,从而在playbook内定义特权升级参数
- become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它
- 演示实例:(使用“true”或“yes”来表示启用这个特权,如:become=true)
---
- name: test file
hosts: all
remote_user: lisi
become: yes - 如果启用了特权升级,则可以使用become_method关键字来定义特定playbook期间要使用的特权升级方法
- 演示实例:(become_method=sudo 表示用什么方式将普通账户切换到root或所需的其他账户,同样包括普通用户使用sudo执行命令,这里可以用su或sudo)
---
- name: test file
hosts: all
remote_user: lisi
beacome: yes
become_method: sudo
- 演示实例:(become_method=sudo 表示用什么方式将普通账户切换到root或所需的其他账户,同样包括普通用户使用sudo执行命令,这里可以用su或sudo)
- 此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户
- 演示实例:(become_user=root 设置为root账户,相当于我们以普通账户登入到远程主机时,再使用su - root切换为root账户)
---
- name: test file
hosts: all
remote_user: lisi
beacome: yes
become_method: sudo
become_user: root //become_user为普通用户时,表示以普通用户身份登录远程主机
- 演示实例:(become_user=root 设置为root账户,相当于我们以普通账户登入到远程主机时,再使用su - root切换为root账户)
3️⃣:演示如何在play中使用关键字
---
- name: /etc/hosts is up to date
hosts: 192.168.121.81
remote_user: root
become: yes tasks:
- name: 192.168.121.81 in /etc/hosts
lineinfile:
path: /etc/hosts
line: '192.168.121.81 web1.example.com'
state: present
3、查找用于任务的模块
1️⃣:对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明
- ansible-doc -l命令。这将显示模块名称列表以及其功能的概要
[root@ansible ~]# ansible-doc -l
2️⃣:使用ansible-doc [module name]命令来显示模块的详细文档
- 演示实例:
[root@ansible ~]# ansible-doc yum
3️⃣:ansible-doc命令还提供-s选项,它会生成示例输出,可以充当如何在playbook在使用特定模块的示范,此输出可以作为起步模板,包含在实施该模块以执行任务的playbook中。输出中包含的注释,提醒管理员各个选项的用法
- 演示实例:
[root@ansible ~]# ansible-doc -s yum
4、play语法变化
1️⃣:YAML注释
- 注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释
- 如果注释的左侧有内容,请在该编号符号的前面加一个空格
2️⃣:YAML字符串
- YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起
- 实例:
this is a string
'this is another string'
"this is yet another a string"
- 实例:
- 编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符
- 实例:
include_newlines: |
Example Company
123 Main Street
Atlanta, GA 30303
- 实例:
- 要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除
- 实例:
fold_newlines: >
This is an example
of a long string,
that will become
a single sentence once folded.
- 实例:
3️⃣:YAML字典
- 字典实例:
name: svcrole
svcservice: httpd
svcport: 80
4️⃣:YAML列表
- 实例:
hosts:
- 192.168.121.81
- 192.168.121.82
- 192.168.121.83
Ansible_编写Playbook文件的更多相关文章
- Ansible_包含和导入playbook文件
一.管理大型的playbook 1️⃣:如果playbook很长或很复杂,我们可以将其分成较小的文件以便于管理 2️⃣:可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件 ...
- Ansible 笔记 (3) - 编写 playbook
playbook 相当于多个命令的编排组合然后一起运行,类似写脚本.在学习 playbook 之前需要了解 yaml 格式. 编写playbook的步骤: 定义主机与用户 编写任务列表 执行 play ...
- 编写.gitignore文件的几个小技巧
记录几个编写.gitignore文件的小技巧,可能你早就知道了,但我是google了一番才找到写法. 忽略所有名称为bin的文件夹 bin/ 只忽略第一级目录中,名称为bin的文件夹 /bin/ 忽略 ...
- TypeScript Writing .d.ts files(编写声明文件)
当使用扩展的JavaScript库或者插件API的时候,将需要使用声明文件(.d.ts)来描述库的类型.本文内容将包括如何编写声明文件相关的一些高级概念,然后用一些例子来展示如何将各式各样的概念与声明 ...
- 工具软件发现(编写chm 文件的工具)
编写chm 文件的工具 1.PrecisionHelper 安装之后,发现 编写的很不方便,直接在html 上编写-- 不好用 2.Winchm (推荐) 很好用,赞!至少对比了上面那个复杂的操作之后 ...
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
- VC2010编写Dll文件(转)
源:VC2010编写Dll文件 1. 打开VS2010[Flie / New / Project / Visual C++ / Win32 / Win32 Console Application]在下 ...
- 用记事本编写helloworld文件但是javac时报错
刚开始编写第一个java文件时遇到的错误: javac HelloWorld.java HelloWorld.java:1: 错误: 写入HelloWorld时出错: HelloWorld.class ...
- Hibernate.编写xml文件无自动提示信息
Hibernate.编写xml文件无自动提示信息 注意: 配置 xxxx.hbm.xml 文件的自动提示.和配置 hibernate.cfg.xml 文件的提示,操作步骤是一样的.只是复制的文件内容. ...
随机推荐
- 201871030116-李小龙 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 软工个人阅读作业2 —— 构建之法与CI/CD
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#2 我在这个课程的目标是 阅读思考教材,调研软工工具 这个作业在哪个具体方面帮助我实 ...
- [Skill]从零掌握正则表达式
前言 无论你是出于什么原因需要掌握正则表达式(诸如爬虫.文本检索.后端服务开发或Linux脚本),如果之前从没接触过正则表达式(比如我)很容易在如山般的公式中迷失,以至于你在项目写的正则表达式很可能会 ...
- get_started_3dsctf_2016-Pwn
get_started_3dsctf_2016-Pwn 这个题确实有点坑,在本地能打,在远程就不能打了,于是我就换了另一种方法来做. 确这个题是没有动态链接库,且PIE是关的,所以程序的大部分地址已经 ...
- Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于实时同步状态?
一.需求,前段时间,墨天伦有个小伙伴咨询了这个问题,搞了测试环境测试下. Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于 ...
- Linux终端更改字体
1 概述 这里的终端是指通过F1-F6/F2-F7进入的纯命令终端. 修改字体可以通过setfont命令. 2 查看字体 可以通过查找目录consolefonts来确定本地机器上的字体位于哪里: fi ...
- 1058 A+B in Hogwarts
If you are a fan of Harry Potter, you would know the world of magic has its own currency system -- a ...
- 1082 Read Number in Chinese
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...
- 关于width的继承和获取
absolute元素(如果没有设置width值),其宽度自适应于内部元素, <!DOCTYPE html> <html lang="en"> <hea ...
- hdu4932 小贪心
题意: 给了一些处在x轴上的点,要求我们用长度相等的线段覆盖所有点,线段和线段之间不能重叠,问线段最长可以使多长. 思路: 一开始一直在想二分,哎!感觉这个题目很容易就往二分上去 ...