playbook

  • tasks
  • variables
  • templates
  • handlers
  • roles

yaml介绍

  yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。

  • yaml的可读性好
  • yaml和脚本语言的交互性好
  • yaml使用实现语言的数据类型
  • yaml有一个一致的信息模型
  • yaml易于实现
  • yaml可以基于流程来处理
  • yaml表达能力强,扩展性好

Ansible剧本编写说明

一. 缩进

yaml 的缩进要求比较严格。一定不能使用tab键

注意:编写yaml文件,就忘掉shell的tab吧。

二. 冒号

每个冒号后面一定要有一个空格

注意:1. 以冒号结尾不需要空格

2.表示文件路径的模版可以不需要空格

三. 短横线  -

想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

总之:

1. 严格控制空格编写剧本的时候

2.剧本编写不支持tab

Ansible书写规范

一. 注意点

1、脚本名:***.yml   【不是.yml也行】

2、注释:  “#”

3、tasks: (后不能加任何字符-可以加注释#)

4、- name: 一个 - name: 下不能有两条功能(行)

5.每个-和:即冒号之后要有一个空格,task除外。

二.  剧本格式

---                     ### 剧本的开头,可以不写

- hosts: all         <- 处理所有服务器,找到所有服务器;  -(空格)hosts:(空格)all

tasks:            <- 剧本所要干的事情;  (空格)(空格)task:

- command:     (空格)(空格)空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

测试剧本命令后面可以跟多个-v进行调试检查

Ansible剧本常用命令

1 .对剧本语法检测

ansible-playbook --syntax-check  /root/ansible/httpd.yaml

2.-C模拟执行剧本

ansible-playbook  -C /root/ansible/httpd.yaml

3.执行剧本

ansible-playbook   /root/ansible/httpd.yaml

Ansible剧本实例

实例一:安装httpd并启动

第一步: 编写一个httpdin.yaml剧本,剧本内容如下

  1. [root@ken ~]# vim httpdin.yaml
  2. - hosts: all
  3. tasks:
  4. - name: install httpd
  5. yum: name=httpd state=present
  6. - name: start httpd
  7. service: name=httpd state=started

第二步:语法检测

检测没有问题

  1. [root@ken ~]# ansible-playbook --syntax-check httpdin.yaml
  2.  
  3. playbook: httpdin.yaml

第三步:模拟执行剧本

  1. [root@ken ~]# ansible-playbook -C httpdin.yaml
  2.  
  3. PLAY [all] *********************************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *********************************************************************************************************
  6. ok: [10.220.5.139]
  7. ok: [10.220.5.138]
  8.  
  9. TASK [install httpd] ***********************************************************************************************************
  10. ok: [10.220.5.138]
  11. changed: [10.220.5.139]
  12.  
  13. TASK [start httpd] *************************************************************************************************************
  14. changed: [10.220.5.139]
  15. ok: [10.220.5.138]
  16.  
  17. PLAY RECAP *********************************************************************************************************************
  18. 10.220.5.138 : ok=3 changed=0 unreachable=0 failed=0
  19. 10.220.5.139 : ok=3 changed=2 unreachable=0 failed=0

第四步:执行剧本

经过上面的模拟执行,并不会真的执行脚本,下面我们来进行真正的执行

  1. [root@ken ~]# ansible-playbook httpdin.yaml
  2.  
  3. PLAY [all] *********************************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *********************************************************************************************************
  6. ok: [10.220.5.138]
  7. ok: [10.220.5.139]
  8.  
  9. TASK [install httpd] ***********************************************************************************************************
  10. ok: [10.220.5.138]
  11. changed: [10.220.5.139]
  12.  
  13. TASK [start httpd] *************************************************************************************************************
  14. ok: [10.220.5.138]
  15. changed: [10.220.5.139]
  16.  
  17. PLAY RECAP *********************************************************************************************************************
  18. 10.220.5.138 : ok=3 changed=0 unreachable=0 failed=0
  19. 10.220.5.139 : ok=3 changed=2 unreachable=0 failed=0

第五步:检查是否已经安装并启动成功

执行表名httpd安装并启动成功

  1. [root@ken ~]# ansible all -m shell -a "ss -tnl | grep 80"
  2. 10.220.5.139 | SUCCESS | rc=0 >>
  3. LISTEN 0 128 :::80 :::*
  4.  
  5. 10.220.5.138 | SUCCESS | rc=0 >>
  6. LISTEN 0 128 :::80 :::*

经过上面的五步,就可以安装任意软件及启动了,前提是你需要配置好你的yum源。你来试一下安装nginx吧!

实例二:使用处理器

在上面的实例中,我们已经可以安装软件了。现在有这样一个需求,如果我们更改了节点的配置文件需要重启操作,其余动作照常执行怎么解决?

第一步:本地准备一个httpd配置文件,更改端口号为8081

  1. [root@ken ~]# cp /etc/httpd/conf/httpd.conf ./
  2. [root@ken ~]# sed -i "s/Listen 80/Listen 8081/" httpd.conf

第二步:编写剧本

剧本说明:

- hosts: all 指定主机组,可以理解为这个最大,顶个写

tasks:       指定下面一系列的动作,这个是第二,需要有两个空格

- name: 指定名称,排行第三,需要有三到四个空格

yum: 模块名 排行第四,需要有四到五个空格

handlers:指定处理器(触发器),排行第二,需要与tasks对齐

  1. - hosts: all
  2. tasks:
  3. - name: install httpd
  4. yum: name=httpd state=present
  5. - name: copy file
  6. copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
  7. notify:
  8. - restart httpd
  9. - name: start httpd
  10. service: name=httpd state=present
  11. handlers:
  12. - name: restart httpd
  13. service: name=httpd state=restarted

第三步:剧本语法检测

剧本检测报以下错误,说明排版有问题

  1. [root@ken ~]# ansible-playbook --syntax-check httpdhe.yaml
  2. ERROR! Syntax Error while loading YAML.
  3. mapping values are not allowed in this context
  4.  
  5. The error appears to have been in '/root/httpdhe.yaml': line 4, column 11, but may
  6. be elsewhere in the file depending on the exact syntax problem.
  7.  
  8. The offending line appears to be:
  9.  
  10. - name: install httpd
  11. yum: name=httpd state=present
  12. ^ here

第四步:排查错误

可以发现第四行yum多缩进了一个空格,一定要严格控制缩进。

tasks和hosts首字母对齐

模块和name对齐首字母

  1. - hosts: all
  2. tasks:
  3. - name: install httpd
  4. yum: name=httpd state=present
  5. - name: copy file
  6. copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
  7. notify:
  8. - restart httpd
  9. - name: start httpd
  10. service: name=httpd state=present
  11. handlers:
  12. - name: restart httpd
  13. service: name=httpd state=restarted

第五步:执行剧本

注意看执行过程,中间有一步RUNNING HANDLER,说明已经出发了处理器进行了重启操作

  1. [root@ken ~]# ansible-playbook httpdhe.yaml
  2.  
  3. PLAY [all] *********************************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *********************************************************************************************************
  6. ok: [10.220.5.139]
  7. ok: [10.220.5.138]
  8.  
  9. TASK [install httpd] ***********************************************************************************************************
  10. ok: [10.220.5.139]
  11. ok: [10.220.5.138]
  12.  
  13. TASK [copy file] ***************************************************************************************************************
  14. changed: [10.220.5.139]
  15. changed: [10.220.5.138]
  16.  
  17. TASK [start httpd] *************************************************************************************************************
  18. ok: [10.220.5.138]
  19. ok: [10.220.5.139]
  20.  
  21. RUNNING HANDLER [restart httpd] ************************************************************************************************
  22. changed: [10.220.5.139]
  23. changed: [10.220.5.138]
  24.  
  25. PLAY RECAP *********************************************************************************************************************
  26. 10.220.5.138 : ok=5 changed=2 unreachable=0 failed=0
  27. 10.220.5.139 : ok=5 changed=2 unreachable=0 failed=0

第六步:检查端口

上面我们已经把配置文件的端口改成8081了,检查下节点启动的是否是8081

可以发现节点中的8081已经启动

  1. [root@ken ~]# ansible all -m shell -a "ss -tnl | grep 8081"
  2. 10.220.5.139 | SUCCESS | rc=0 >>
  3. LISTEN 0 128 :::8081 :::*
  4.  
  5. 10.220.5.138 | SUCCESS | rc=0 >>
  6. LISTEN 0 128 :::8081 :::*

实例三:剧本中使用判断

剧本中可以使用when来进行判断

现在我们再主机名为ken1的节点之上创建一个用户tang

第一步:域名解析

确保本机以及节点之上可以解析IP和域名

  1. root@ken ~]# echo "10.220.5.138 ken1" >>/etc/hosts

