一文带你了解Ansible

Posted 新钛云服

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文带你了解Ansible相关的知识,希望对你有一定的参考价值。


一、Ansible简介

Ansible是一款方便运维管理资产的开源运维工具,已诞生多年,比较成熟。与SaltStack一样,都是基于Python语言开发而成的工具。但相对于SaltStack,Ansible不需要向服务器安装agent就能对服务器进行管理,还是很方便的。(当然,SaltStack现在也有salt-ssh可以实现这种功能,但是我整体体验,感觉并不好!)


二、Ansible使用

2.1 Ansible安装

Ansible安装起来非常简单。官网有非常详细的说明:
https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

在这里,我是在centos7的机器上安装的,具体操作如下:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install ansible

安装好后,可以使用ansible --version命令,查看Ansible的版本。


2.2 Ansible简单使用

ansible与saltstack中的salt-ssh很相似,都喜欢yaml文件充当主机清单文件。

随便举个例子:
ansible -i /hosts all -m shell -a "mkdir -p /root/test" -u root

上述命令就是一个简单的ansible示例,其作用就是向hosts文件中包含的服务器发送命令。
我们打开hosts,可以看到如下内容:
[centos]10.30.X.X:22 ansible_ssh_user=root ansible_ssh_pass='' ansible_sudo_pass=''

host.yaml文件中,包含了主机的IP、端口、用户名和密码,其中的centos是类似于组的一种标识,用户可以根据这种标识决定执行或不执行一些操作!

上面的参数操作,我们简单做个说明。


一文带你了解Ansible

更详细的参数说明,您可以使用ansible --help查看,这里不做说明!
该部分只介绍ansible的简单使用,下面我将分模块具体介绍Ansible。


三、Inventory

Ansible中,最核心的就是主机管理,而如何对用户繁多的主机进行管理,就需要引入Inventory这个概念了!

Inventory,就是主机清单。不管是用户自己的局域网主机、IDC机房主机、私有云或者公有云的服务器,当你想对它们进行操作或下达执行命令时,都需要使用Inventory。

简单点说,Inventory保存主机信息。我们上文说的hosts文件,就是一种Inventory。

ansible的默认Inventory文件是/etc/ansible/hosts,当然我们上文是没用默认的Inventory文件,而是自己指定的/hosts文件,这也很方便,直接加个-i参数即可。


3.1 主机方式使用


一文带你了解Ansible


如上图所示,是我们定义的Inventory文件。其中我们包含了两个主机。我们可以使用以下命令查看Inventory文件是否有效!
ansible -i /hosts all --list-hosts
结果如下:


一文带你了解Ansible


之后我们可以直接以主机IP的方式调用主机执行一些操作。
比如:
ansible -i /hosts 10.20.0.1 -m ping


3.2 主机组方式使用

主机组,顾名思义,是用户根据自己的习惯或喜好,把一些具有相同特质的主机进行分组处理。用户可以从各个维度随心所欲的进行分类,ansible没有对它进行任何限制。
下图就举个例子:


一文带你了解Ansible


很简单,上图中的centos6、centos7、dev、ops都是主机组名。和主机使用方式一样,使用主机组时,直接调用主机组名即可。


比如:

ansible -i /hosts centos6 -m ping


3.3 动态Inventory

inventory不仅仅只有静态文件,我们也可以动态的获取外部的主机数据。由于动态inventory不是这篇文章的重点,我们就不再赘述了。


3.4 参数说明


一文带你了解Ansible


四、 Ad-hoc

Ansible中操作主机主要有两种方式,ad-hoc和playbook。playbook主要作用于那些复杂、定期的操作上,而ad-hoc就主要作用于那些简单、临时的操作上。


Ad-hoc有点类似于linux上的一句话shell,通常情况下,ad-hoc用的还是很多的。毕竟,运维管理中,还是有许多的临时操作,没必要每次都写一个playbook去执行吧!


其实,归根结底,ad-hoc就是使用ansible的单个模块,操作主机实现单个功能。

具体使用方式:

ansible -i 【inventory文件路径】 【操作的对象】 -m 【模块名】 -a 【模块参数】


Ansible具有丰富的功能模块(module),基本满足运维操作的大部分需求。下面我就挑一些我们常用的module说明。


