目录

1、 ansible的剧本-playbook

2、playbook的语法结构

语法 yaml 格式配置

3、ansible语法解析-template模块

1、 ansible的剧本-playbook

如果ansible的各个模块(能实现各种功能)是车间里的各个工具;playbook就是指导手册,目标远程主机就是库存和原料对象。从根本上说playbook和shell脚本没有任何区别,playbook就像shell一样,也是把一堆一堆的命令组合起来,然后加入对应条件判断等等,在shell脚本中是一条一条的命令,而在playbook中是一个人的任务构成的,每个任务可以看做是shell脚本中的一条命令;shell脚本一般只是在当前服务器上执行,而playbook则不止是在一个服务器上执行,因此playbook需要在其中指定运行该playbook的服务器名。

2、playbook的语法结构

playbook使用yaml标记语言,这种标记语言在文件的最开始需要使用三个“-”来说明文件开始,然后使用缩进来说明代码块的范围。

语法 yaml 格式配置

1、playbook的核心元素:

> hosts :playbook配置文件作用的主机
> tasks:任务列表
> variables:变量
> templates:包含模板语法的文本文件
> handlers:由特定条件触发的任务。
> roles:用于层次性、结构化地组织playbook。
> roles能根据层次型结构自动装载变量文件、tasks以及handlers等。

2、playbook运行方式

**ansible-playbook --check** :检测模式,playbook中定义的所有任务将在每台主机上检测,但是并不真的执行。
**ansible-playbook --list-hosts** :列出运行任务的主机
**ansible-playbook --syntax-check playbook.yaml** :语法检测
**ansible-playbook -t TAGS_NAME playbook.yaml** :只执行TAGS_NAME任务
**ansible-playbook playbook.yaml**: 运行

3、playbook的使用

---                             #标记文件的开始- hosts: webservers             #指定该playbook在哪个服务器上执行vars:                         #表示下面是定义的变量,http_port: 80          #变量的形式,key: value,这里http_port是变量名,80是值max_clients: 200remote_user: root     #指定远程的用户名,这里缩进和vars保持了一致,说明变量的代码块已经结束。tasks:              #下面构成playbook的tasks,每个task都有 - name: 开始,name指定该任务的名称。- name: ensure apache is at the latest version  #指定该任务的名称。#yum说明要是用的模板名称,后面指定对应的参数,这两行结合起来就相当于一个shell命令。yum: pkg=httpd state=latest                   - name: write the apache config file            #每个task之间可以使用空行来做区分。template: src=/srv/httpd.j2 dest=/etc/httpd.conf  

例如:① 创建yaml文件

[root@b ~]# cat ansible_playbook_sc.yaml
- hosts: webserver   #或者allremote_user: roottasks:- name: upload filecopy: src=/etc/passwd dest=/tmp/passwd_tmp- name: ip getshell: ip a
- hosts: nginxtasks:- name: shell tasksshell: cat /etc/passwd

② 可以使用python解析yaml

>>> fp = open("ansible_playbook_sc.yaml")
>>> dict = yaml.load(fp)
>>> dict
[{'hosts': 'all', 'remote_user': 'root', 'tasks': [{'name': 'up file', 'copy': 'src=/etc/passwd dest=/tmp/passwd_tmp'}]}]

③ 执行playbook:ansible-playbook 文件名

[root@sc-master ~]# ansible-playbook ansible_playbook_sc.yaml
[WARNING]: Could not match supplied host pattern, ignoring: webserverPLAY [webserver] ***************************************************************
skipping: no hosts matchedPLAY [webserver] ***************************************************************
skipping: no hosts matchedPLAY RECAP *********************************************************************

上传和删除文件。

root@b ~]# cat ansible_playbook_sc.yaml
- hosts: allremote_user: roottasks:- name: up filecopy: src=/etc/passwd dest=/tmp/passwd_tmp- name: download redisyum: name=redis state=installed
- hosts: websertasks:- name: remove fileshell: rm -rf /tmp/passwd_tmp

例如:使用playbook去部署web服务:安装nginx,并启动nginx。

