Ansible之Playbook简单应用

一、Playbook简介

playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,可以让远程主机达到预期状态,也可以说,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

ansible使用playbook来管理自动化task,playbook是yaml格式的文件,其基本内容可以认为是多条ansible的ad-hoc的语句组成。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,是用yaml(Yet Another Markup Language)语言编写的文件,有着特定的组织格式。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便,YAML语法能够简单的表示散列表,字典等数据结构。

playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。

二、Playbook核心元素(背会)

  • Hosts 执行的远程主机列表

  • Tasks 任务集

  • Varniables 内置变量或自定义变量在playbook中调用

  • Templates 模板,即使用模板语法的文件,后缀.j2,比如配置文件等

  • Handlers 和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

  • tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码

三、Playbook语法

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 一般情况下,一个playbook需要使用"---"开始。
  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点号(...)用来表示play的结尾,也可省略。

  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能

  • 使用#号注释代码

  • 缩进必须统一,不能空格和tab混用

  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的

  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感

  • k/v的值可同行写也可以换行写。同行使用: 分隔

  • v可以是个字符串,也可以是一个列表[]

四、Playbook的运行方式

通过ansible-playbook命令运行

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

常用命令:

ansible-playbook filename.yml [options]

ssh 连接的用户名

-u REMOTE_USER, --user=REMOTE_USER

ssh登录认证密码

-k, --ask-pass

sudo 到root用户,相当于Linux系统下的sudo命令

-s, --sudo

sudo 到对应的用户

-U SUDO_USER, --sudo-user=SUDO_USER

用户的密码(---sudo时使用)

-K, --ask-sudo-pass

ssh 连接超时,默认 10 秒

-T TIMEOUT, --timeout=TIMEOUT

指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改

-C, --check

设置额外的变量如: key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e

-e EXTRA_VARS, --extra-vars=EXTRA_VARS

进程并发处理,默认 5

-f FORKS, --forks=FORKS

指定 hosts 文件路径,默认 default=/etc/ansible/hosts

-i INVENTORY, --inventory-file=INVENTORY

指定一个 pattern,对- hosts:匹配到的主机再过滤一次

-l SUBSET, --limit=SUBSET

只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook

--list-hosts

列出该 playbook 中会被执行的 task

--list-tasks

私钥路径

--private-key=PRIVATE_KEY_FILE

同一时间只执行一个 task,每个 task 执行前都会提示确认一遍

--step

只检测 playbook 文件语法是否有问题,不会执行该 playbook

--syntax-check

当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔

-t TAGS, --tags=TAGS

当 play 和 task 的 tag 不匹配该参数指定的值时,才执行

--skip-tags=SKIP_TAGS

输出更详细的执行过程信息,-vvv可得到所有执行过程信息。

-v, --verbose

五、Playbooks中tasks语法使用

1、file

操作文件,比如创建文件或目录、删除文件或目录、修改文件权限等

常用参数:

  • path: 指定要操作的文件或目录

  • state: 参数非常灵活,可以包含的值及含义如下

    • directory - 与path结合说明我们要操作的是一个目录
    • touch - 与path结合说明我们要操作的是一个文件

    • link - 创建软连接

    • hard - 创建硬链接

    • absent - 删除目标

  • src: 当state设置为link或hard创建链接时,用于说明链接哪个文件,指定链接源

  • force: 值为yes表示强制创建

  • owner: 指定被操作文件的属主

  • group: 指定被操作文件的属组

  • mode: 指定被操作文件的权限

示例:

  • name: 创建一个testfile文件
    file: path=/tmp/testfile state=touch
  • name: 创建一个目录,并指定目录权限
    file: path=/tmp/data state=directory mode=0755
  • name: 删除一个目录
    file: path=/tmp/data state=absent
  • name: recurse默认为no,指定为yes代表以递归方式指定文件权限
    file: dest=/user/bin mode=0755 recurse=yes
2、lineinfile(不建议)

修改文件某一行文本

常用参数:

  • path: 操作的文件路径

  • regexp: 正则表达式,要替换的内容

  • line: 指定修改后的文本内容

  • state: 当设置为absent代表删除匹配的行

  • backrefs: 默认为no,当未匹配到时line对应的内容会被插入到文本的末尾,为yes表示不插入

  • insertafter: 借助insertafter参数可以将文本插入到"指定的行"之后

  • insertbefore: 借助insertbefore参数可以将文本插入到"指定的行"之前

  • backup: 是否进行备份

  • create: 操作的文件不存在时是否创建

示例:

  • name: 替换文件中包含line123的行为testline

lineinfile: path=/tmp/test regexp="^line" line="testline"

3、replace

根据正则表达式替换文件内容

常用参数:

  • path: 操作文件的路径

  • regexp: 正则表达式

  • replace: 指定最终要替换的字符串

  • backup: 是否在修改文件之前对文件进行备份,yes是进行备份

简单示例:

  • name: 将/tmp/test文件中的ABC替换成abc

replace: path=/tmp/test regexp="ABC" replace=abc

4、shell

执行脚本命令

示例:

  • shell: mkdir /tmp/mytest

  • shell: echo "export JAVA_HOME=/opt/jdk" >> /etc/profile

5、template/copy

模板作用类似于copy,可将文件分发到不同节点上,可以在模板文件中引入变量

常用参数:

  • src: 源文件路径

  • dest: 目标文件路径

  • group: 目标文件属组

  • mode: 目标文件权限

  • backup: 如果目标文件存在,则先备份目标文件

  • force: 是否强制覆盖,默认为yes

  • validate: 在复制之前通过命令验证目标文件,如果验证通过则复制