第二步:编写剧本

ansible_fqdn是一个变量,可以用如下命令看到,表示的是主机名

  1. [root@ken ~]# ansible 10.220.5.138 -m setup | grep ansible_fqdn
  2. "ansible_fqdn": "ken1",

在编写剧本的时候ken1即主机名需要加上双引号或者单引号,否则会报错

  1. - hosts: all
  2. tasks:
  3. - name: useradd tang
  4. user: name=tang uid=566 system=yes
  5. when: ansible_fqdn == "ken1"

第三步:语法检测

  1. [root@ken ~]# ansible-playbook --syntax-check useradd.yaml
  2.  
  3. playbook: useradd.yaml

第四步:执行剧本

可以看到10.220.5.139跳过了

  1. [root@ken ~]# ansible-playbook useradd.yaml
  2.  
  3. PLAY [all] *********************************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *********************************************************************************************************
  6. ok: [10.220.5.139]
  7. ok: [10.220.5.138]
  8.  
  9. TASK [useradd tang] ************************************************************************************************************
  10. skipping: [10.220.5.139]
  11. changed: [10.220.5.138]
  12.  
  13. PLAY RECAP *********************************************************************************************************************
  14. 10.220.5.138 : ok=2 changed=1 unreachable=0 failed=0
  15. 10.220.5.139 : ok=1 changed=0 unreachable=0 failed=0
  16.  
  17. [root@ken ~]# vim useradd.yaml

