Ansible playbook-ansible剧本

发布于:2025-04-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

一.playbook介绍

便于功能的重复使用

本质上就是文本文件,一般都是以.yml结尾的文本文件。

1.遵循YAML语法

1.要求同级别代码要有相同缩进,建议4个空格。【同级别代码是同一逻辑的代码】

在计算机看来空格和Tob键是两个不同的字符。

2.一个键对应一个值,冒号后要有空格,

key:value

一个键对应一个值的时候,建议写在同一行上,在冒号的后面必须需要有一个空格,

当一个键对应多个值的时候,

如上图所示,这三个value就是同级别代码,这里的value前面的减号必须要跟冒号对其,value前面的减号跟value之间必须要有一个空格。【python中的列表】

3.当一个键对应多个值时,分行写,

key:

      - value1

      - value2

      - value3

2.playbook结构

-hosts: 主机或者主机组名

 user: root表示的是将来机器在执行操作的时候以什么身份去执行操作。

 tasks: 具体的操作

以上三个就是同级别代码,这三个单词必须对齐,并且冒号后面一定要有空格。

        - name: 任务名称

          模块名称: 参数1  参数2  参数3

      - name: 任务名称

          模块名称: 参数1  参数2  参数3

     - name: 任务名称

          模块名称: 参数1  参数2  参数3

一个剧本中同样的文件结构可以写多个,但是建议将针对不太机器的剧本文件单独写,方便管理。

3.创建用户openstack ,shell为/sbin/nologin

1)编写剧本

2)执行剧本

如上图所示,是剧本的执行过程,在真正执行剧本之前,ansible的默认行为是调用setup模块去调出被控机器的状态数据被叫做facts变量。

如上图所示,在剧本中添加上这个选项就是代表执行剧本的时候,不去执行搜集被控机器的状态数据,即取消剧本执行的时候默认去执行搜集被控机器的facts变量。

4.gather_facts参数

5.部署MySQL剧本

如上图所示,这就是部署MySQL的剧本文件,执行三个任务,下载MySQL,推送MySQL配置文件到被控制机器,启动MySQL服务。

二.变量

类型:

自定义变量

内置变量

    facts变量 

    内置变量

1.自定义变量

1)调用变量

{{ 变量名称 }}

2)在playbook中定义变量

如上图所示,这是设置了一个自定义变量,username,并且这个变量的值是user01

如上图所示,这是脚本的执行结果。

3)在外部文件中定义变量

如上图所示,这是单写一个文件来定义变量。

如上图所示,这是指定剧本文件到变量文件中去识别变量。

如上图所示,随后去执行脚本,并且查看脚本的执行结果。

为确保敏感数据安全,可对变量文件进行加密

如上图所示,可以用如上命令对重要的变量文件进行加密,

如上图所示,当执行剧本的时候就会报错。

如上图所示,当我们对变量文件进行加密之后,再执行剧本的时候需要加上--ask-vault-pass选项,这时再次执行剧本的时候,要求我们输入变量文件的密码。

解密文件

如上图所示,这是对加密的变量文件进行解密。

4)在主机清单文件中定义变量--为单个主机定义变量

如上图所示,当我们在主机清单中自定义变量的时候,这时候剧本中就不需要再去写关键字去调用变量了。

如上图所示,执行剧本成功。

5)在主机清单文件中定义变量--为主机组定义变量

如上图所示,这就是给主机组定义变量,

如上图所示,这是主机清单中给单个主机设定server_id,

给主机组设定变量为port

6.修改MySQL剧本

如上图所示,这是在MySQL的配置文件中,编辑server_id和port变量的引用。

如上图所示,如果想要在推送文件的时候,触发推送文件中变量的替换,就需要使用模块template模块,这个模块也是一个推送模块,具有在推送文件的同时实现变量替换的功能。这是copy模块所不具备的。

如上图所示,在修改配置文件之后,需要使得配置文件的修改生效。

2.内置变量

配置ssh协议的内置变量【免密ssh不是必须的。】

ansible_ssh_user

ansible_ssh_pass

ansisble_ssh_port

ansible软件是基于ssh协议工作的,为了方便ansible软件的工作,需要在每台机器之间配置免密ssh。但是免密ssh不是必要的,在某些公司中根本不允许配置免密ssh。

如上图所示,这是在ansible的主机清单中配置与192.168.140.14的ssh连接。

如上图所示,此时证明ansible连接192.168.140.14的ssh协议配置成功。

三.剧本中的条件判断

在写条件判断的时候常以facts变量为条件。

如上图所示,通过这个变量提取到的是一个列表,【python列表】在这个列表中存放着我们需要的IP地址。

如上图所示,这就是定义了一个python列表,通过这个变量名得到的是整个列表。

列表中的值从左到右,每一个值都有一个唯一的下标。下标固定从0开始。

变量名【2】

这就是取出列表中的第三个数据。

如上图所示,这也是python语言中的一种数据结构,这种数据结构叫做字典。

如上图所示,字典中的数据是没有下标的,如果想要取得字典中的值,需要变量名【值对应的键】

字典中储存的数据就是键值对的形式。

如上图所示,这就是取得我们需要的值的过程,从外到里一步一步得取。

如上图所示,ipv4的键对应的是字典。通过对应的键去取对应的值。

如上图所示,此时我们这个剧本中的变量的数值是从被控主机的facts变量中取得,所以不能再加上gather_facts=false.不然剧本就取不到被控主机的facts变量。

如上图所示,这是剧本中条件检测失败出现的结果。

要么是语法写错了,要么是我们取值的方法不对。

因为被控主机的ipv4字典是ansible_ens33字典的一个小字典。

如上图所示,这是修改后的剧本文件。

四.循环  loop

如上图所示,这就是一个循环,loop模块每一次循环都会给item赋值,第一次是user100

第二次是user101.第三次是user102

结合字典使用循环

如上图所示,这就是结合字典使用循环。

五.案例:部署nginx剧本

如上图所示,这是两个独立的操作在被控主机上执行,第一步是将当前目录切换到/tmp目录下,第二个操作是解压缩指定的tar包,但是被控主机并不会在tmp目录下,取解压缩指定的tar包,只会在/root目录下去解压缩tar包,但是tar包不存在于/root/目录下,所以此时建议将切换目录以及解压缩tar的操作写在一个-name里面。

如上图所示,就是部署nginx的一个剧本信息,其中的get_url模块在 Ansible 中,get_url 模块用于从远程 URL 下载文件并保存到目标主机的指定路径。它是 Ansible 提供的一个内置模块,常用于自动化下载文件、配置管理或部署任务。