4.1 command模块


command模块是ansible提供的一种命令模块,允许执行一些简单的linux命令。但是不支持扩展的shell命令,比如管道和重定向。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m command -a 【模块参数】

举例:


一文带你了解Ansible


4.2 shell模块

上面的command模块受制于ansible,不能执行扩展的shell命令,但是shell模块却能执行。shell中管道、重定向等功能,该模块也支持。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m shell -a 【模块参数】

举例:

一文带你了解Ansible


4.3 script模块

该模块作用主要是执行管理主机的指定脚本。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m script -a 【模块参数】

举例:

一文带你了解Ansible


4.4 service模块

service模块。是ansible中一种操作service比较方便的模块。它类似于把centos6中的service和centos7中的systemctl等,这些管理服务包的工具结合为一体的存在。


简单说,假设你想开启一台centos6和一台centos7上nginx服务,大概你需要在centos6上执行service nginx start,并且在centos7上执行systemctl start nginx。而service模块,一条命令就行了:ansible all -m service -a "name=nginx state=started"。


当然,service还是有前提的。你想要操控的服务,必须能被BSD init,OpenRC,SysV,Solaris SMF,systemd,upstart中的任意一种工具所管理。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m service -a 【模块参数】


模块参数说明:

name参数:服务名称,比如:mariadb、nginx、saltstack等。

state参数:设置服务的状态,假设我们想开机某服务,则此参数可以设置为started。

具体值包括:started、stopped、restarted、reloaded。

enabled参数:是否将该服务设置为开机自启动项,yes表示设置为开机自启动,no则不设置为开机自启动。


举例:

一文带你了解Ansible


然后到目标服务器上查看该服务状态,的确启动了。


一文带你了解Ansible


4.5 cron模块

该模块是计划任务模块,相当于linux上的crontab功能。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m cron -a 【模块参数】


模块参数说明:

minute参数:分钟设定位,默认“*”,范围(0-59,/数字)

hour参数:小时设定位,默认“*”,范围(0-23,/数字)

day参数:日期设定位,默认“*”,范围(1-31,/数字)

month参数:月期设定位,默认“*”,范围(1-12,/数字)

weekday参数:周设定位,默认“*”,范围(0-6)

special_time参数:特殊时间范围,范围:reboot(重启时)、annually(每年)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每小时)。

name参数:定时任务名

user参数:指定以哪个用户身份执行

job参数:执行的命令

state参数:根据定时任务名,修改或删除对应的任务


4.6 user模块

user模块。管理和创建服务器的用户账号,或者删除用户。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m user -a 【模块参数】


模块参数说明:

name参数:指定用户名。

password参数:用户密码。

comment参数:描述信息。

group参数:指定基础用户组。

home参数:指定用户家目录。

createhome参数:是否创建家目录。

move_home参数:移动家目录。

shell参数:默认shell。

uid参数:指定用户uid。

state参数:默认为创建,设置为absent,表示删除。


4.7 group模块

group模块。管理和创建服务器的用户组,或者删除用户组。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m group -a 【模块参数】


模块参数说明:

name参数:指定用户组名。

gid参数:指定用户组gid。

state参数:默认为创建,设置为absent,表示删除。


4.8 file模块

file模块。文件模块,具备对文件或文件夹等对象操作的功能。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m file -a 【模块参数】


模块参数说明:

owner参数:用于指定被操作对象的用户,对应的用户必须在远程主机中存在!

group参数:用于指定被操作对象的用户组,对应的用户组必须在远程主机中存在!

mode参数:设置被操作对象的权限。

src参数:源文件,主要是用来创建软连接或者硬链接的。

path参数:被操作对象的路径,基本上是和state一起搭配使用的,必填。

state参数:该参数主要作用,就是对被操作对象执行相应的操作。具体:directory创建目录、file创建文件、link创建软连接、hard创建硬链接、touch创建空白文件、absent删除对象。


4.9 copy模块

copy模块。复制文件到远程主机,这是我最喜欢的ansible模块,因为它把文件从本地分发到远程服务器非常方便。


使用方式如下:

ansible -i 【inventory文件路径】 【操作的对象】 -m copy -a 【模块参数】


模块参数说明:

src参数:本地文件路径。

dest参数:远程文件路径。

