简介:
playbooks作为ansible独有的一个术语,他是一种ansible配置部署的编排语言框架,它本身简单易读的语法结构以及丰富的内建模块,非常易于我们编写远程部署策略。playbooks下基础的任务文件格式为yum格式,我们可以将playbooks作为一个总得乐谱,每个yum文件可以成为一个playbooks乐章,在这个playbooks下我们可以编写一个或者多个task作为我们这个乐章的音符,我们通过使用ansible的相关命令去play演奏这个乐谱,就可以将我们预先写好的任务按照特定的编排部署到远程服务器当中,也就是相当于演奏给我们的听众,接下来演示一个基础playbooks的框架格式编写规范。通过引入一个test playbooks 作为范例逐一讲解他的框架与格式,下面是Test playbooks总的文件结构
inventory/ (Server详细清单目录)
testenv (具体清单与变量声明文件)
roles/ (roles任务列表)
testbox/ (testbox详细任务)
tasks/
main.yml (testbox主任务文件)
deploy.yml (Playbook任务入口文件)

它由inventory、roles、deploy.yml构成它的文件结构,首先这个inventory目录下边可以存放一个或者多个server详细清单目录,用来保存我们目标部署主机的相关域名或者ip地址,以及该主机的变量参数,通常我们可以利用具体的部署环境,例如develop开发环境,uit单元测试环境,或者production最终的产品环境,用来给我们的server清单命名,对应保存在我们清单下的主机地址,具体部署到哪个环境当中,这里我们的inventory下面保存着一个task env文件,意在将保存在我们tasks env文件下的主机部署到我们的tasks env环境当中,接下来的roles目录,保存我们的需要部署的详细任务列表,他的下面可以存放一个或者多个role,通常会命名为具体部署的app或者项目名称,这里我们命名为testbox作为我们的项目名称,下面还有一级交tasks目录,这个用来保存我们最终的testbox乐章文件main.yml,最后这个deploy.yml作为一个关键性文件,用作playbooks的任务入口,它将调度我们roles下需要去部署的项目,以及该项目下的所有任务。最终将该任务部署在我们的envtory下定义的目标主机中。
下面讲解我们具体Playbooks下所有文件的格式,这里首相讲testenv文件,他有上下两部分构成,上面用[]括起来的[testservers] 作为一个server组列表标签,可以存一个或者多个目标主机、域名或者ip地址,下面这个test.example.com对应我们需要去部署的目标主机的域名。
下面这个[testservers:vars]作为一个server组列表参数标签,用来定义该组下的远程主机用到的所有的key/value参数键值对,作为我们server组的变量声明,这里可以看到,我们其实是给[testservers] 这个组列表server下面的test.example.com 这台目标主机定义了如下参数。最后这两部分组合到一起就构成我们[testservers]下的清单。
详细目录testenv
[testservers] (Server组列表)
test.example.com (目标部署服务器主机名)
[testservers:vars] (Server组列表参数)
server_name=test.example.com (目标主机Key/value参数)
user=root
output=/root/test.txt

接下来介绍main.yml主任务文件(乐章),这里面会保存一个或多个task文件(作为我们的音符)。
task一般由两部分组成,第一部分是我们的任务名称,用来定义我们的task名称,方便我们编写好task后知道他是干什么用的。第二部分是我们具体要执行的任务,通常会利用调用ansible内建模块去编排我们的任务逻辑,从这个例子我们可以看到,我们的第一行用来定义我们的task名称,打印我们的服务器名和登录名到我们的远程testbox主机当中,我们第二行使用ansible的shell模块去执行一项shell语句,该语句远程输出一段话,并重定向保存到我们的目标目录文件下,{{}}是引入ansible的变量调用,我们其实是将上面inventory/testenv文件里边给我们目标主机定义的参数引入到我们当前的文件当中,这里user的值为root,server_name的值为test.example.com,output的值为/root/test.txt,最终提现到我们这个shell的完整语句就为:
echo 'Currently root is logining test.example.com' > /root/test.txt
主任务文件main.yml
-name:Print server name and user to remote testbox (任务名称)
shell:"echo 'Currently {{user}} is logining {{server_name}}'>{{output}}" (使用shell模块执行命令)

最后我们来看任务入口文件deploy.yml,她作为我们的核心文件用来与我么的ansible playbooks命令直接对话,他将我们playbooks下的所有编排内容展示给我们的ansible命令进行最终的play演奏,最后部署到对应的目标主机当中。
首先这里的hosts:"testservers"对应我们的inventory/testenv文件下的server子标签,它这里用来调用这个标签下定义的目标主机,也就是我们刚才定义的test.example.com这台主机,意在告诉ansible命令要去部署的目标主机为test.example.com这台主机。
接下来的gather_facts:true 用来获取目标主机下的一些基本信息。
remote_user:root 告诉ansible我们在目标主机下使用的是root账户权限,进行所有的文件系统操作。
roles: - testbox 告诉我们进入roles目录下的testbox任务目录去进行接下来的任务执行。

任务入口文件deploy.yml

  • hosts:"testservers" (server列表)
    gather_facts:true (获取server基本信息)
    remote_user:root (目标服务器系统用户指定)
    roles: (进入roles/testbox任务目录)
  • testbox

这里我们就用Test Playbooks规范给大家成功讲解完毕 ansible playbooks的编写规范。
SSH免密码密钥认证
不过我们在使用ansible执行这个playbooks之前,因为ansible是用ssh作为我们的通信协议,为了保证正常的通信连接,我们需要去配置我们的ansible主机与目标主机的密钥认证,保证我们ansible无需密码即可访问我们的目标主机,并进行相应的部署操作,这里我们首先需要配置SSH免密码密钥认证。
我们可以使用这条命令:# ssh-keygen -t rsa,去在我们ansible服务器端创建ssh rsa密钥格式的本地公钥与私钥的密钥对。
接下来我们可以使用
Ansible服务器端创建SSH本地密钥