- hosts: allremote_user: roottasks:- name: yum nginxyum: name=nginx state=installed- name: copy sc.confcopy: src=/lianxi/sc.conf dest=/etc/nginx/conf.d/sc.conf- name: copy indexcopy: src=/lianxi/index.html dest=/opt/dist/- name: start nginxservice: name=nginx state=started

3、ansible语法解析-template模块

templa是基于jinja2模板语法去解析的。根据一定的条件灵活的设置要复制文件中的部分关键内容,可以使用template模块。template模板在运用Template模板在运用时与copy模块类似,区别在于可以在Ansible的Playbook执行的时候,根据一定的条件灵活的设置要复制文件中的部分关键内容。同时,Ansible的Playbook中关于Template的使用支持条件判断、循环、逻辑运算、比较等内容,增强了配置的灵活性。

注意:Templat模板使用jinjia2语言进行配置,模板文件必须以j2结尾。

测试实例:如在ansible机器上安装nginx,然后将nginx的配置中的listen中listen_port的设置为变量,可以将这个变量根据自己的需求进行定义、设置。首先是先编写j2文件(下面为 sc_template.conf.j2),里面定义listen_port变量,然后编写一个剧本(template_test.yaml);然后执行文件剧本,指定listen_port变量的值。

① 编写 vim sc_template.conf.j2模本文件。

[root@scmysql opt]# cat sc_template.conf.j2
server {listen       {{ listen_port }} ;server_name  www.sc.com;root         /opt/dist;access_log  /var/log/nginx/sc_access.log  main;location / {}location =/api {}
}

{{ listen_port }}:用双括号定义了一个listen_port变量,我们需要在调用Playbook时对该变量进行赋值,然后该变量就会替代模板文件中的变量。

② 编写测试剧本。剧本模板,一个模板一个剧本。(剧本里的内容为将存放在/opt目录下的sc_template.conf.j2模板文件复制到远程B、C机器上的/tmp/sc.conf文件中)

[root@scmysql opt]# cat template_test.yaml
- hosts: webtasks:- name: template testtemplate: src=/opt/sc_template.conf.j2 dest=/tmp/sc.conf

③ 执行playbook, 指定listen_port变量的值。-e 用来指定需要listen_port变量的值为8080。

ansible-playbook template_test.yaml -e "listen_port=8080"

[root@scmysql opt]# ansible-playbook template_test.yaml -e "listen_port=8080"

方式二:采用个性化模板:也可以在hosts文件中 (/etc/ansible/hosts )文件里面配置 指定每一台主机的listen变量。

[root@scmysql ansible]# cat hosts
[web]
192.168.2.132:22 listen_port=81   # 指明监听的端口为81
192.168.2.137  listen_port=666[nginx]
192.168.2.11   # 随便测试的一个代码

例题二:①测试在ansible机器上的编写test.j2文件,定义{{ name }}的值为可以更改的变量。

[root@sc-master opt]# cat test.j2
#########################################################################
# File Name: test.sh
# Description: test.sh
# Author: lkong
# mail: lkong@tencent.com
# Created Time: 2022-08-21 17:24:54
#########################################################################
#!/bin/bash
hello  {{ name }}
shanshan shi zhu

② 编写剧本:template_test.yaml,将A:ansible机器上的这个文件(存放在/opt/test.j2)复制到远程B、C机器上的/lianxi/test.sh文件中。

[root@sc-master opt]# cat template_test.yaml
- hosts: websertasks:- name: text testtemplate: src=/opt/test.j2 dest=/lianxi/test.sh

③ 执行剧本,并-e 指定name变量的值为sanchuang。-e "name=sanchuang".

[root@sc-master opt]# ansible-playbook template_test.yaml -e "name=sanchuang"
[WARNING]: Found variable using reserved name: namePLAY [webser] *****************************************************************************TASK [Gathering Facts] ********************************************************************
ok: [192.168.2.137]
ok: [192.168.2.132]TASK [text test] **************************************************************************
changed: [192.168.2.137]
changed: [192.168.2.132]PLAY RECAP ********************************************************************************
192.168.2.132              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.2.137              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

查看B、C机器上的文件:

B机器:

