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剧本,剧本内容如下

[root@ken ~]# vim httpdin.yaml
- hosts: all
tasks:
- name: install httpd
yum: name=httpd state=present
- name: start httpd
service: name=httpd state=started

第二步:语法检测

检测没有问题

[root@ken ~]# ansible-playbook --syntax-check httpdin.yaml 

playbook: httpdin.yaml

第三步:模拟执行剧本

[root@ken ~]# ansible-playbook -C httpdin.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138] TASK [install httpd] ***********************************************************************************************************
ok: [10.220.5.138]
changed: [10.220.5.139] TASK [start httpd] *************************************************************************************************************
changed: [10.220.5.139]
ok: [10.220.5.138] PLAY RECAP *********************************************************************************************************************
10.220.5.138 : ok=3 changed=0 unreachable=0 failed=0
10.220.5.139 : ok=3 changed=2 unreachable=0 failed=0

第四步:执行剧本

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

[root@ken ~]# ansible-playbook  httpdin.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.138]
ok: [10.220.5.139] TASK [install httpd] ***********************************************************************************************************
ok: [10.220.5.138]
changed: [10.220.5.139] TASK [start httpd] *************************************************************************************************************
ok: [10.220.5.138]
changed: [10.220.5.139] PLAY RECAP *********************************************************************************************************************
10.220.5.138 : ok=3 changed=0 unreachable=0 failed=0
10.220.5.139 : ok=3 changed=2 unreachable=0 failed=0

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

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

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

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

实例二:使用处理器

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

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

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

第二步:编写剧本

剧本说明:

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

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

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

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

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

- hosts: all
tasks:
- name: install httpd
yum: name=httpd state=present
- name: copy file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd
service: name=httpd state=present
handlers:
- name: restart httpd
service: name=httpd state=restarted

第三步:剧本语法检测

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

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

第四步:排查错误

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

tasks和hosts首字母对齐

模块和name对齐首字母

- hosts: all
tasks:
- name: install httpd
yum: name=httpd state=present
- name: copy file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd
service: name=httpd state=present
handlers:
- name: restart httpd
service: name=httpd state=restarted

第五步:执行剧本

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

[root@ken ~]# ansible-playbook httpdhe.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138] TASK [install httpd] ***********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138] TASK [copy file] ***************************************************************************************************************
changed: [10.220.5.139]
changed: [10.220.5.138] TASK [start httpd] *************************************************************************************************************
ok: [10.220.5.138]
ok: [10.220.5.139] RUNNING HANDLER [restart httpd] ************************************************************************************************
changed: [10.220.5.139]
changed: [10.220.5.138] PLAY RECAP *********************************************************************************************************************
10.220.5.138 : ok=5 changed=2 unreachable=0 failed=0
10.220.5.139 : ok=5 changed=2 unreachable=0 failed=0

第六步:检查端口

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

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

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

实例三:剧本中使用判断

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

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

第一步:域名解析

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

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

第二步:编写剧本

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

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

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

- hosts: all
tasks:
- name: useradd tang
user: name=tang uid=566 system=yes
when: ansible_fqdn == "ken1"

第三步:语法检测

[root@ken ~]# ansible-playbook --syntax-check useradd.yaml 

playbook: useradd.yaml

第四步:执行剧本

可以看到10.220.5.139跳过了

[root@ken ~]# ansible-playbook useradd.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138] TASK [useradd tang] ************************************************************************************************************
skipping: [10.220.5.139]
changed: [10.220.5.138] PLAY RECAP *********************************************************************************************************************
10.220.5.138 : ok=2 changed=1 unreachable=0 failed=0
10.220.5.139 : ok=1 changed=0 unreachable=0 failed=0 [root@ken ~]# vim useradd.yaml

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

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

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

实例四:剧本中使用循环

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

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

第一步:创建剧本

- hosts: all
tasks:
- name: useradd ding
user: name="ding{{item}}"
with_items:
- a1
- a2
- a3
- a4

第二步:语法检测

[root@ken ~]# ansible-playbook --syntax-check user.yaml 

playbook: user.yaml

第三步:执行剧本

[root@ken ~]# ansible-playbook user.yaml

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138] TASK [useradd ding] ************************************************************************************************************
changed: [10.220.5.138] => (item=a1)
changed: [10.220.5.139] => (item=a1)
changed: [10.220.5.138] => (item=a2)
changed: [10.220.5.139] => (item=a2)
changed: [10.220.5.138] => (item=a3)
changed: [10.220.5.139] => (item=a3)
changed: [10.220.5.138] => (item=a4)
changed: [10.220.5.139] => (item=a4) PLAY RECAP *********************************************************************************************************************
10.220.5.138 : ok=2 changed=1 unreachable=0 failed=0
10.220.5.139 : ok=2 changed=1 unreachable=0 failed=0

第四步:查看执行结果

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

[root@ken ~]# ansible all -m shell -a "tail -5 /etc/passwd"
10.220.5.139 | SUCCESS | rc=0 >>
wukong:x:1002:234::/home/wukong:/bin/bash
dinga1:x:1003:1003::/home/dinga1:/bin/bash
dinga2:x:1004:1004::/home/dinga2:/bin/bash
dinga3:x:1005:1005::/home/dinga3:/bin/bash
dinga4:x:1006:1006::/home/dinga4:/bin/bash 10.220.5.138 | SUCCESS | rc=0 >>
tang:x:566:566::/home/tang:/bin/bash
dinga1:x:1002:1002::/home/dinga1:/bin/bash
dinga2:x:1003:1003::/home/dinga2:/bin/bash
dinga3:x:1004:1004::/home/dinga3:/bin/bash
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两个变量

