Ansible实践篇(四):Ansible PlayBook应用,ansibleplaybook


Ansible实践篇(四):Ansible PlayBook应用

  • Ansible实践篇(四):Ansible PlayBook应用
    • 一、PlayBook的作用
    • 二、PlayBook组成及参数详解
      • 1、PlayBook组件包括
      • 2、target常用参数详解
      • 3、variable常用参数详解
      • 4、task常用参数详解
    • 三、YAML语言特性
    • 四、Ansible PlayBook示例
      • (1)判断是否需要安装某个服务
      • (2)PlayBook远程修改配置文件
      • (3)PlayBook自定义模版

一、PlayBook的作用

之前的模块都是使用Ad-hoc方式(Ad-hoc方式是一种可以快速输入的命令,而且不需要保存起来的命令,相当于bash中的一句话shell)点对点命令执行,可以管理远程主机,但如果服务器数量比较多,配置信息也比较多,可以利用Ansible PlayBook编写剧本,以更加简便的方式实现任务处理的自动化和流程化。

二、PlayBook组成及参数详解

PlayBook是由一个或多个“play”组成的列表,play的主要功能是为Ansible中的task定义好的角色,指定剧本对应的服务器组。
相当于task是一个任务,task调用Ansible的各种模块,将多个play组织在一个playbook剧本中,全部组成一个完整的流程控制集合

1、PlayBook组件包括

  • target:定义PlayBook的远程主机组
  • variable:定义PlayBook使用的变量
  • task:定义远程主机上执行的任务列表
  • handler:定义task执行完成后需要调用的任务,例如修改配置文件之后,启动跟handler任务重启相关联的服务

2、target常用参数详解

  • hosts:定义远程主机组
  • user:执行该任务的用户
  • sudo:设置为yes的时候,执行任务使用root权限
  • sudo_user:指定sudo的普通用户
  • connection:默认基于SSH链接客户端
  • gather_facks:获取远程主机facts基础信息

3、variable常用参数详解

  • vars:定义格式,变量名:变量值
  • vars_files:指定变量文件
  • vars_prompt:用户交互模式自定义变量
  • setup:模块取远程主机的值

4、task常用参数详解

  • name:任务显示名称也是屏幕显示信息
  • action:定义执行的动作
  • copy:复制本地文件到远程主机
  • template:复制本地文件到远程主机,可以引用本地变量
  • service:定义服务的状态

基于Ansible PlayBook还可以收集命令、创建任务集,可以大大降低管理工作的复杂程度,PlayBook采用YAML语法结构

三、YAML语言特性

YAML(yet another markup language)是一种直观的能被电脑识别的数据序列化格式,是一个容易阅读,和脚本语言交互,用来表达资料序列的编程语言。YAML使用空白字符和分行来分隔资料,适合用Python、Ruby、Perl、grep来操作。

YAML语言特性为:

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

四、Ansible PlayBook示例

(1)判断是否需要安装某个服务

检测远程主机是否由apache服务,不存在则安装apache httpd服务,安装完成后并启动apache
1.1 编写脚本
PlayBook代码如下,文件名是xxx.yml

在远程服务器上,是172.25.70.1没有apache服务,172.25.70.2有apache服务
#apache.yml
---

- hosts: all
  user: root 

  tasks:
    - name: Apache server Install
      yum: name=httpd state=installed
      notify:
        - start httpd

  handlers:
    - name: start httpd
      service: name=httpd state=started enabled=yes

根据yaml语言逐步分析语法:
第一行#apache.yml就是一个注释,表示这段是什么,当然可有可无
第二行---,这是YAML将文件解释为正确的文档的要求。YAML允许多个文档在同一个文件中,不同的文档就是用---分隔开
接下来是

- hosts: all
  user: root        ##这里也可以写成remote_user,都是表示在远程服务器上用哪个用户执行

以 - 开头的项目被视为列表项目。作为散列或字典操作,它具有key:value格式的项。它在最左侧的级别,它也是一个Ansible“palys”(某个任务)。plays基本上是在某一组主机上执行的任务组,以允许它们实现要分配给它们的功能。每个play必须指定一个主机或一组主机,正如上面一样,指定了all 所有主机。也指定了使用的是哪个用户

然后就是任务了,这里只写了一个task

  tasks:
    - name: Apache server Install
      yum: name=httpd state=installed
      notify:
        - start httpd

