Ansible 之 playbook使用

1  概述



Playbook组织格式是YAML格式,编排的是任务(task),用来记录重复执行的命令

YAML:YAML(/?j?m?l/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy d?t Net与Oren Ben-Kiki也是这语言的共同设计者。目前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。

YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。

基本数据结构:

标量、数组、关联数组

表量:直接值

数组:用花括号组成的键值对



2  playbook的基础组件



1)Hosts:运行指定任务的目标主机;

2)remoute_user: 在远程主机上执行任务的用户;

sudo_user:

3)tasks:任务列表

模块,模块参数;

格式:

(1) action: module arguments

(2) module: arguments

注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;

(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;

(2) 任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

4)handlers:

任务,在特定条件下触发;

接收到其它任务的通知时被触发;

notify: HANDLER TASK NAME

5)variables:

(1) facts:可直接调用;

注意:可使用setup模块直接获取目标主机的facters;

例子

收集172.18.50.72内置变量,通过setup模块实现收集主机的变量

ansible 172.18.50.72 -m setup

(2) 用户自定义变量:

两种设定的方式

(a) ansible-playbook命令的命令行中的,-e可以重复使用

-e VARS, --extra-vars=VARS

(b) 在playbook中定义变量的方法:

vars:

- var1: value1

- var2: value2

变量引用:{{ variable }},变量两侧有空格

(3) 通过roles传递变量;

(4) Host Inventory

(a) 用户自定义变量

(i) 向不同的主机传递不同的变量;

IP/HOSTNAME  varaiable=value var2=value2

(ii) 向组中的主机传递相同的变量;

[groupname:vars]

variable=value

(b) invertory参数

用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量;

ansible_ssh_host

ansible_ssh_port

ansible_ssh_user

ansible_ssh_pass



3  运行playbook的方式



(1) 测试

ansible-playbook  --check

只检测可能会发生的改变,但不真正执行操作;

ansible-playbook  --list-hosts

例子

ansible-playbook --list-hosts installpkg.yml

列出运行任务的主机;

ansible-playbook  --syntax-check

检查语法,没有输出表示没有语法错误

ansible-playbook  --syntax-check installpkg.yml

(2) 运行

ansible-playbook  脚本

例子:

ansible-playbook  installpkg.yml


4  例子



例一:编写一个yaml文档,用来安装redis和ngnix服务,并启动相关服务

注意,语法里有横线用来引导,区分不同的功能的语句,如下面语句有多个hosts,因此在hosts前加横杆,tasks有多个,用横杆区分每个tasks,而且缩进是有要求的,同一层级,一般缩进一样。注意横杆和冒号后有空格。

vim installpkg.yaml
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
  - name: start redis service
    service: name=redis state=started

准备redis的配置模板

更改redis配置模板监听端口为0.0.0.0 和 端口为6380

vim  redis.conf
vim /root/redis.conf
bind 0.0.0.0
port 6380

查看playbook里的主机

ansible-playbook --list-hosts installpkg.yml

查看playbook里的tasks

ansible-playbook --list-tasks installpkg.yml

测试执行脚本,添加选项-C,并没有实际执行

ansible-playbook -C installpkg.yml

以上脚本,测试正常的话,就去掉-C选项,实际执行

ansible-playbook  installpkg.yml

例二:handler的使用

条件式触发:handler,满足条件的时候触发条件

handlers:处理器,配置文件被修改的时候才执行,条件定义在notify

以下命令,表示当配置文件被更改的时候,notify就会触发handler,实现重启的操作.注意格式的书写。

vim  /root/ansible/handler.yml
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: instconf
    notify: restart redis service
  - name: start redis service
    service: name=redis state=started
  handlers: 
  - name: restart redis service
    service: name=redis state=restarted

例三:tag的使用

更改websrvs的配置内容,设置tag为instnginx

vim  /root/ansible/installpkg.yml
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
    tags: instnginx
  - name: start nginx service
    service: name=nginx enabled=true state=started
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: instconf
    notify: restart redis service
  - name: start redis service
    service: name=redis state=started
  handlers: 
  - name: restart redis service
    service: name=redis state=restarted

查看任务,会显示对应的标签

ansible-playbook --list-tasks installpkg.yml

指定标签,可以重新跑指定的标签命令,如他部分的命令不执行,如这里指定tag为instnginx,则只安装nginx包,但是不启动服务,其他部分的命令不会执行

ansible-playbook -t instnginx installpkg.yml

同时跑多个标签,多个任务可以指定同一标签,比较灵活 。如以下配置中,把安装不同的服务包的tag都设置为instpkg,同时设置了 复制dbsrvs组的配置文件,设备复制文件的tag为instconf,同时执行多个tag间用逗号隔开

vim  /root/ansible/installpkg.yml
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
    tags: instpkg
  - name: start nginx service
    service: name=nginx enabled=true state=started
- hosts: dbsrvs
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
    tags: instpkg
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: instconf
    notify: restart redis service
  - name: start redis service
    service: name=redis state=started
  handlers: 
  - name: restart redis service
    service: name=redis state=restarted

执行如下

ansible-playbook -t instpkg,instconf installpkg.yaml

结果是websrvs组只安装nginx,但是没有启动nginx服务,同时dbsrvs安装了redis包而且复制了配置文件到对应的主机,而且在install conf file任务中配置了notify任务,所以dbsrvs组的redis服务会被启动