content参数:文件内容,可以替代src,直接向远程文件写内容。

force参数:如果包含相同文件名文件,是否强制覆盖,yes覆盖,no不覆盖。

backup参数:如果包含相同文件名文件,将原文件覆盖之前,备份原文件,yes备份,no不备份。


举例:

一文带你了解Ansible


ansible还有其它丰富的模块,这里就不一一介绍了,感兴趣的朋友可以查阅ansible官网!


五、Playbook

上文,我们说了ad-hoc的基本使用。

但是在运维工作中,不可能都是这种单一模块的操作,更多的是需要多个模块协同完成运维操作!


我们假设一个模块就是一个task,那么playbook就相当于多个task组合起来的组织。


基础参数:

Hosts:执行任务(task)的远程目标主机。

remote_user:执行任务,所使用的用户。

tasks:任务。

handlers:通知任务,与tasks不同,只有在接受到通知时,才会被触发执行。

templates:使用模板语言的文本文件,使用jinja2语法书写。

variables:变量,变量替换{{ variable_name }}。


5.1 编写Playbook


v im hello.yml
一文带你了解Ansible
该脚本是向目标机器的tmp下写入hello.log文件。


5.2 执行Playbook


一文带你了解Ansible

执行成功,我们去目标机器看,/tmp/hello.log文件是否写入。

一文带你了解Ansible
文件写入,说明我们的playbook执行成功!


六、Tower

6.1 Tower安装

Tower是Ansible官方提供的一款管理ansible的前端dashboard页面工具。


下载:

https://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz?sc_cid=701f20000012w8YAAQ


解压:

解压后修改其中的inventory文件,修改其中的admin/pg/rabbitmq的密码。


一文带你了解Ansible


安装:

./setup.sh


6.2 Tower使用

安装完Tower之后,即可开始使用Tower。但是与Ansible不同的是,Tower不是开源的,用户试用的话需要填写ansible的用户信息收集,ansible官方会邮件联系你,给你相关的授权信息。

当然,用户也可以通过“你懂得”的方式使用Tower,这里就不说了,用户自行百度。


6.3 Tower初体验


6.3.1 添加inventory
下面就是就是tower的登录界面。

一文带你了解Ansible


登录成功,会跳到tower的首页,首页会有一些我们的主机、用户信息、作业执行的概况!

一文带你了解Ansible


与使用ansible原生一样,咱们先建个inventories。


一文带你了解Ansible

一文带你了解Ansible


然后在该inventories添加host信息:

一文带你了解Ansible

至此,一个inventory就添加好了。


6.3.2 添加project

下面我们添加一个project,project的作用相当于一个作业一样!用户可以在project中添加想要执行的作业脚本。

一文带你了解Ansible


创建project需要注意,如果scm type选择的是Manual,则需要在/var/lib/awx/projects创建一个文件夹,该文件夹名你自取。该文件夹的作用就是保存需要执行的脚本文件的。
我们在该文件夹下创建了一个脚本文件,即1.yml。

一文带你了解Ansible

然后,我们保存projects。


一文带你了解Ansible


6.3.3 添加template

添加好inventory和project后,我们就需要添加一个模板了。模板的作用就是选择执行的inventory和project。

一文带你了解Ansible

一文带你了解Ansible


6.3.4 执行template

最后,我们执行template,即可看到执行结果。

一文带你了解Ansible


输出结果:

最后,Tower是一款比较好用的dashboard,里面还有许多功能,有兴趣的读者可以一一尝试。


七、总结

总体来说,Ansible还是一款非常优秀的运维工具。篇幅所限,今天只说了Ansible的一些皮毛。以后还会有更多关于Ansible的文章!另外,我们的产品之后也会纳入Ansible功能,有兴趣的朋友以后多多关注我们的公众号!


了解新钛云服






新钛云服出品的部分精品技术干货



以上是关于一文带你了解Ansible的主要内容,如果未能解决你的问题,请参考以下文章

一文带你了解单元测试和基准测试干货

一文带你了解单元测试和基准测试干货

一文带你了解Java反射机制

Java8 Stream流如何操作集合,一文带你了解!

Java8 Stream流如何操作集合,一文带你了解!

一文带你了解 TreeMap ,LinkedHashMap 的主要特点#yyds干货盘点#