ansible中的剧本playback详解

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: ansible中的剧本playback详解

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: 200
  remote_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   #或者all
  remote_user: root
  tasks:
  - name: upload file
    copy: src=/etc/passwd dest=/tmp/passwd_tmp
  - name: ip get
    shell: ip a
- hosts: nginx
  tasks:
  - name: shell tasks
    shell: 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: webserver
PLAY [webserver] ***************************************************************
skipping: no hosts matched
PLAY [webserver] ***************************************************************
skipping: no hosts matched
PLAY RECAP *********************************************************************

上传和删除文件。

root@b ~]# cat ansible_playbook_sc.yaml 
- hosts: all
  remote_user: root
  tasks:
  - name: up file
    copy: src=/etc/passwd dest=/tmp/passwd_tmp
  - name: download redis
    yum: name=redis state=installed
- hosts: webser
  tasks:
  - name: remove file
    shell: rm -rf /tmp/passwd_tmp

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

- hosts: all
  remote_user: root
  tasks:
  - name: yum nginx
    yum: name=nginx state=installed
  - name: copy sc.conf
    copy: src=/lianxi/sc.conf dest=/etc/nginx/conf.d/sc.conf
  - name: copy index
    copy: src=/lianxi/index.html dest=/opt/dist/
  - name: start nginx
    service: 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: web
  tasks:
  - name: template test
    template: 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: webser
  tasks:
  - name: text test
    template: 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: name
PLAY [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/hosts
 25 [webser]                        
 26 192.168.2.132:22  name=sanchuang
 27 192.168.2.137:22

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

也可以生效。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
Ansible之playbook剧本-1
Ansible之playbook剧本
97 0
|
10月前
Ansible之playbook剧本-3
Ansible之playbook剧本
53 0
|
10月前
|
Python
Ansible之playbook剧本-2
Ansible之playbook剧本
41 0
|
Kubernetes 安全 大数据
centos7操作系统 ---ansible剧本离线快速部署etcd集群
centos7操作系统 ---ansible剧本离线快速部署etcd集群
358 0
|
存储 XML JSON
金鱼哥RHCA回忆录:DO447使用Ansible与API通信--使用Ansible剧本与Api交互
第十一章 使用Ansible与API通信--使用Ansible剧本与Api交互
185 0
金鱼哥RHCA回忆录:DO447使用Ansible与API通信--使用Ansible剧本与Api交互
|
存储 运维 Linux
金鱼哥RHCA回忆录:DO447管理项目和开展作业--为ansible剧本创建一个项目
第九章 管理项目和开展作业--为ansible剧本创建一个项目
123 0
金鱼哥RHCA回忆录:DO447管理项目和开展作业--为ansible剧本创建一个项目
|
JSON 运维 关系型数据库
Ansible 自动化运维——剧本(playbook)
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。 ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules
Ansible 自动化运维——剧本(playbook)
|
Shell 网络安全 Apache
ansible playbook剧本编写以及综合案例详解(十二)
ansible playbook剧本 1.Ad-Hoc简介 Ad-Hoc其实是一个概念性的名字,是相对于写ansible playbook来说的,类似于命令行敲入shell命令和写shell脚本两者之间的关系。 如果我们敲入一些目录去比较快的完成一些事情,而不需要将这些命令保存下来,这样的命令叫做ad-hoc命令,说白了就是ansible的模块。
604 0
ansible playbook剧本编写以及综合案例详解(十二)
ansible 剧本部署配置nfs
ansible 剧本部署配置nfs
|
9月前
|
运维 Shell Linux
Ansible自动化运维工具之常用模块使用实战(5)
Ansible自动化运维工具之常用模块使用实战(5)