示例:

  • name:
    template: src=/mytemplates/tt.j2 dest=/etc/file.conf
  • name:
    template: src=/mytemplates/tt.j2 dest=/etc/file.conf group=wheel mode=0644
  • name:
    template: src=/mytemplates/suzuka.j2 dest=/etc/suzuka validate='visudo -cf %s'
6、fetch

功能与copy类似,但是是用于从远程主机中拷贝文件到管理主机,不能拷贝目录

常用参数:

  • src: 从远程主机上获取的文件路径

  • dest: 保存文件的目录

  • flat: 是否校准源文件与获取文件是否一致,默认false

示例:

  • fetch: src=/tmp/test dest=/tmp/
7、unarchive

解压缩,将压缩文件解压分发到不同节点上,对zip压缩不友好,尽量使用tar归档压缩

常用参数:

  • src: 源文件路径

  • dest: 目标文件路径

  • mode: 目标文件权限

示例:

  • name:

unarchive: src=/myfiltes/jdk.tar.gz dest=/opt

8、wait_for

等待某些操作完成以后再进行后续操作

常用参数:

  • connect_timeout: 在下一个任务执行之前等待连接的超时时间

  • delay: 指在等待过程中轮询的时间间隔

  • host: 等待的主机地址,默认是127.0.0.1

  • port: 等待的主机端口

  • path: 文件路径,只有当这个文件存在时才开始执行下一个任务

  • state: 等待的状态,值可以为started/stoped/absent/present

  • timeout: 等待的超时时间,默认300秒

示例:

  • name: 每隔10s检查一次,等待8080端口正常监听,才开始下一个任务,直到超时

wait_for: port=8080 state=started delay=10

  • name: 等待文件创建

wait_for: path=/tmp/tt

9、when

条件判断,满足后再执行任务

示例:

  • name: 判断变量tt是否定义

shell: echo "I've got {{ tt }}"

when: tt is defined

10、pause

暂停一定时间

常用参数:

  • minutes: 暂停多少分钟

  • seconds: 暂停多少秒

  • prompt: 打印一串信息提示用户操作

示例:

name: 等待用户30s用于输入

pause: seconds=30 prompt="ENTER to continue CTRL-C a to quit"

11、register

用于注册一个变量,保存命令的结果,常与when结合使用

示例:

  • name: 执行pwd

shell: /bin/pwd

register: pwd_result

  • name: 当路径中包含"home"显示路径

debug:

msg: "{{ pwd_result }}"

when: pwd_result.stdout.find('home') != -1

12、run_once

指定该task只能在某一台机器上执行一次,可以和delegate_to结合使用,如果没有delegate_to,那么这个task会在第一台机器上执行

简单示例:

  • name: 在web.example.org机器上刷新环境变量

shell: source /etc/profile

run_once: true

13、debug

用于在调试中输出信息

简单示例:

  • name: 显示调试信息

debug:

msg: "{{ pwd_result }}"

14、delegate_to

任务委派功能,指定在某一台机器上执行一个操作

15、local_action

本地操作功能,在运行ansible命令机器上执行一个操作

16、ignore_errors

忽略错误的命令,通常情况下当出现执行失败时ansible会停止运行,有时候你会想要继续执行下去就需要添加这个

简单示例:

  • name: 删除临时目录

shell: rm /tmp/data

ignore_errors: yes

17、user

用户的管理

18、group

用户组的管理

常用参数:

  • name: 指定组名称

  • gid: 指定GID

  • state: 动作参数

present: 增加

absent: 删除

19、yum

软件包管理

常用参数:

name: 指定需要管理的软件包名

state: 参数非常灵活,可以包含的值及含义如下

present: 确保软件包已经安装了

installed: 安装

latest: 安装最新的软件包

removed/absent: 删除对应的软件包

disable_gpg_check: 用于禁用对rpm包公钥验证,默认值no表示不禁用验证,yes表示禁用验证

示例:

  • name: 安装httpd服务

yum: name=httpd state=latest

  • name: 删除旧版gcc

yum: name = {{ item }} state=removed

with_items: ###老版本的循环语句

  • gcc

  • httpd

  • php

  • hosts: all

tasks:

  • name: 安装Apache

yum:

name: httpd

state: present

20、cron

定时任务,功能相当于crontab

常用参数:

name: 任务名称

minute: 分, hour: 时,day: 天,month: 月,weekday: 周

job: 指定要执行的命令或者脚本

state: 当设置为absent代表删除任务

示例:

  • name: 新增一个定时查看路径任务

cron: name=check minute=5 job='pwd'

相关推荐
SKYDROID云卓小助手3 小时前
无人设备遥控器之差分信号抗干扰技术
网络·stm32·单片机·嵌入式硬件·算法
YJlio4 小时前
ListDLLs & Handle 学习笔记(8.11):谁注入了 DLL?谁占着文件不放?一篇教你全搞定
网络·笔记·学习
风车带走过往4 小时前
Windows10 使用 dynv6 + ddns-go 实现 IPv6 固定域名远程访问指南
网络
爱奥尼欧5 小时前
【Linux笔记】网络部分——NAT-代理-网络穿透
linux·网络·笔记
njxiejing5 小时前
基于Packet Tracer的路由器的基本配置(地址、密码,远程登录)
网络·智能路由器
阿巴~阿巴~6 小时前
UDP服务端绑定INADDR_ANY后,客户端该用什么IP访问?
服务器·网络·udp协议·网络测试·udp套接字编程·inaddr_any
MARIN_shen6 小时前
PCB之电源完整性之电源网络的PDN仿真CST---08
网络·单片机·硬件工程·pcb工艺
TravisBytes8 小时前
一次 Qt 网络程序诡异崩溃排查:从 Breakpad 堆栈到 lambda 捕获悬空引用
网络·qt·php