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

本博文衔接上篇:Ansible自动化运维的安装及常用模块解释

一、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文件:

[[email protected] ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              #查看hosts中的分组信息
[web1]
192.168.1.2
[web2]
192.168.1.3
[[email protected] ~]# 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命令用法如下:

[[email protected] ~]# 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文件的示例如下:

[[email protected] ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    #语法检测

playbook: /etc/ansible/a.yml       #表示没有报错
[[email protected] ~]# 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
#返回结果表示没有错误,全部可以执行成功。
[[email protected] ~]# ansible-playbook --list-hosts /etc/ansible/a.yml    #列出a.yml文件中的主机
[[email protected] ~]# ansible-playbook --list-tasks /etc/ansible/a.yml       #列出任务
[[email protected] ~]# ansible-playbook --list-tags /etc/ansible/a.yml            #列出标签
[[email protected] ~]# ansible-playbook /etc/ansible/a.yml                #执行任务
[[email protected] ~]# ssh 192.168.1.2 tail -1 /etc/passwd              #确认执行结果
user1:x:1001:1001::/home/user1:/bin/bash
[[email protected] ~]# 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语法检测工具,可以更直观的检查出语法中的错误,感兴趣可以看一下

2、触发器

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

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

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

[[email protected] ~]# ssh 192.168.1.2 netstat -anpt | grep 80                  #查询1.2主机监听的端口
tcp6       0      0 :::80         :::*          LISTEN      94858/httpd
#可以看到是监听80端口,现在通过脚本改为8080端口,并使其生效。
[[email protected] ~]# 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服务。
...
#编写完成后,保存退出即可。
[[email protected] ~]# ansible-playbook -C /etc/ansible/httpd.yml           #进行预测试。
[[email protected] ~]# ansible-playbook  /etc/ansible/httpd.yml               #执行脚本。
[[email protected] ~]# 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服务器上实施:

[[email protected] /]# 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"
[[email protected] /]# cd /etc/ansible/roles/mariadb/tasks/       #切换至指定目录
[[email protected] tasks]# ls
[[email protected] 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
...
#编写完毕,保存退出即可。
[[email protected] tasks]# cd ../handlers/            #切换至触发器目录
[[email protected] handlers]# vim main.yml              #编写main.yml文件,写入以下内容
---
- name: restart mariadb
  service: name=mariadb state=restarted
...
#编写完毕,保存退出即可。
[[email protected] handlers]# cd ../files     #进入mariadb角色文件夹的files
[[email protected] files]# pwd
/etc/ansible/roles/mariadb/files
[[email protected] files]# ls            #准备好配置好的mysql数据库配置文件,需要分发到远程主机的
my.cnf
[[email protected] files]# cd /etc/ansible/
[[email protected] ansible]# vim mariadb.yml         #编写.yml文件
---
- hosts: web
  remote_user: root
  roles:
  - mariadb
...
##编写完毕,保存退出即可。
[[email protected] ansible]# ansible-playbook -C mariadb.yml          #进行预检测
                                  ........................          #省略部分内容
PLAY RECAP ***************************************************************************
192.168.1.2                : ok=3    changed=1    unreachable=0    failed=0
#返回结果表示没问题
[[email protected] ansible]# ansible-playbook mariadb.yml           #执行安装

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

原文地址:https://blog.51cto.com/14154700/2422908

时间: 2024-10-21 12:21:30

ansible自动运维工具之ansible-playbook详解的相关文章

Linux自动运维工具Ansible的使用

Linux自动运维工具Ansible的使用 我们熟悉这个工具后, 可以很轻松的安装k8s. 一.介绍 ansible - run a task on a target host(s) Ansible是一个用Python开发的运维工具, 可以在本地让远程主机执行命令, 项目地址: Github源码, 中文文档 二.安装 简单上阵, 我们的主机都是ubuntu, 请使用root用户: sudo su apt install ansible ansible --version 配置文件: ls /et

ansible轻量级运维工具使用

Linux轻量级自动运维工具- Ansible 创始人 Michael DeHanan 2012-03-09 同类自动化工具: Ansible Saltstack Puppet Chef Fabric Ansible 特点 agentless (去中心化) 只要保存管理机的认证信息,那么任何一台机器都可以变成管理机 Stupied Simple SSH by default YAML no code 定制剧本 基于python 实现 模块化:调用特定模块,完成特定任务,支持自定义模块 冥等性 -

Ansible自动化运维工具-上

[Ansible特点] 1)Ansible与saltstack均是基于Python语言开发的 2)安装使用简单,基于不同插件和模块实现各种软件,平台,版本的管理以及支持虚拟容器多层级的部署 3)不需要安装客户端,ansible基于SSH远程管理,不需要为配置工作添加额外的支持: PS:很多认为Ansible工具执行效率慢,其原因是SSH服务慢,我们可以选择优化SSH连接速度以及Ansible加速模块 [Ansible自动化管理工具特点] #轻量级,更新时,需要在操作机上进行一次更新即可 #采用S

运维自动化之Cobbler系统安装详解

原文链接 参考文档 参考文档SA们现在都知道运维自动化的重要性,尤其是对于在服务器数量按几百台.几千台增加的公司而言,单单是装系统,如果不通过自动化来完成,根本是不可想象的. 运维自动化安装方面,早期一般使用人工配置pxe+dhcp+tftp配合kickstart,现在开源工具就多了,如cobbler,OpenQRM和Spacewalk.本文重点介绍Cobbler. Cobbler介绍 Cobbler是一个快速网络安装linux的服务,而且在经过调整也可以支持网络安装windows.该工具使用p

自动化运维工具之ansible

ansible ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架. 主要包括: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inventory:指定

自动化运维工具之ansible的简单应用

ansible: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,例如shell,copy,ping等,ansible只是提供一种框架.ansible的主要特性: 模块化:调用特定的模块,完成特定任务 基于Python语言实现,由Pa

Ansible自动化运维工具部署及使用

一.Ansible介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inven

ansible自动化运维工具使用详解

一.ansible简介 1.ansible ansible是新出现的自动化运维工具,基于Python研发.糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能.仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端.ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件 参考站点:http://www.ansible.com.cn 2.ansible特性 模块化设计,调用特定的模块来完成特定任务,本身是核

自动化运维工具之ansible基础入门

自动化运维工具常用的有 ansible  saltstack  puppet等 ,前两者都是基于python开发,puppet基于ruby开发,今天我们简单介绍下ansible基础 一.基础知识: 1. 简介 ansible基于python开发,集合了众多运维工具的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.ansible是基于模块工作的 (1) host inventory: 指定操作的主机,是一个配置文件里面定义监控的主机        (2) 各种模块核心模块.comman