Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

Ansible 是什么 ?

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括: (1)、连接插件connection plugins:负责和被监控端实现通信; (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机; (3)、各种模块核心模块、command模块、自定义模块; (4)、借助于插件完成记录日志邮件等功能; (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

Linux轻量级自动化运维工具— Ansible

ansible架构图

Linux轻量级自动化运维工具— Ansible

ansible特性

模块化:调用特定的模块,完成特定的任务;

基于Python语言研发,由Paramiko, PyYAML和Jinja2三个核心库实现;

部署简单:agentless;

支持自定义模块,使用任意编程语言;

强大的playbook机制;

幂等性;

安装及程序环境:

程序:

ansible

ansible-playbook

ansible-doc

配置文件:

/etc/ansible/ansible.cfg

主机清单:

/etc/ansible/hosts

插件目录:

/usr/share/ansible_plugins/

安装ansible

Linux轻量级自动化运维工具— Ansible

安装依赖包

Linux轻量级自动化运维工具— Ansible

ansible命令的使用:

Usage: ansible <host-pattern> [options]

常用选项:

-m MOD_NAME

-a MOD_ARGS

配置Host Inventory:

/etc/ansible/hosts

[group_id]

HOST_PATTERN1

HOST_PATTERN2

示例:

首先对此文件进行备份操作,以防后面需要用到默认配置文件

Linux轻量级自动化运维工具— Ansible

进入到/etc/ansible/hosts文件,此处绿色光标以下的内容是没有用的,都是示例,可以删除掉,然后添加我们下面实验操作用到的主机。

Linux轻量级自动化运维工具— Ansible

添加一组websrvs服务器,以用于下面的测试

Linux轻量级自动化运维工具— Ansible

测试主机连通性

这里报错是因为实验用的主机交换其他两台主机的公钥/私钥的原因导致的

Linux轻量级自动化运维工具— Ansible

实验SSH免密码登陆设置

生成私钥和公钥 ssh-keygen -t rsa -P ''

Linux轻量级自动化运维工具— Ansible

复制公钥文件问authorized_keys

Linux轻量级自动化运维工具— Ansible

把公钥传送到其他主机

Linux轻量级自动化运维工具— Ansible

在68的主机上面可以看见公钥已经传送过来了,并且确认文件的权限是否正确

Linux轻量级自动化运维工具— Ansible

重复以上操作把公钥发送给69的主机

Linux轻量级自动化运维工具— Ansible

然后重新执行ansible的ping模块命令查看该两台主机的连通性

可以发现此时已经成功,那么下面就开始介绍ansilbe的其他模块

Linux轻量级自动化运维工具— Ansible

最后记得利用ansible同步一下所有主机的时间,以免某主机的时间有错误,后面看日志起来会造成混乱

Linux轻量级自动化运维工具— Ansible

ansible模块:

获取模块列表:ansible-doc -l

获取指定模块的使用帮助:ansible-doc -s MOD_NAME

常用模块:

ping模块:探测目标主机是否存活;

Linux轻量级自动化运维工具— Ansible

示例:测试所有的主机的连通性

Linux轻量级自动化运维工具— Ansible

command模块:在远程主机执行命令;

Linux轻量级自动化运维工具— Ansible

示例1:让所有主机同步时间

此处没有给出指定的-m command命令,是因为ansible的模块默认就是command

Linux轻量级自动化运维工具— Ansible

示例2:让每一台主机都执行uname -r命令

Linux轻量级自动化运维工具— Ansible示例3:在主机上面都创建一个用户

Linux轻量级自动化运维工具— Ansible

查看两台主机是否已经创建该用户

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible查看用户信息:

Linux轻量级自动化运维工具— Ansible

帮这两个用户改密码,此处需要注意的是,虽然用下面的命令看似执行成功,但是当我们验证的时候,就会发现密码错误了,这是因为ansible的command模块并不支持管道等输出,所以下面介绍另外一个ansible的模块shell

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

shell模块 :在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等

注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;

Linux轻量级自动化运维工具— Ansible

示例:批量修改其他主机的特定用户的密码

Linux轻量级自动化运维工具— Ansible

此时可以发现已经可以登陆成功

Linux轻量级自动化运维工具— Ansible

copy模块:复制文件到远程主机

用法:

(1) 复制文件

-a "src='#'" "

(2) 给定内容生成文件

-a "content= dest= "

其它参数:mode, owner, group, ...

Linux轻量级自动化运维工具— Ansible

示例:复制文件到其他主机

此处创建一个测试文件

Linux轻量级自动化运维工具— Ansible

复制文件到其他主机

下面红色的报错信息是,如果要传送文件,该主机的指定目录需要存在,如果不存在,就是提示错误

Linux轻量级自动化运维工具— Ansible

创建对应的目录

Linux轻量级自动化运维工具— Ansible

重新传送文件,已经没有错误提示,但是此处也可以看见,如果文件已经存在,则原文件会被覆盖掉,并且此处也没有任何提示覆盖文件的信息,所以操作的时候就需要注意了,以免覆盖掉重要的文件

Linux轻量级自动化运维工具— Ansible

验证文件

Linux轻量级自动化运维工具— Ansible

file模块:设置文件的属性

用法:

(1) 创建目录:

-a "path= state=directory"

(2) 创建链接文件:

-a "path= src='#'" /p>

(3) 删除文件:

-a "path= state=absent“

Linux轻量级自动化运维工具— Ansible

示例:修改文件的权限和属主

Linux轻量级自动化运维工具— Ansible

验证文件

Linux轻量级自动化运维工具— Ansible

示例:创建文件的软连接

Linux轻量级自动化运维工具— Ansible

验证文件

Linux轻量级自动化运维工具— Ansible

设置文件的状态为absent(即删除文件)

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

fetch模块:从远程主机拿文件

Linux轻量级自动化运维工具— Ansible

示例:从10.1.156.69主机拿一个文件

Linux轻量级自动化运维工具— Ansible

当抓去一堆文件的时候,也会创建对应的ip地址的目录,以区分文件

Linux轻量级自动化运维工具— Ansible

cron模块 :管理计划任务条目

用法:

-a ""

minute=

hour=

day=

month=

weekday=

job=

name=

user=

state={present|absent}

Linux轻量级自动化运维工具— Ansible

示例:创建一个同步时间的计划任务,每5分钟同步一下服务器的时间

Linux轻量级自动化运维工具— Ansible

验证任务

Linux轻量级自动化运维工具— Ansible

示例:删除计划任务

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

hostname模块:管理主机名

用法:

name=

Linux轻量级自动化运维工具— Ansible

示例:修改主机名

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

yum模块:使用yum命令完成程序包管理

用法:

-a ""

(1) name= state={present|latest}

(2) name= state=absent

Linux轻量级自动化运维工具— Ansible

示例:安装指定包

此实验,首先,确定主机的yum源是可用的,否则实验会失败

Linux轻量级自动化运维工具— Ansible

安装samba包

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

删除samba安装包

Linux轻量级自动化运维工具— Ansible

已经没有安装的字眼了

Linux轻量级自动化运维工具— Ansible

service模块:服务管理

用法:

-a ""

name=

state=

started

stopped

restarted

enabled=

runlevel=

Linux轻量级自动化运维工具— Ansible

示例:开启主机的httpd服务

首先我们确认httpd服务是关闭的

Linux轻量级自动化运维工具— Ansible

开启httpd服务,并且设置为开机启动

Linux轻量级自动化运维工具— Ansible

验证,80端口已经开启

Linux轻量级自动化运维工具— Ansible

group模块:增加或删除组

用法:

-a ""

name=

state=

system=

gid=

Linux轻量级自动化运维工具— Ansible

示例:添加一个组

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

删除组

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

user模块:用户管理

使用格式:

name= : 创建的用户名

state= : present新增,absent删除

force= : 删除用户的时候删除家目录

system= : 创建系统用户

uid= : 指定UID

shell= : 指定shell

home= : 指定用户家目录

Linux轻量级自动化运维工具— Ansible

示例:增加一个系统用户

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

删除用户

Linux轻量级自动化运维工具— Ansible

setup模块:收集主机里面的各种信息

Linux轻量级自动化运维工具— Ansible

示例:收集所有主机的信息

Linux轻量级自动化运维工具— Ansible

YAML 一种数据序列化工具的语言格式

YAML is a data serialization format designed for human readability and interaction with scripting languages.

Linux轻量级自动化运维工具— Ansible

数据结构:

key:value

- item1

- item2

- item3

例如{name:jerry, age:21}

PlayBook

核心元素:

Tasks:任务,由模块定义的操作的列表;

Variables:变量

Templates:模板,即使用了模板语法的文本文件;

Handlers:由特定条件触发的Tasks;

Roles:角色;

playbook的基础组件:

Hosts:运行指定任务的目标主机;

remote_user:在远程主机以哪个用户身份执行;

sudo_user:非管理员需要拥有sudo权限;

tasks:任务列表

模块,模块参数:

格式:

(1) action: module arguments

(2) module: arguments

运行playbook,使用ansible-playbook命令

(1) 检测语法

ansible-playbook --syntax-check /path/to/playbook.yaml

(2) 测试运行

ansible-playbook -C /path/to/playbook.yaml

--list-hosts

-list-tasks

--list-tags

(3) 运行

ansible-playbook /path/to/playbook.yaml

-t TAGS, --tags=TAGS

--skip-tags=SKIP_TAGS

--start-at-task=START_AT

示例1:定义一个playbook任务来新增用户和组

定义一个yaml的模板

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

查查语法有没有错误,没有提示即表示语法应该没有问题。

Linux轻量级自动化运维工具— Ansible

测试运行看看,-C表示仅测试跑一边,但是不会实际操作

Linux轻量级自动化运维工具— Ansible

也可以单独测试某些特定的选项

查看仅影响的主机

Linux轻量级自动化运维工具— Ansible

查看运行哪些任务

Linux轻量级自动化运维工具— Ansible

查看哪个任务打标了,这里并没有任何任务打标记,后面再演示

Linux轻量级自动化运维工具— Ansible

以上没有错误,开始正式运行该任务

Linux轻量级自动化运维工具— Ansible

验证

Linux轻量级自动化运维工具— Ansible

示例2:定义一个playbook任务来修改文件端口

Linux轻量级自动化运维工具— Ansible

此步骤里面有安装httpd的安装包,其实此处有点多余,因为测试的两台主机均已经安装该服务,此处添加上去是为了演示效果,因为当生产环境中,假如存在一台服务器没有该安装包,那么次处就能帮我们安装上去,不然的话,漏了这一步,到后面查原因也挺麻烦的

Linux轻量级自动化运维工具— Ansible

检查语法问题

Linux轻量级自动化运维工具— Ansible

先从一台主机上面把httpd.conf文件拷问来编辑

Linux轻量级自动化运维工具— Ansible

修改httpd.conf文件

比如修改端口为8080,其他都为默认配置

Linux轻量级自动化运维工具— Ansible

首先备份好各自主机里面的配置文件,以防后面出错

Linux轻量级自动化运维工具— Ansible

检查备份是否成功

Linux轻量级自动化运维工具— Ansible

测试运行web.yml,看看有没有问题,没有问题的话就正常运行

Linux轻量级自动化运维工具— Ansible 执行改文件

Linux轻量级自动化运维工具— Ansible

验证服务器端口打开没有,可以看见8080端口已经打开,实验成功。

Linux轻量级自动化运维工具— Ansible

Handlers的使用:由特定条件触发的Tasks;

格式:

tasks:

- name: TASK_NAME

module: arguments

notify: HANDLER_NAME

handlers:

- name: HANDLER_NAME

module: arguments

示例:参照上面的例子继续修改apache的端口

修改端口号为8090

Linux轻量级自动化运维工具— Ansible

修改原来的web.yml脚本实现操作

Linux轻量级自动化运维工具— Ansible

检测语法

Linux轻量级自动化运维工具— Ansible

测试运行,可以看出,当复制文件过去的时候,会触发到restart httpd service的handlers任务,所以任务就重启了,而不是启动

Linux轻量级自动化运维工具— Ansible

正式运行

Linux轻量级自动化运维工具— Ansible

验证结果,8090端口已经打开,实验成功

Linux轻量级自动化运维工具— Ansible

tags:给指定的任务定义一个调用标识;

使用格式:

- name: NAME

module: arguments

tags: TAG_ID

示例:执行特定的tags

修改文件的端口为8088

Linux轻量级自动化运维工具— Ansible

在此前的配置文件上面插入一个标签instconf

Linux轻量级自动化运维工具— Ansible

检查语法

Linux轻量级自动化运维工具— Ansible

此处可以查看到该yml脚本有一个标签,影响着websrvs组

Linux轻量级自动化运维工具— Ansible

测试运行

Linux轻量级自动化运维工具— Ansible

正式运行一下,指定以instconf的标签运行,所以此处不会显示器其他多余的信息,包括安装httpd包和启动httpd服务

Linux轻量级自动化运维工具— Ansible

验证该结果

Linux轻量级自动化运维工具— Ansible

此处也可以对同一个文件标记多个标签同时执行

Linux轻量级自动化运维工具— Ansible

测试运行,因为此处已经安装了httpd包和文件已经复制过去,所以都是绿色,此处就演示到这里,其他步骤可以参考上面的操作

Linux轻量级自动化运维工具— Ansible

Variables:变量

类型:

内建:

(1) facts

自定义:

(1) 命令行传递;

-e VAR=VALUE

(2) 在hosts Inventory中为每个主机定义专用变量值;

(a) 向不同的主机传递不同的变量 ;

IP/HOSTNAME variable_name=value

(b) 向组内的所有主机传递相同的变量 ;

[groupname:vars]

variable_name=value

(3) 在playbook中定义

vars:

- var_name: value

- var_name: value

(4) Inventory还可以使用参数:

用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;

ansible_ssh_host

ansible_ssh_port

ansible_ssh_user

ansible_ssh_pass

ansible_sudo_pass

...

(5) 在角色调用时传递

roles:

- { role: ROLE_NAME, var: value, ...}

变量调用:

{{ var_name }}

示例1:利用命令行传递变量来安装不同的包

Linux轻量级自动化运维工具— Ansible

此处{{ pkgname }}表示为一个变量

Linux轻量级自动化运维工具— Ansible

检查一下语法,居然报错了,什么情况?仔细看了即便发现是漏了空格

Linux轻量级自动化运维工具— Ansible

加上空格

Linux轻量级自动化运维工具— Ansible

再次检查,还是还是有报错的情况,各位不要慌,因为这只是因为还没有给变量赋值才会报的错,所以此处报错是很正常

Linux轻量级自动化运维工具— Ansible

给变量赋值再跑一遍,此时就不会报错

Linux轻量级自动化运维工具— Ansible

修改一下变量,发现也是正常的,此处68因为已经安装过vsftpd所以就不会执行,所以并不会changed

Linux轻量级自动化运维工具— Ansible

示例2:在playbook中定义变量

Linux轻量级自动化运维工具— Ansible

测试,也没有问题的

Linux轻量级自动化运维工具— Ansible

思考?假如同时利用-e的参数传递一个变量的参数的话会怎么样?

测试结果如下,是-e传递的变量参数的优先级更高,这样的话能避免传递参数的时候,因为文本里面定义的优先级更高而出错?

Linux轻量级自动化运维工具— Ansible

示例3:在hosts Inventory中为每个主机定义专用变量值

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

删除掉文档里面原有的变量

Linux轻量级自动化运维工具— Ansible

测试,没有问题

Linux轻量级自动化运维工具— Ansible

示例4:在hosts Inventory中为每个主机定义专用变量值的第二种方法

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

测试,也是可以的

Linux轻量级自动化运维工具— Ansible

Templates :模板,文本文件,内部嵌套有模板语言脚本(使用Jinja2模板语言编写)

Linux轻量级自动化运维工具— Ansible

Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.

Linux轻量级自动化运维工具— Ansible

语法:

字面量:

字符串:使用单引号或双引号;

数字:整数、浮点数;

列表:[item1, item2, ...]

元组:(item1, item2, ...)

字典:{key1:value1, key2:value2, ...}

布尔型:true/false

算术运算:

+, -, *, /, //, %, **

比较操作:

==, !=, >, <, >=, <=

逻辑运算:and, or, not

执行模板文件中的脚本,并生成结果数据流,需要使用template模块;

template:

-a " "

src=

dest=

mode=

onwer=

group=

注意:此模板不能在命令行使用,而只能用于playbook;

示例:利用templates模板来设置nginx的定义cpu的数量

首先利用ansible命令获取当前系统系统的cpu数量

Linux轻量级自动化运维工具— Ansible

首先备份一下默认的文件

Linux轻量级自动化运维工具— Ansible

首先在下面的主机传送一个配置文件过来

Linux轻量级自动化运维工具— Ansible

编辑该文件,修改此处为上面利用ansible的setup模块获取的名称

重命名该文件为Jinja2格式后缀的文件

Linux轻量级自动化运维工具— Ansible

新建一个playbook文件,为了演示,建立一个ngxsrvs组,虽然看上去都一样。。。

Linux轻量级自动化运维工具— Ansible

建立playbook文档

Linux轻量级自动化运维工具— Ansible

此处为了演示效果,此处把原来的nginx包卸载掉

Linux轻量级自动化运维工具— Ansible

确认安装包卸载掉,并且服务没在线

Linux轻量级自动化运维工具— Ansible

检查playbook的文件有没语法错误

Linux轻量级自动化运维工具— Ansible

测试运行,此处报错是因为找不到nginx的服务,所以应该是没有问题的

Linux轻量级自动化运维工具— Ansible

正式运行,没有问题

Linux轻量级自动化运维工具— Ansible

查看一下端口是否已经打开

Linux轻量级自动化运维工具— Ansible

重点检查一下cpu的变量是否有改变,这里可以看到,跟我们ansible_processor_vcpus的值是一样,这样符合我们预期,此处就展示完毕

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

 

条件测试 :when语句:在tasks中使用,Jinja2的语法格式;

示例:利用Ansible条件测试在CentOS_6和CentOS_7的启动服务

这边首先增加一台ip为10.1.156.70的CentOS7的主机

Linux轻量级自动化运维工具— Ansible

然后我们利用setup模块的命令

Linux轻量级自动化运维工具— Ansible

在7的上面可以找到该行

Linux轻量级自动化运维工具— Ansible

在6的上面可以找到该行

Linux轻量级自动化运维工具— Ansible

根据以上的信息,我们就可以创建一个基于条件判断的playbook文件test.yml

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

为了演示效果,实验前把CentOS6的nginx先卸载掉,此处70的报错只是因为ssh缺少那边没有提供公钥文件,此处就不再演示

Linux轻量级自动化运维工具— Ansible

检查playbook语法有没有问题

Linux轻量级自动化运维工具— Ansible

测试运行,没有报错,可以看出当执行service nginx start命令时候,只有CentOS6的主机执行了命令,不过开始那里提示有skipping信息是为什么?CentOS7开始也提示有skipping信息?但是后面确实是执行成功了,下面正式运行该playbook看看效果。

Linux轻量级自动化运维工具— Ansible

正式运行,似乎没有报什么错误

Linux轻量级自动化运维工具— Ansible

看看服务是否已经开启,此处可见80端口已经开发,应该是没有问题的,此处就不浏览主页做测试了

Linux轻量级自动化运维工具— Ansible

循环 :迭代,需要重复执行的任务;

对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;

元素:列表

字符串

字典

基于字符串列表给出元素示例:

示例:基于列表的方式安装多个安装包

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

检查语法

Linux轻量级自动化运维工具— Ansible

测试运行,没有报错(这里就以69和70两台不同的版本的CentOS来做测试)

Linux轻量级自动化运维工具— Ansible

正式运行,69的机器报错了,看了一下原因,是下载php-mbstring的时候出错了,此处原因应该是虚拟挂载CentOS6.8的cd1导致的,挂载cd2应该就解决此问题,不过部分安装包应该是在cd1里面,所以小伙伴们最好找一个安全包都全的yum仓库

Linux轻量级自动化运维工具— Ansible

重新配置好yum仓库,并且把先前安装的先卸载掉,以配置实验

Linux轻量级自动化运维工具— Ansible

此处可以看出来,由于69主机刚报错了一个,所以所有的包都没有安装,7上面倒是都已经安装过了

Linux轻量级自动化运维工具— Ansible

重新运行脚本,没有报错了

Linux轻量级自动化运维工具— Ansible

验证,发现已经安装上了,此处就不再看其他安装包的安装情况了,应该没有大问题

Linux轻量级自动化运维工具— Ansible

基于字典列表给元素示例:

示例:创建指定的用户并属于指定的组

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

检查语法

Linux轻量级自动化运维工具— Ansible

测试运行,没有提示有任何变化?

Linux轻量级自动化运维工具— Ansible

正式运行,可以看见创建了对应的用户和组

Linux轻量级自动化运维工具— Ansible

验证,符合我们预期

Linux轻量级自动化运维工具— Ansible

角色:roles

以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;

role_name/

files/:存储由copy或script等模块调用的文件;

tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;

vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;

templates/:存储由template模块调用的模板文本;

meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

在playbook中调用角色的方法:

- hosts: HOSTS

remote_user: USERNAME

roles:

- ROLE1

- ROLE2

- { role: ROLE3, VARIABLE: VALUE, ...}

- { role: ROLE4, when: CONDITION }

示例:创建对应的服务目录下面的模版

Linux轻量级自动化运维工具— Ansible

首先创建对应的目录

Linux轻量级自动化运维工具— Ansible

确认一下目录是否正确

Linux轻量级自动化运维工具— Ansible

首先准备一个安装包,放到nginx/file/目录下面

Linux轻量级自动化运维工具— Ansible

新建一个nginx的task模板

Linux轻量级自动化运维工具— Ansible

大家可以发现此处的模板跟之前的不一样,比如说,开头没有了定义主机、用户、和task等,此处的task会自行查找/etc/ansible/roles/nginx/task/main.yml的任务(此处文件本身也是在task目录下面)。再比如说,该处指定的copy命令的src=FILENAME也是相对路径,其绝对路径为/etc/ansible/roles/nginx/file/FILENAME。又比如说定义了notify但是这里并没有handlers,是因为此处定义了的notify的名字会自行去查看该目录下面即/etc/ansible/roles/nginx/handlers/main.yml里面的handlers。还有template那里,大家有没发现也是用的相对路径,此处绝对路径为在/etc/ansible/roles/nginx/template/nginx.conf.j2。所以大家清楚了吗?

Linux轻量级自动化运维工具— Ansible

接着是定义/etc/ansible/roles/nginx/handlers/main.yml

Linux轻量级自动化运维工具— Ansible

此处的文件就是用来承上面的notify里面为什么没有定义的handlers的原因,因为已经定义在../handlers/main.yml里面了。

Linux轻量级自动化运维工具— Ansible

复制nginx.conf文件到templates目录下面为nginx.conf.j2

Linux轻量级自动化运维工具— Ansible

编辑里面定义的cpu数量,之前是2,所以此处我们也可以利用算数表达式来控制cpu的数量,比如此处-1,到时候看到的cpu数量应该是为1。

Linux轻量级自动化运维工具— Ansible

再复制/etc/nginx/conf.d/default.conf到nginx/templates/default.conf.j2

Linux轻量级自动化运维工具— Ansible

然后编辑此文件

Linux轻量级自动化运维工具— Ansible

编辑原来的端口号为一个变量值ngxport

Linux轻量级自动化运维工具— Ansible

此时需要重新编辑task/main.yml文件

Linux轻量级自动化运维工具— Ansible

主要添加一下内容

Linux轻量级自动化运维工具— Ansible

此时我们就可以定义变量文件了

Linux轻量级自动化运维工具— Ansible

比如说定义ngxport的变量为8888

Linux轻量级自动化运维工具— Ansible

此时所有的元素暂时都足够了,meta和default的文件夹在此处暂时用不上,然后我们在/etc/ansible/目录下面创建一个nginx.yml的文件

Linux轻量级自动化运维工具— Ansible

注意此处的roles里面的nginx要在/etc/ansible.cfg文件里面有对应的设定

 

编辑查看ansible.cfg文件

Linux轻量级自动化运维工具— Ansible

可以看见系统默认的roles路径也是在此处,所以我们去掉#号来启用它

Linux轻量级自动化运维工具— Ansible修改成如下

Linux轻量级自动化运维工具— Ansible

以上都准备好了以后,检查一下nginx.yml语法,暂时并没有报错

Linux轻量级自动化运维工具— Ansible

然后测试运行,可以看见此处报错了,看了一下报错的原因,是因为找不到/tmp/nginx安装包,因为只是测试运行,并没有传送安装包到目标主机上面,所以此处报错是正常的可以不予理会。

Linux轻量级自动化运维工具— Ansible

下面正式运行该脚本,此处报错了,原因看了一下,nginx安装包是el7版本的,在centos6上面并不能安装。以及handlers出问题了。

Linux轻量级自动化运维工具— Ansible

此处修改一下tasks/main.yml,以下红色内容为修改部分,意思就是,CentOS7系统从远程复制的安装包安装,CentOS6则直接从yum仓库源安装,6和7的nginx的配置文件应该是一样的,暂时先这么操作实验看看结果,并且先把CentOS7系统的nginx安装包删除掉,以重新演示效果。notify处的语法错误,此处补上。

Linux轻量级自动化运维工具— Ansible

修改完以上的内容,重新测试运行

可以看出来此处还是有报错内容,

第一个报错内容为找不到安装包,此处是正常的,因为安装包还是传过去(上一次运行的时候传送过去的安装包我已经删掉了,所以此处需要重传)

第二个报错内容为找不到nginx服务,此处也是正常的,因为nginx安装包还没有安装

Linux轻量级自动化运维工具— Ansible

正常重新运行一下nginx.yml脚本看看,发现已经没有报错的地方了

Linux轻量级自动化运维工具— Ansible

验证结果,发现8888端口已经打开

Linux轻量级自动化运维工具— Ansible

cpu数量的设置也跟我们之前配置的是一样的,实验到此结束

Linux轻量级自动化运维工具— Ansible

示例 2: 根据以上内容,修改端口号

当我们写好模板以后,需要修改端口号,也是非常容易的,而且我们也可以通过在nginx.yml上面通过roles传递变量

Linux轻量级自动化运维工具— Ansible

例如像以下这样子操作

Linux轻量级自动化运维工具— Ansible

测试运行一下看看有没有错误,可以看见在复制配置文件和重启服务那里有了变化,这符合我们预期

Linux轻量级自动化运维工具— Ansible

正式运行一下看看,能正常运行

Linux轻量级自动化运维工具— Ansible

验证端口号是否修改成功,看到8080端口,表示操作没有问题

Linux轻量级自动化运维工具— Ansible

以上是运行成功了,但是细心的同学会发现,这样所有程序都跑一遍也麻烦,所以我们可以用之前了解到的标签来执行特定的操作即可,也可以直接传递相应的变量。

Linux轻量级自动化运维工具— Ansible

直接传递参数测试运行,好像没有问题

Linux轻量级自动化运维工具— Ansible

正式运行

Linux轻量级自动化运维工具— Ansible

查看端口号是否正确,此处可以看见是我们定义的8099端口,测试成功

Linux轻量级自动化运维工具— Ansible

示例:实现 httpd 不同主机不同的端口号

首先先把定义的端口号先屏蔽掉

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

编辑/etc/ansible/hosts文件

Linux轻量级自动化运维工具— Ansible

定义对应的端口号,然后测试

Linux轻量级自动化运维工具— Ansible

然后记得把nginx.yml文件里面也改回来

Linux轻量级自动化运维工具— Ansible

这里直接运行就不先做测试了,不过一般同学们还是做好测试工作比较好,本人比较懒O.O

Linux轻量级自动化运维工具— Ansible

验证端口号,也符合我们预期

Linux轻量级自动化运维工具— Ansible

示例:在同一个 yml 配置文件里面运行两个服务模板程序

这里以memcached为例,首先复制memcached的配置文件到对应的templates目录下来为.j2的文件

Linux轻量级自动化运维工具— Ansible

memcached服务是依靠设置内存参数来定义的,所以我们得首先用ansible来确认系统的内存变量参数值是什么,并且通过以下图可以看见两个系统参数都是一致的。

Linux轻量级自动化运维工具— Ansible

编辑memcached.j2文件

Linux轻量级自动化运维工具— Ansible

定义变量参数

Linux轻量级自动化运维工具— Ansible改成 Linux轻量级自动化运维工具— Ansible

开始定义memcached的任务文件

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

定义handlers文件

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

把memcached定义在ngnix.yml文件一同运行

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

测试运行,只是安装包还没有安装,提示的错误都问题不大,是正常的

Linux轻量级自动化运维工具— Ansible

正式运行

Linux轻量级自动化运维工具— Ansible

验证服务是否开启,且是否设置好预期可用内存

可以看见11211端口已经打开

Linux轻量级自动化运维工具— Ansible

查看可用内存,原来的数值是970~980多,这里200多,符合除以4的预期效果

Linux轻量级自动化运维工具— Ansible

示例 : 根据不同的系统安装 mysql 包

首先定义一个tasks的模板

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

定义一个yaml调用角色脚本

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

设置hosts文件添加dbsrvs组

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

测试语法

Linux轻量级自动化运维工具— Ansible

测试运行调用角色脚本db.yml,应该没有大问题

Linux轻量级自动化运维工具— Ansible

正式运行,没有报任何错误

Linux轻量级自动化运维工具— Ansible

验证服务是否已经开启

可以看见mysql和mariadb服务均已经开启

Linux轻量级自动化运维工具— Ansible

写在最后,关于ansible的能最多控制几台主机

此处是在配置文件里面定义的,默认是5台主机,如果把主机的控制的主机调大,估计也要相对应性能的主机当ansible服务器

Linux轻量级自动化运维工具— Ansible

Linux轻量级自动化运维工具— Ansible

至此,本博文已经完结,下面总结几个小点:

1、 ansible的playbook.yml文件要求的格式比较严格,有时候少了几个空格,或者空格位置不妥当的时候,系统均默认此格式为错误,所以需要小心

2、 有时候输入错了ansibile不能识别的错误,用- - syntax-check 或者 �Ccheck 测试文件的时候并不会提示有任何提示,需要实际运行才能会报错。

3、 有一次写playbook.yml文件的时候,检查过是没有问题,但是测试一直出问题,后来把所有重写一遍就好,也可能是哪里错了自己没看见。