ay包含了一个tasks列表(任务列表)。任务列表中的各任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。在自上而下运行某playbook时如果中途发生错误,所有已执行任务都将回滚,因此在更正playbook后重新执行即可。

  • 第一个“name”,这是对于任务的描述,可以任意定义
  • 下一个key给的是yum,表示引用Ansible的yum模块,后面表示使用yum模块的哪些参数,这个就相当于之前执行的ansible all -m yum -a "name=httpd state=installed"命令,两者作用相同
  • notify 可以看到它包含了一个具体项目的列表,这里表示的是“start httpd”,这个不是ansible的命令,而是对handlers的引用,它可以执行某些功能,在handlers中里面定义

接下来就是handlers的定义

  handlers:
    - name: start httpd
      service: name=httpd state=started enabled=yes

可以看到handlers其实是和hosts、user以及tasks是同一个级别的,它表示只有在客户端发生了任务时才会去执行它,这里就比如说某一个客户端本来没有安装httpd命令,发生了tasks里面执行的安装httpd命令,那么这个客户端才会去执行这个“start httpd”,如果还有一个客户端本身已经安装了httpd命令,所以他就不会执行安装命令,那么“start httpd”也不会执行
第二行service就表示引用了ansible的service模块,使用的参数是冒号后面的内容

1.2 执行脚本
脚本写完了之后,直接用ansible-playbook xxx.yml执行即可,YAML语言对于格式非常严格,尤其是空格什么的,同一级别的,只有相同的空格键,这个文件才可以执行,我做的时候,四个空格,有的是按4个空格键,有的直接按了tab键,结果显示是会报错的 。。。

因为这里的文件名是apache.yml,所以,我的执行结果是

(2)PlayBook远程修改配置文件

安装好了之后,我们可以把http的发布页面从本地发送给远程服务器上面去
这是只需要在tasks里面添加一个任务即可
代码如下:

#apache.yml
---

- hosts: all
  user: root

  tasks:
    - name: Apache server Install
      yum: name=httpd state=installed
      notify:
        - start httpd
    - name: Apache server index.html Update
      copy: src=/mnt/index.html dest=/var/www/html/ mode=644

  handlers:
    - name: start httpd
      service: name=httpd state=started enabled=yes

index.html内容为:

执行结果为:

最终测试结果:

(3)PlayBook自定义模版

Ansible PlayBook还可以自定义template模版文件,模板文件主要是用于服务器需求不一致、需要独立定义的情况。
比如现在有一台服务器本身已经有了apache并且占了80端口,但是现在也要安装nginx服务,那么这时就需要修改它的nginx的端口,比如说修改为81,但其他的主机并没有apache服务,所以其他的nginx可以直接用80端口。这种情况使用template就可以轻松实现

因为前面的实验,所以我的两台测试机都有了apache服务,那么为了完成这个实验,我用ansible 172.25.70.1 -m yum -a "name=httpd state=absent"这个命令先卸载了一台的httpd服务,或者直接准备一台新的主机就可以

过程为:

现在我的环境是两台后端服务器机器,172.25.70.1的80端口是没有被占用的
172.25.70.2已经开启了apache服务80端口已经被占用,现在要安装nginx,打算把端口改为81

 1.修改ansible的hosts文件,在里面指定不同的服务器启动不同的httpd_port端口
[root@localhost ansible]# vim hosts 
[db]
172.25.70.1 httpd_port=80
172.25.70.2 httpd_port=81

2.Ansible创建一个nginx.conf.bak的模版文件,这个是本地nginx的nginx.conf文件的复制,修改里面的listen 80为listen {{httpd_port}},其他配置不变

[root@localhost ansible]# vim /mnt/nginx.conf.bak       ##这里把它复制到了本地/mnt/目录里面
 35     server {
 36         listen       {{httpd_port}};
 37         server_name  localhost;

3.创建playbook剧本yaml文件,代码为
[root@localhost ansible]# vim nginx.yml
---
- hosts: all
  remote_user: root

  tasks:
    - name: Nginx Server Install
      file: path=/usr/local/nginx state=directory
      notify:
        - nginx install
        - nginx config
        - nginx start

  handlers:
    - name: nginx install
      shell: cd /tmp; tar xzf nginx-1.12.0.tar.gz; cd nginx-1.12.0; ./configure --prefix=/usr/local/nginx; make; make install
    - name: nginx config
      template: src=/mnt/nginx.conf.bak dest=/usr/local/nginx/conf/nginx.conf
    - name: nginx start
      shell: /usr/local/nginx/sbin/nginx

执行结果为:

测试结果为:可以看到172.25.70.1的默认80端口是nginx,因为我之前已经把它的apache卸载掉了,所以nginx安装了之后,默认nginx是80端口;而172.25.70.2的nginx是81端口,而80端口还是上面测试时的apache的index.html页面

相关内容

    暂无相关文章