网站首页 > 技术文章 正文
一、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.rpmsudo 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功能,有兴趣的朋友以后多多关注我们的公众号!
- 上一篇: 跨平台自动化部署工具 Ansible 简单入门
- 下一篇: 如何配置自动化工具-Ansible?
猜你喜欢
- 2024-12-01 Ansible的原理与配置
- 2024-12-01 Ansible系列教程-playbook详解(三)
- 2024-12-01 prometheus实战之一:用ansible部署
- 2024-12-01 ansible快速入门手册
- 2024-12-01 学习下运维自动化工具ansible
- 2024-12-01 Ansible 批量100台服务器添加 Crontab
- 2024-12-01 利用Ansible自动化工具对多台linuxz主机配置网卡文件
- 2024-12-01 如何在 Rocky Linux 8 上安装 Ansible 自动化工具?
- 2024-12-01 Ansible自动化部署利器的实战运用
- 2024-12-01 Ansible自动化运维
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)