千家信息网

ansible自动运维工具之ansible-playbook详解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,一、Playbook简介playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。
千家信息网最后更新 2026年11月03日ansible自动运维工具之ansible-playbook详解

一、Playbook简介

playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入就显得效率非常低下了。更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml。

二、playbook的核心元素

playbook的核心元素包含:

  • hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息。
  • remote_user:远程主机上,运行此任务的默认身份为root。
  • tasks:任务,即定义的具体任务,由模块定义的操作列表。
  • handlers:触发器,类似tasks,只是在特定的条件下才会触发的任务。某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers进行触发执行。
  • roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合。

三、playbook格式

playbook需要注意的事项:

  • playbook由YMAL语言编写。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl等。MAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
  • 通过"-"来代表项,通过冒号 " :"来分隔键和值,整个文件以"---"开始并以"..."结束。
  • 所有的"-"和" : "后面均由空格,而且要严格注意缩进和对齐,否则语法可能能会报错。
  • 每次在执行playbook文件之前,一定要使用"-C"选项来进行预测试。该选项会执行一遍playbook文件,但不会对目标主机进行任何更改,若语法有错或目标主机缺少某个文件,都将报错提示。

1、执行简单的playbook文件:

[root@ansible ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              #查看hosts中的分组信息[web1]192.168.1.2[web2]192.168.1.3[root@ansible ~]# vim /etc/ansible/a.yml        #创建a.yml文件,写入以下内容---- hosts: web1                   #针对web1组中的操作  remote_user: root                    #远端执行用户身份为root  tasks:                #任务列表        - name: adduser                                          #任务名称          user: name=user1 state=present          #执行user模块,创建用户          tags:                 #创建tag标签          - aaa                   #tag标签为aaa        - name: addgroup             #任务名称          group: name=root system=yes           #执行group模块,创建组          tags:                  #创建tag标签          - bbb                   #tag标签为bbb- hosts: web2                  #针对web2组中的操作  remote_user: root              #远端执行用户身份为root  tasks:                      #任务列表        - name: copy file to web                #任务名称          copy: src=/etc/passwd dest=/home            #执行copy模块,复制文件          tags:                        #创建tag标签          - ccc                      #tag标签为ccc...

我这里编写的playbook文件如下:

playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行,ansible-playbook命令用法如下:

[root@ansible ~]# ansible-playbook  [ option ]/etc/ansible/a.yml
其中option中的功能包括:* --syntax-check:检测yaml文件的语法。* -C:预测试,不会改变目标主机的任何设置。* --list-tasks:列出yaml文件的任务列表。* --list-hosts:列出yaml文件影响的主机列表。* --list-tags:列出yaml文件中的标签。* -t TAGS:表示只执行指定标签的任务。* --skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。* --start-at-task=START_AT:从指定任务开始往下运行。

执行a.yml文件的示例如下:

[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    #语法检测playbook: /etc/ansible/a.yml       #表示没有报错[root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml         #对a.yml进行预测试                                  .................#省略部分内容192.168.1.2       : ok=3    changed=1    unreachable=0    failed=0   192.168.1.3       : ok=2    changed=1    unreachable=0    failed=0   #返回结果表示没有错误,全部可以执行成功。[root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml    #列出a.yml文件中的主机[root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml       #列出任务[root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml            #列出标签[root@ansible ~]# ansible-playbook /etc/ansible/a.yml                #执行任务[root@ansible ~]# ssh 192.168.1.2 tail -1 /etc/passwd              #确认执行结果user1:x:1001:1001::/home/user1:/bin/bash[root@ansible ~]# ssh 192.168.1.3 ls -ld /home/passwd-rw-r--r--. 1 root root 2342 7月  23 16:06 /home/passwd#一般情况先执行"-C"命令进行预测试,没有问题后再执行.yml文件。

有一个在线的ansible-playbook语法检测工具,可以更直观的检查出语法中的错误,感兴趣可以看一下:http://www.yamllint.com/
2、触发器

需要触发才能执行的任务,当之前在tasks中的任务执行成功后,若希望在此基础上触发其他任务,这就需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以便配置文件生效。handlers触发器具有如下特点:

  • handlers是ansible提供的条件机制之一。handlers和task很类似,但是它只在被task通知的时候才会触发执行。
  • handlers只会在所有任务执行完成后执行。而且即使被通知了很多次,它也只会执行一次。

handlers触发器的使用示例如下:

[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 80                  #查询1.2主机监听的端口tcp6       0      0 :::80         :::*          LISTEN      94858/httpd #可以看到是监听80端口,现在通过脚本改为8080端口,并使其生效。[root@ansible ~]# vim /etc/ansible/httpd.yml          #编辑httpd.yml文件,写入以下内容---- hosts: web1  remote_user: root  tasks:        - name: change port          command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf          notify:                                        #配置触发条件                - restart httpd server     #完成该任务后调用名为"restart httpd server"的触发器  handlers:                                          #配置触发器        - name: restart httpd server  #指定触发器名字,要和上面"notify"指定的触发器名字一样          service: name=httpd state=restarted           #触发任务为重启httpd服务。...#编写完成后,保存退出即可。[root@ansible ~]# ansible-playbook -C /etc/ansible/httpd.yml           #进行预测试。[root@ansible ~]# ansible-playbook  /etc/ansible/httpd.yml               #执行脚本。[root@ansible ~]# ssh 192.168.1.2 netstat -anpt | grep 8080        #远端主机已经运行8080端口tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

3、角色

将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在/etc/ansible/roles/目录下,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,结构如下:

/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

  • mariadb:mysql角色。
  • Apache:httpd角色。
  • Nginx:Nginx角色。
  • 每个角色的定义,以特定的层级目录结构进行组织。以mariadb(mysql角色)为例:
  • files:存放由copy或script等模块调用的文件。
  • templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件模板。
  • tasks:任务存放的目录。
  • handlers:存放相关触发执行的目录。
  • vars:变量存放的目录。
  • meta:用于存放此角色元数据。
  • default:默认变量存放的目录,文件中定义了此角色使用的默认变量。

上面的目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yml文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来。
.
有了角色后,可以直接在yaml文件(playbook配置文件)中调用角色,示例如下:

---- hosts: web1  remote_user: root  roles:              - mysql        #调用角色名  - httpd             #调用角色名...

可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PALYBOOK文件执行即可。此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql和httpd目录下的所有代码。
.
下面来个安装及配置mariadb数据库的实例:

需求分析:

  • 要求被管理主机上自动安装mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。
  • 被管理主机配置yum仓库,自行配置,若被管理端可以连接互联网,那么直接将yum仓库指向互联网即可。

开始在ansible服务器上实施:

[root@ansible /]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}mkdir: 已创建目录 "/etc/ansible/roles/mariadb"mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"[root@ansible /]# cd /etc/ansible/roles/mariadb/tasks/       #切换至指定目录[root@ansible tasks]# ls[root@ansible tasks]# vim main.yml                     #编写main.yml文件---- name: install mariadb  yum: name=mariadb-server state=present- name: move config file  shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"- name: provide a new config file  copy: src=my.cnf dest=/etc/my.cnf- name: reload mariadb  shell: systemctl restart mariadb- name: create database testdb  shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@'192.168.1.%' identified by 'test123';flush privileges;"  notify:  - restart mariadb...#编写完毕,保存退出即可。[root@ansible tasks]# cd ../handlers/            #切换至触发器目录[root@ansible handlers]# vim main.yml              #编写main.yml文件,写入以下内容---- name: restart mariadb  service: name=mariadb state=restarted...#编写完毕,保存退出即可。[root@ansible handlers]# cd ../files     #进入mariadb角色文件夹的files[root@ansible files]# pwd/etc/ansible/roles/mariadb/files[root@ansible files]# ls            #准备好配置好的mysql数据库配置文件,需要分发到远程主机的my.cnf[root@ansible files]# cd /etc/ansible/[root@ansible ansible]# vim mariadb.yml         #编写.yml文件---- hosts: web  remote_user: root  roles:  - mariadb...##编写完毕,保存退出即可。[root@ansible ansible]# ansible-playbook -C mariadb.yml          #进行预检测                                  ........................          #省略部分内容PLAY RECAP ***************************************************************************192.168.1.2                : ok=3    changed=1    unreachable=0    failed=0 #返回结果表示没问题[root@ansible ansible]# ansible-playbook mariadb.yml           #执行安装

待安装完成后,在远端主机上查看是否已经创建了testdb数据库,并测试以test用户登录,自行测试吧。

文件 任务 目录 角色 主机 配置 触发器 标签 模块 语法 测试 目标 内容 命令 数据 用户 结构 运行 数据库 格式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 广州紫鲸互联网科技有限公司 科技企业和互联网企业 互联网中国科技 猪兼强互联网科技 万易互联网科技有限公司 科技互联网公司logo 互联网金融和金融科技 互联网和高科技公司 现代科技和互联网有关系吗 科技互联网的估值 玉溪互联网科技怎么选 注册互联网科技公司经营范围大全 深圳市罗太互联网科技有限公司 阿里互联网科技企业 江苏苏星互联网科技有限公司 电子商务与互联网科技的关系 卡尔迅互联网科技有限公司 扫呗互联网科技有限公司 东风日产互联网科技公司叫什么 小米移动互联网科技园 百单网互联网科技有限公司怎么样 互联网科技战争 互联网 科技 壕鑫互联网络科技 佰商互联网科技有限公司 青岛科技大学互联网大赛研究生 速维有品互联网信息科技(苏州)有限公司 互联网媒体平台算高科技产业 互联网科技接地气
0