例四:变量的使用

通过变量pkgname安装相关的包

vim installvar.yml 
- hosts: websrvs
  remote_user: root
  vars:
  - pkgname: tree
  tasks:
  - name: install package
    yum: name={{ pkgname }} state=latest

运行脚本,不指定变量默认是安装tree

ansible-playbook  installvar.yml

指定变量,playbook命令行里定义的变量优先级比脚本里高,  这里会安装memcached,而不是脚本里的tree

ansible-playbook -e "pkgname=memcached"  installvar.yaml

直接在host里定义变量,但是这个变量级别很低,比脚本里的变量还低

vim /etc/ansible/hosts 
[websrvs]
172.18.50.72 pkgname=redis
172.18.50.75 pkgname=memcached
vim /root/ansible/installvar.yml 
- hosts: websrvs
  remote_user: root
  vars:
  - pkgname: tree
  tasks:
  - name: install package
    yum: name={{ pkgname }} state=latest

执行命令

ansible-playbook  installvar.yaml

则websrvs安装的服务包是tree,而不是/etc/ansible/hosts里赋值的变量

去掉脚本里的变量

vim /root/ansible/installvar.yaml 
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install package
    yum: name={{ pkgname }} state=latest

重新执行

ansible-playbook  installvar.yml

则72主机安装服务包redis,75主机安装memcached

例五:在配置文件里传递参数

vim /etc/ansible/hosts
[websrvs]
172.18.50.72 pkgname=redis ansible_ssh_user=root ansible_ssh_pass=Pass123456
172.18.50.75 pkgname=memcached


Ansible 之 playbook使用

时间: 2024-08-11 08:16:29

Ansible 之 playbook使用的相关文章

ansible的playbook配置及template模板的使用

前言: 学习下ansible的playbooks的状态配置管理,说来puppet saltstack都有类似的叫法,只是ansible的叫法更犀利,我当时一看playbook还以为是花花公子的playboy.要使用ansible就要深入学习playbook配置及模板. 注:到底是playbook还是playbooks.... 先把官网的简单几个语法给说明下. #这个是你选择的主机 - hosts: webservers #这个是变量   vars:     http_port: 80     m

ansible的playbook介绍和实战

1.playbook 介绍: 简单的说就是定义一个配置文件,文件中写入你需要安装的服务,配置文件,变量等信息,使他们可以按照事先定义好的机制完成一个任务. Playbook使用YAML语法结构,所以配置阅读起来都比较简单. 2.playbook 的组成结构: target section 定义将要执行playbook的远程主机组 variable section 定义playbook运行时需要使用的变量 task section 定义将要在远程主机上执行的任务列表 handler section

【Ansible之playbook剧本】 񪃬

目录 基本用法 传参使用 条件判断 when 标签 tags 模板 template 循环 with_item handlers 原文: http://blog.gqylpy.com/gqy/374 @(Ansible之playbook剧本) ymal: 列表:- 字典:key-value 文件后缀名:yml ansible-playbook 命令格式: -C:--check 干跑,不会执行 -f:FORKS 并发执行 --syntax-check:语法检查 --list-hosts:列出主机列

Ansible之playbook的使用总结

之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装部署一个httpd服务会需要多个模块(一个模块也可以称之为task)提供功能来完成.而playbook就是组织多个task的容器,它的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language).YAML语法能够简单的表示散列表,字典等数

ansible的playbook组件

playbook的核心元素: tasks: 任务 variables: 变量 templates: 模板 handlers: 处理器 roles: 角色 组织格式:YAML(被称为另外一种标记语言) 语法:(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对) 例如: name:tom age:21 gender:Male spourse: name:lily gender:female children: —  name:susan age: 2 gender:female —

ansible用playbook实现定期监控各机器磁盘空间任务

目标:用ansible定期监控各机器的磁盘空间状况 和进程运行状况 1)配置playbook脚本,实现对磁盘空间 和 特定进程运行状态的每日检查: 2)通过邮件插件,把检测结果发到ops邮箱: 一.playbook的配置实现 monitor_ansible.yaml 1 --- 2 - name: diskspace_mornitor 3 hosts: local 4 user: root 5 gather_facts: no 6 vars: 7 path: /home/devops 8 9 t

二、Ansible中playbook的变量

先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debug模块,debug模块将其打印输出 verbosity:debug的任务级别 1:在playbook中直接使用 --- - hosts: db vars: vvv: china tasks: - name: test var debug: msg="The variable 'vvv' is {{ vvv }}" 输出结果: 2:在文件中定义 --- - hosts: db vars_f

【Ansible】Playbook实例

Learn to build Ansible playbooks with our guide, one step at a time In our previous posts, we introduced Ansible fundamentals, and dove deeper into Ansible playbooks. Now let's learn to create an Ansible playbook step by step. Working with a playbook

Ansible值playbook

简介 playbook是一个非常简单的配置管理和多主机部署系统.可作为一个适合部署复杂应用程序的基础.playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式.playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤. playbook通过示例展示其用法 定制一个简单的Nginx软件包管理,内容包括安装.配置模板.状态管理等. 配置文件:nginx.yml --- - hosts: webservers #hosts参数