一文带你了解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 --help查看,这里不做说明!

该部分只介绍ansible的简单使用,下面我将分模块具体介绍Ansible。

三、Inventory

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

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

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

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

3.1 主机方式使用

如上图所示,是我们定义的Inventory文件。其中我们包含了两个主机。我们可以使用以下命令查看Inventory文件是否有效!

ansible -i /hosts all --list-hosts

结果如下:

之后我们可以直接以主机IP的方式调用主机执行一些操作。

比如:

ansible -i /hosts 10.20.0.1 -m ping

3.2 主机组方式使用

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

下图就举个例子:

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

比如:

ansible -i /hosts centos6 -m ping

3.3 动态Inventory

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

3.4 参数说明

四、 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 【模块参数】

举例:

4.2 shell模块

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

使用方式如下:

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

举例:

4.3 script模块

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

使用方式如下:

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

举例:

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则不设置为开机自启动。

举例:

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

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官网!

五、Playbook

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

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

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

基础参数:

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

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

tasks:任务。

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

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

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

5.1 编写Playbook

vim hello.yml

该脚本是向目标机器的tmp下写入hello.log文件。

5.2 执行Playbook

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

文件写入,说明我们的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的密码。

安装:

./setup.sh

6.2 Tower使用

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

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

6.3 Tower初体验

6.3.1 添加inventory

下面就是就是tower的登录界面。

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

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

然后在该inventories添加host信息:

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

6.3.2 添加project

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

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

我们在该文件夹下创建了一个脚本文件,即1.yml。

然后,我们保存projects。

6.3.3 添加template

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

6.3.4 执行template

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

输出结果:

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

七、总结

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

了解新钛云服

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

TiOps,支持多云环境安全远程运维,疫情期间免费对外开放,助力远程安全办公!

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

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

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值