第一步:创建剧本

- hosts: all
vars:
- pkgname: mariadb-server
- sername: mariadb
tasks:
- name: install mariadb
yum: name={{ pkgname }} state=present
- name: start mariadb
service: name={{ sername }} state=started

第二步:语法检测

[root@ken ~]# ansible-playbook --syntax-check mariadb.yaml 

playbook: mariadb.yaml

第三步:执行剧本

[root@ken ~]# ansible-playbook mariadb.yaml 

PLAY [all] *********************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************
ok: [10.220.5.139]
ok: [10.220.5.138] TASK [install mariadb] *********************************************************************************************************
ok: [10.220.5.138]
ok: [10.220.5.139] TASK [start mariadb] ***********************************************************************************************************
changed: [10.220.5.138]
changed: [10.220.5.139] PLAY RECAP *********************************************************************************************************************
10.220.5.138 : ok=3 changed=1 unreachable=0 failed=0
10.220.5.139 : ok=3 changed=1 unreachable=0 failed=0

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

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

Ansible剧本介绍及使用演示(3)的更多相关文章

  1. Ansible剧本介绍及使用演示(week5_day2)--技术流ken

    Ansible剧本编写说明 一. 缩进 yaml 的缩进要求比较严格.一定不能使用tab键 注意:编写yaml文件,就忘掉shell的tab吧. 二. 冒号 每个冒号后面一定要有一个空格 注意:1. ...

  2. Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken

    项目前言 之前已经写了一篇关于git和ansible的博客<Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken>.关于git,gitliab,ansible在我 ...

  3. Git+Gitlab+Ansible剧本实现一键部署动态网站(5)

    项目前言 之前已经写了一篇关于git和ansible的博客<Git+Gitlab+Ansible剧本实现一键部署Nginx–技术流ken>.关于git,gitliab,ansible在我以 ...

  4. 自动化运维工具——ansible剧本playbook(三)

    一.Playbook--Ansible剧本 playbook是由一个或多个 "play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的ta ...

  5. ansible剧本之playbook操作

    ansible 剧本 yaml介绍: 是一个编程语言 文件后缀名 yaml yml 数据对应格式: 字典: key: value 列表: [] - ansible-playbook命令格式 执行顺序: ...

  6. Ansible简单介绍(一)

    一 :ansible简单介绍 此名取自 Ansible 作者最喜爱的<安德的游戏> 小说,而这部小说更被后人改编成电影 -<战争游戏>. 官网地址:https://www.an ...

  7. 第二十七章 ansible变量介绍

    一.ansible变量介绍 1.概念 变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲 ...

  8. 单元测试_JUnit常用单元测试注解介绍及代码演示

    JUnit常用单元测试注解介绍及代码演示   by:授客 QQ:1033553122 1. 测试环境 1 2. 基础概念 1 3. 常用Annotation 1 4. 运行环境配置 3 maven配置 ...

  9. Ansible Playbooks 介绍 和 使用 二

    目录 handlers playbook 案例 2 handlers vars 变量 setup facts 变量使用 案例 inventory 中定义变量 案例 条件测试 when 语句 案例 迭代 ...

随机推荐

  1. 谈谈BUG严重级别(severity)管理

    在软件工程理论中,BUG严重级别(severity)是用于指示软件质量问题导致的负面影响的程度.但在大部分实际的软件开发组织中,对BUG严重级别(severity)的定义和使用常常充斥着大量的争议和分 ...

  2. 【测试技术分享】Liunx常用操作命令集合

    Linux命令 ls 查看文件目录内容 ls -lha  l:详细信息 h:人性化显示 a:查看隐藏目录 ls -目录名  查看指定目录 d rwx rwx rwx d:文件夹 -:文件 rwx:拥有 ...

  3. C++ IO的一些注意点

    读入这个坑一直以来都深受其麻烦,把遇到一些注意点记一下吧. 1.getchar读入 以前练线段树的时候做到Acwing#246 Interval GCD(原题在CodeHunter上,人懒就在Acwi ...

  4. redis安装及性能测试

    Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库.通常被称为数据结构服务器,因为值(value)可以是 字符串(Stri ...

  5. HDU 6609 离散化+权值线段树

    题意 有一个长度为\(n\)的数组W; 对于每一个\(i\)(\(1<=i<=n\)),你可以选择中任意一些元素W[k] (\(1<=k<i\)),将他们的值改变为0,使得\( ...

  6. 更换git远程仓库地址

    通过命令直接修改远程仓库地址 git remote 查看所有远程仓库 git remote xxx 查看指定远程仓库地址 git remote set-url origin 你新的远程仓库地址 先删除 ...

  7. 第5章 if 语句

    第5章 if 语句 5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': pr ...

  8. 机器学习 | 深入SVM原理及模型推导(一)

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第32篇文章,我们来聊聊SVM. SVM模型大家可能非常熟悉,可能都知道它是面试的常客,经常被问到.它最早诞生于上世纪六 ...

  9. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  10. [C#.NET 拾遗补漏]08:强大的LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrate ...