Ansible 之 playbook使用
原创
ghbSunny
2017-12-04 10:07:21
评论(0)
910人阅读

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 脚本

例子:

1

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
1
2
3
4

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

查看playbook里的主机
1

ansible-playbook --list-hosts installpkg.yml

查看playbook里的tasks
1

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

执行如下
1

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

转载于:https://blog.51cto.com/jingfeng/2108676

ansible高级应用示例相关推荐

  1. ansible高级用法(压测脚本)

    记录一个ansible高级用法与shell结合_kali_yao的博客-CSDN博客_ansible shell 注:由于ansible的远程原则必须要key(也就是ssh远程测试),所以在配置文件中 ...

  2. boost::format模块format的高级用法示例

    boost::format模块format的高级用法示例 实现功能 C++实现代码 实现功能 boost::format模块format的高级用法示例 C++实现代码 #include <ios ...

  3. ansible命令应用示例

                                  ansible命令应用示例                             ping slave组 ansible slave -m ...

  4. 8.ansible高级进阶-role详解

    1.迭代:with_itrems 迭代:当有需要重复执行的任务时,可以使用迭代机制 - 对迭代项的引用,固定变量名为 "itrem" - 要在task中使用with_itrems给 ...

  5. ansible 高级用法

    1.控制每次同时更新的主机数量 im test_serial.yml --- - hosts: allserial: 2 #每次只同时处理2个主机max_fail_percentage : 50 #当 ...

  6. aspect 方法入参 获取_谈谈Spring AOP中@Aspect的高级用法示例

    前言 本文主要跟大家分享介绍了关于Spring AOP中@Aspect的高级用法,下面话不多说了,来随着小编一起看看详细的介绍吧. 1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算 ...

  7. 记录一个ansible高级用法与shell结合

    未经本人同意不得转载 目录 一.ansible安装(ansible的配置与roles运用) 1.ansible的概述 2.安装python 3.ansible运用前准备 二.修改roles 1.初步修 ...

  8. ansible 高级自动化变量及变量过滤器

    文章目录 ansible 变量 ansible变量过滤器 1. 变量类型 2. 通用变量过滤器 3. 基础变量过滤器 4. 特殊处理过滤器 5. 复杂数据格式处理 6. 万能处理插件 Lookup / ...

  9. linux命令 mv -v,Linux中mv命令的高级用法示例

    前言 mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 命令格式: mv [选项] 源文件或 ...

最新文章

  1. callback回调使用 vue_前端动画必知必会:React 和 Vue 都在用的 FLIP 思想实战
  2. android getMemoryClass()的使用
  3. 6大奖项!首届 .NET 黑客松大赛圆满收官!
  4. 非线性回归(Non-linear Regression)
  5. 思科交换机Portfast和Uplinkfast配置实验
  6. 微软允许员工永久在家办公,远程办公时代真的要来临了吗?
  7. Dubbo(一) -- 初体验
  8. 什么是机器学习?(下)
  9. 关于QQ的几点改进建议
  10. PostgreSQL在何处处理 sql查询之五十三
  11. android弹出窗背景透明,Android Dialog 弹框之外的区域 默认透明背景色修改
  12. OpenHarmony啃论文俱乐部玩法攻略
  13. 小游戏市场被微信点燃,社交平台蜂拥而至谁能分到蛋糕?
  14. SPSS 27 发布了!我为什么要在两个月前买SPSS?为什么?为什么?为什么?
  15. android 使用Path实现涂鸦效果
  16. 如何 获得 自身程序 的 版本号 ???? 急!!!!!!!!!!!!
  17. location 拦截所有_终极广告拦截软件来袭!AdGuard
  18. ol+天地图+geoserver_mapbox+GeoglobeJS天地图
  19. Python的打包神器—Nuitka
  20. 10月英语,美好的开始

热门文章

  1. js 对象和Json的转换,js及深度复制
  2. 让win7提速几倍的10个方法
  3. ironpython使用opencv_连这些都不知道,就别说自己懂Python!
  4. 基础实验中的抗体选择过程和避坑Tips
  5. c、c++、Java和gcc写Hello World
  6. JavaSE(十)——set和map集合、异常、File类
  7. linux杀sqlplus进程,sqlplus / as sysdba 在linux系统所发起进程
  8. matlab fft简单小例子,matlabfft简单例子(A simple example of matlabfft).doc
  9. 安装php报错误2356,linux下Mysql+php5+apache安装手记
  10. mysql里面integer默认宽度_MySQL中关于数据类型指定宽度之后的情况