第五步:检测是否执行成功

可以发现在主机10.220.5.138上面已经有了用户tang

  1. [root@ken ~]# ansible all -m shell -a "id tang"
  2. 10.220.5.139 | FAILED | rc=1 >>
  3. id: tang: no such usernon-zero return code
  4.  
  5. 10.220.5.138 | SUCCESS | rc=0 >>
  6. uid=566(tang) gid=566(tang) groups=566(tang)

实例四:剧本中使用循环

剧本中的循环使用with_items,使用item引用变量

变量的引用格式是 {{ 变量 }}

第一步:创建剧本

  1. - hosts: all
  2. tasks:
  3. - name: useradd ding
  4. user: name="ding{{item}}"
  5. with_items:
  6. - a1
  7. - a2
  8. - a3
  9. - a4

第二步:语法检测

  1. [root@ken ~]# ansible-playbook --syntax-check user.yaml
  2.  
  3. playbook: user.yaml

第三步:执行剧本

  1. [root@ken ~]# ansible-playbook user.yaml
  2.  
  3. PLAY [all] *********************************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *********************************************************************************************************
  6. ok: [10.220.5.139]
  7. ok: [10.220.5.138]
  8.  
  9. TASK [useradd ding] ************************************************************************************************************
  10. changed: [10.220.5.138] => (item=a1)
  11. changed: [10.220.5.139] => (item=a1)
  12. changed: [10.220.5.138] => (item=a2)
  13. changed: [10.220.5.139] => (item=a2)
  14. changed: [10.220.5.138] => (item=a3)
  15. changed: [10.220.5.139] => (item=a3)
  16. changed: [10.220.5.138] => (item=a4)
  17. changed: [10.220.5.139] => (item=a4)
  18.  
  19. PLAY RECAP *********************************************************************************************************************
  20. 10.220.5.138 : ok=2 changed=1 unreachable=0 failed=0
  21. 10.220.5.139 : ok=2 changed=1 unreachable=0 failed=0