[root@sc-slave lianxi]# ls
ansible  test.sh
[root@sc-slave lianxi]# cat test.sh
#########################################################################
# File Name: test.sh
# Description: test.sh
# Author: lkong
# mail: lkong@tencent.com
# Created Time: 2022-08-21 17:24:54
#########################################################################
#!/bin/bash
hello  sanchuang
shanshan shi zhu

C机器上:

[root@nginx-kafka03 lianxi]# ls
aa  ansible  bb  cc  file_num.sh  lianxi  test.sh  tongle  xieshan
[root@nginx-kafka03 lianxi]# cat test.sh
#########################################################################
# File Name: test.sh
# Description: test.sh
# Author: lkong
# mail: lkong@tencent.com
# Created Time: 2022-08-21 17:24:54
#########################################################################
#!/bin/bash
hello  sanchuang
shanshan shi zhu

B、C机器上存有这个文件,并且name变量的值也为:sanchuang。就说明执行成功。

方式二:也可以去 使用个性化的方式:① 直接在/etc/ansible/hosts 文件里面配置name变量的值为sangchuang。

 [root@sc-master opt]# vim /etc/ansible/hosts25 [webser]                        26 192.168.2.132:22  name=sanchuang27 192.168.2.137:22 

然后在执行剧本:ansible-playbook template_test.yaml -e "name=sanchuang"

也可以生效。

ansible中的剧本playback详解相关推荐

  1. 大型企业中如何批量管理千万台服务器之ansible自动化运维工具详解 [⭐建议收藏⭐]

    文章目录 ansible 自动化运维工具 详解 关于作者 作者介绍 一.ansible 概述 1.1 ansible 概述 1.2 是什么要使用 ansible 1.3 ansible 功能 1.4 ...

  2. html5代码转换为视频,HTML5中的视频代码详解

    摘要 腾兴网为您分享:HTML5中的视频代码详解,智学网,云闪付,易推广,小红书等软件知识,以及360win10,流量魔盒,fitbit,上港商城,安卓2.3.7,全民惠,五年级下册英语单词表图片,t ...

  3. VMware虚拟机文件夹中各文件作用详解

    VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...

  4. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  5. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  6. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  7. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  8. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  9. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

最新文章

  1. 虚拟文件系统(VFS)
  2. 系统定制封装 step1
  3. 有关无人驾驶汽车的思考
  4. JMeter性能测试的基础知识和个人理解
  5. linux安装neo4j及远程访问
  6. 遇到 ORACLE 错误 1115,ORA-01114、ORA-27067错误案例一则
  7. 带你少走弯路:强烈推荐的Keras快速入门资料和翻译(可下载)
  8. 微信小程序点击按钮实现弹出模态框
  9. java转换汇编,请问如何把JAVA程序转为汇编?
  10. 爬虫登录获取cookie的难点
  11. VMware 安装LINUX系统(一)
  12. ​从程序员到 33 岁的亿万富翁
  13. app测试用例注意点
  14. 【ERP流程图】:生产制造
  15. QT实现的人机对战五子棋
  16. 多人共同在线文档协同编辑的技术实现
  17. 103000大写加零吗_金额大写前面要加零的有哪些
  18. 实现回到顶部功能的三种方法
  19. SNMP MIB库的介绍
  20. 上海到深圳的长途搬家认识到了农业民族和航海民族的差异

热门文章

  1. adroid studio 飞花令
  2. 主动保护——ACS汽车防撞安全保护器
  3. c语言车辆维修信息管理系统,汽车销售管理系统 C语言版及汽车维修管理制度汇编(45页)-原创力文档...
  4. Praat脚本-036 | Praat脚本批量为音频添加首尾静音段
  5. Databricks 第6篇:Spark SQL 维护数据库和表
  6. (二)车辆管理小系统
  7. 开源 AR 安卓APP:android AR app 开发及源码
  8. 复化辛甫生求积法matlab,数值分析习题.doc
  9. 火影忍者巅峰对决服务器维修中,火影忍者巅峰对决进不去怎么办 无法登录解决方法...
  10. Office之PPT中的动画旋转特效