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: alltasks:- name: install httpdyum: name=httpd state=present- name: start httpdservice: 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: alltasks:- name: install httpdyum: name=httpd state=present- name: copy filecopy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: name=httpd state=presenthandlers:- name: restart httpdservice: 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 contextThe 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 httpdyum: name=httpd state=present^ here

第四步:排查错误

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

tasks和hosts首字母对齐

模块和name对齐首字母

- hosts: alltasks:- name: install httpdyum: name=httpd state=present- name: copy filecopy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpdservice: name=httpd state=presenthandlers:- name: restart httpdservice: 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: alltasks:- name: useradd tanguser: name=tang uid=566 system=yeswhen: 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 code10.220.5.138 | SUCCESS | rc=0 >>
uid=566(tang) gid=566(tang) groups=566(tang)

实例四:剧本中使用循环

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

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

第一步:创建剧本

- hosts: alltasks:- name: useradd dinguser: 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.yamlPLAY [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/bash10.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: allvars:- pkgname: mariadb-server- sername: mariadbtasks:- name: install mariadbyum: name={{ pkgname }} state=present- name: start mariadbservice: 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                     *:*                  

转载于:https://www.cnblogs.com/kenken2018/p/9982793.html

Ansible剧本介绍及使用演示(week5_day2)--技术流ken相关推荐

  1. docker的文件流处理_Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken...

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  2. Git介绍及常用操作演示(一)--技术流ken

    Git介绍及常用操作演示(一)--技术流ken Git介绍 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus To ...

  3. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken

    项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...

  4. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

  5. 学会这个删库再也不用跑路了~ --技术流ken

    前言 相信每一个学IT的人或多或少都听说过从删库到跑路这个梗~下图也是在各种交流群屡禁不止,新人听着也是瑟瑟发抖. 人们茶余饭后,街头巷角难免要问... 下面技术流ken就教给各位新手们一招删库再也不 ...

  6. 五分钟彻底学会iptables防火墙--技术流ken

    iptables简介 IPTABLES 是与最新的 3.5 版本 Linux内核集成的 IP 信息包过滤系统.如果 Linux 系统连接到因特网或 LAN.服务器或连接 LAN 和因特网的代理服务器, ...

  7. 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken...

    前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...

  8. Linux网络技术管理及进程管理(week2_day4)--技术流ken...

    Linux网络技术管理及进程管理(week2_day4)--技术流ken OSI七层模型和TCP/IP四层模型 OSI七层模型:OSI(Open System Interconnection)开放系统 ...

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

    项目需求 需求一..使用gitlab创建项目 需求二. 使用ansible的roles实现一键化部署wordpress 每次部署需要备份之前的网站数据 使用roles 使用templates 脚本对网 ...

最新文章

  1. java 无符号转有符号_java有符号无符号的转换
  2. 判断checkbox是否选中并改变值
  3. oracle 10 升级补丁
  4. [基础题] * 9.(*)设计一个Student接口,以一维数组存储一个班级的学生姓名。
  5. java怎么配置哨兵模式_redis 哨兵模式配置与spring集成
  6. vb的一些搞怪的操作
  7. lan speed test怎么用_别浪费,你家的200M光纤真的用起来了吗?
  8. Altium Designer 20的安装教程
  9. 从python入门机器学习系列--2、Z 检验与 T 检验
  10. 如何锁定计算机硬盘,详细教您如何给硬盘加密
  11. 学习Python人工智能前景如何
  12. php户型图识别,五大指标教你看懂户型图
  13. js 面试题之---数组、字符串操作
  14. excel下拉菜单创建
  15. 工地人员定位原理又是什么--新导智能
  16. 截屏与截长图功能的实现
  17. 英语不好到底适不适合学习java
  18. 2017展望之四:运营商能否老树开新花?
  19. (xshell中)Linux服务器查看GPU的使用情况。
  20. 计算机各外设的作用,外设在计算机中的作用及传输方式.doc

热门文章

  1. Linux Shell常用技巧(十一)
  2. 第二章mapper接口 和模糊查询
  3. android Glide简单使用
  4. 【Redis】6.Redis key通用指令以及数据库的通用操作
  5. kotlin集合操作符——顺序操作符
  6. C++入门经典-例4.1-声明、定义和使用函数
  7. ant 安装及基础教程 !
  8. 【原】Spark Standalone模式
  9. MS CRM 2011——让活动实体在活动菜单中显示
  10. 40 个顶级 jQuery 图片、内容滑块和幻灯片