第四步:查看执行结果

可以发现用户已经创建完毕

  1. [root@ken ~]# ansible all -m shell -a "tail -5 /etc/passwd"
  2. 10.220.5.139 | SUCCESS | rc=0 >>
  3. wukong:x:1002:234::/home/wukong:/bin/bash
  4. dinga1:x:1003:1003::/home/dinga1:/bin/bash
  5. dinga2:x:1004:1004::/home/dinga2:/bin/bash
  6. dinga3:x:1005:1005::/home/dinga3:/bin/bash
  7. dinga4:x:1006:1006::/home/dinga4:/bin/bash
  8.  
  9. 10.220.5.138 | SUCCESS | rc=0 >>
  10. tang:x:566:566::/home/tang:/bin/bash
  11. dinga1:x:1002:1002::/home/dinga1:/bin/bash
  12. dinga2:x:1003:1003::/home/dinga2:/bin/bash
  13. dinga3:x:1004:1004::/home/dinga3:/bin/bash
  14. dinga4:x:1005:1005::/home/dinga4:/bin/bash

自我感觉这个循环很low,如果创建1000个用户难道需要这样写- a1 -a2 -a3...-a1000个吗?

实例五:剧本中使用变量

自定义变量的实现方式

1. 直接写在yaml文件中

2. 在Inventory file中定义

3. 变量的声明:

vars:

- 变量名: 变量值

4. 变量的引用:{{ var }}

5. vars和tasks同级,并要写在tasks前面

下面的剧本定义了一个变名为pkgname 变量值为mariadb-server, 变量名为sername,变量值为mariadb两个变量

第一步:创建剧本

  1. - hosts: all
  2. vars:
  3. - pkgname: mariadb-server
  4. - sername: mariadb
  5. tasks:
  6. - name: install mariadb
  7. yum: name={{ pkgname }} state=present
  8. - name: start mariadb
  9. service: name={{ sername }} state=started

第二步:语法检测

  1. [root@ken ~]# ansible-playbook --syntax-check mariadb.yaml
  2.  
  3. playbook: mariadb.yaml

第三步:执行剧本

  1. [root@ken ~]# ansible-playbook mariadb.yaml
  2.  
  3. PLAY [all] *********************************************************************************************************************
  4.  
  5. TASK [Gathering Facts] *********************************************************************************************************
  6. ok: [10.220.5.139]
  7. ok: [10.220.5.138]
  8.  
  9. TASK [install mariadb] *********************************************************************************************************
  10. ok: [10.220.5.138]
  11. ok: [10.220.5.139]
  12.  
  13. TASK [start mariadb] ***********************************************************************************************************
  14. changed: [10.220.5.138]
  15. changed: [10.220.5.139]
  16.  
  17. PLAY RECAP *********************************************************************************************************************
  18. 10.220.5.138 : ok=3 changed=1 unreachable=0 failed=0
  19. 10.220.5.139 : ok=3 changed=1 unreachable=0 failed=0

第四步:检测剧本是否执行成功

  1. [root@ken ~]# ansible all -m shell -a "ss -tnl| grep 3306"
  2. 10.220.5.139 | SUCCESS | rc=0 >>
  3. LISTEN 0 50 *:3306 *:*
  4.  
  5. 10.220.5.138 | SUCCESS | rc=0 >>
  6. LISTEN 0 50 *:3306 *:*

Ansible第二章:palybook介绍与使用--小白博客的更多相关文章

  1. Mariadb第一章:介绍及安装--小白博客

    mariadb(第一章)   数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以 ...

  2. python第一章:简介与安装--小白博客

    Python简介 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项 ...

  3. 《AngularJS深度剖析与最佳实践》笔记: 第二章 概念介绍

    第二章 概念介绍 2.1 什么是UI? 用户界面包括内容(静态信息+动态信息), 外观, 交互. 在前端技术栈中分别由HTML, CSS和JS负责. 进一步抽象, 分别对应于MVC三个主要部分: Mo ...

  4. Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN

    Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN.NET http://blog.csdn.net/borishuai/article/details ...

  5. IDEA系列(九)Intellij IDEA界面介绍 - 哲也的博客

    原文出处:https://github.com/judasn/IntelliJ-IDEA-Tutorial 首次打开 重点说明: IntelliJ IDEA 是没有类似 Eclipse 的工作空间的概 ...

  6. 第1章 Express MongoDB 搭建多人博客

    学习环境 Node.js : 0.10.22 + Express : 3.4.4 + MongoDB : 2.4.8 + 快速开始 安装 Express express 是 Node.js 上最流行的 ...

  7. MWeb 1.4 新功能介绍二:静态博客功能增强

    MWeb 比较有特色的是一键生成静态博客功能,然后从 MWeb 最开始规划要做静态博客生成功能时,我就希望 MWeb 的静态博客生成功能在易用的同时,还要有很强大的扩展性. 比如说能自己增加网站公告, ...

  8. 自我介绍&软工实践博客点评

    想想既然写了点评博客,那就顺便向同学们介绍下自己吧. 我是16届计科实验班的,水了两件小黄衫,于是就来当助教了_(:_」∠)_ 实话说身为同届生来当助教,我心里还是有点虚的,而且我还是计科的..感觉软 ...

  9. Ansible第一章:基础认识--小白博客

    ansible Ansible:Ansible的核心程序Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等.可以通过file来 ...

随机推荐

  1. C#杂记-简化的初始化

    对象说明 public class Person { public int Age{get; set;} public string Name{get; set;} List<Person> ...

  2. struct的匿名用法详解

    Go只提供类型而不用写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct. 举个例子,看 ...

  3. Java学习笔记 抽象类 接口 多态

    instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...

  4. 【Linux】Linux上安装Nginx

    本文介绍Linux环境安装Nginx,这里用的Linux系统是CentOS 7.2. 1. 从Nginx官网下载Nginx.这里用的版本为:1.13.6. 2. 将下载下来的Nginx上传到Linux ...

  5. PHP代码片段

    将数组拼接为 table 标签字符串 <?php //判断是否是图片 function isImage($string){ $isImage = false; $pics = ['.png', ...

  6. 23 , CSS 构造列表与导航

    1. 列表图片 2. 背景列表 3. 翻转列表 4. 水平导航 1. 内边距与外边距 Ul { Margin: 0; Padding: 0; } 2. 使用图片作为列表图标 Ul { Margin: ...

  7. [HTML/CSS]colum-gap属性

    属性定义及使用说明 column-gap的属性指定的列之间的差距. 注意: 如果指定了列之间的距离规则,它会取平均值.   语法 column-gap: length|normal;   值 描述 l ...

  8. 下载Dynamics 365 Customer Engagement 工具

    微软动态CRM专家罗勇 ,回复312或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 从Dynamics ...

  9. C#从SqlServer数据库读写文件源码

    如下的资料是关于C#从SqlServer数据库读写文件的内容,希望能对码农们有一些用. <%@ Page Language="C#" %> <script run ...

  10. Xamarin 打包生成 Android apk 文件

    Visual Studio 支持 apk 发布 Xamarin.Forms项目或Xamarin.Android项目开发完成之后需要发布.比较常规的发布方式是生成 apk 文件,微软也考虑到开发者有发布 ...