说在前面的话:这个号沉了很久,一直都没有更新,自己也想更新,奈何水平不够,不敢乱写,最近正好在搞ansible的事,趁着这个机会,把ansible从搭建都使用的过程记录下来,方便以后有需要的时候可以拿来即用,也可以给各位看官参考参考。
一、搭建环境
环境:三台centos7 机器。机器名分别为centos7-2(ip:192.168.128.138)、Centos7-3(ip:192.168.128.143)、ansible-master(ip:192.168.128.141),环境中确保这三台机器能互相通信。
安装过程:
安装ansible的方法有几种,分别是yum、pip和rpm包安装等,我使用的是rpm安装,过程如下(我的ansible-master服务器能联网,切如下操作都是使用root账号操作):
1. 安装Yumdownloader工具:
# yum install yum-utils
2. 创建一个存放安装包的目录
# mkdir root/packages
3. 更新ansible的下载源
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
4. 下载安装包
# yumdownloader --resolve --destdir /root/packages ansible
这里是将ansible的安装包下载到/root/packages,如下:
5. 使用rpm安装ansible
第4步已经将ansible的安装包下载完毕,现在进入到/root/packages目录,然后使用rpm命令安装:# rpm -ivh ansible-2.9.9-1.el7.noarch.rpm
由图中可以看出ansible已经安装成功,并且版本为2.9.9。其配置文件存放目录为/etc/ansible:
ansible.cfg文件为ansible的主配置文件,对ansible的设置可以在里面定义。hosts文件主要定义管理主机,方便个人对需要管理的机器进行分组。roles文件夹我目前还未使用到,他的功能需要你们自己去解锁。
说明:如果个人的Linux环境是不能联网的,那么可以在Windows下载好所需的ansible包和依赖包,然后再传到Linux环境中,最后使用rpm安装,如果安装过程中发现缺少依赖库,则继续下载,直到满足为止。上面我演示的安装方法就已经将依赖问题解决了,比较方便,但是对环境的要求是可以联网。
二、使用
在使用ansible之前,需要先了解一下ansible的几个文件。
1. ansible.cfg
这个文件我个人仅将host_key_checking = False和remote_user = root这两个选项打开。
Ansible使用的是ssh远程登录模式去操作远端服务器(被控服务器),在服务器使用ssh登录的时候一般都会配置ssh免密登录,这是为了方便操作,但是在大型集群当中,如果home目录不一致的话,不合适做ssh免密登录这个操作,那么把host_key_checking = False这个选项打开就有助于我们使用ansible进行操作,而不需要事先对每台服务器都做ssh免密登录。如果不打开的话,直接使用ansible则不能成功。remote_user = root这个选项设置的是远端服务器执行操作/命令的默认账户。我们是使用ansible对多台服务器进行相同的操作管理,当使用ansible对远端服务器发出指令的时候,远端服务器则使用remote_user = root这里设置的账户去执行我们的动作,这个默认账户需要根据自己的生产环境需求去改。
还有其他的配置选项说明我放在了文档末尾处的附录,有需要的可以看看。
2. hosts文件
host文件记录着我们环境中的远端服务器列表。我们可以对我们管理的服务器进行分类,然后在使用ansible操作的时候选择我们要操作的服务器组,例如我目前环境中有的三台服务器,其中两台的被控服务器,我命名为test-srv组,那么host文件应该这样写:
后面的这个就表示我把我的两台服务器加到了test-srv组里,当我要对这个组进行操作的时候,例如检查和这两台服务器的连通性,可以这样操作:
# ansible test-srv -m ping -k
test-srv就是我要操作的服务器组,-m表示使用哪个模块,这里我们使用的是ping这个模块,-k表示密码key,按回车后输入密码即可,结果如下:
Ping模块正确的相应是返回pong,在上图中可以看到,然后这里默认使用的执行账户就是remote_user里设置的账户,输入的密码也是该账户的密码。
3. 模块
上面说到一个ping模块,那么ansible有哪些模块,已经各个模块的功能是什么呢?
这个网站总结了ansible中各个网站的功能,我就不列出来了:https://blog.csdn.net/Jack_Yangyj/article/details/86494219
然后我要说的是在没有文档的时候,如何查看某个模块的功能。使用ping这个模块来说,执行ansible-doc ping就可以查看ping模块相关信息。这个操作跟Linux命令中的man帮助一样,里面包含了模块的各个参数及含义。
在我目前使用到的模块有command、shell、user等,其中shell是比较常用的。
command是ansible的缺省模块,即当我们执行ansible时,没有使用-m指定模块,这默认为command模块。例如我想在所有的远端服务器执行ls root命令,可以这样操作:ansible all -a ‘ls /root’-k,结果如下:
command模块虽然可以执行命令,但是限制比较大,不支持管道和重定向符号('<','>','|',';',&'),例如执行echo qwe>>/tmp/test.txt这个操作,可以看到他返回的结果直接就是qwe>>/tmp/test.txt:
正常的会在远端服务器生成一个/tmp/test.txt文件,并且文件内容为qwe(上述操作使用了ansible的缺省模块为command这个特定,执行命令的使用不用-m command)。这时候使用shell模块可以很好的解决这个问题:
到远端服务器看结果:
这个就是command和shell的一些区别,具体其他区别需要你们自己去体验了。然后还有一些像user和script等常用模块我也不长篇说明了,自己可以使用ansible-doc module来查看。
4. Playbook功能
上面介绍了一些基本模块功能的使用,下面说一下ansible的另一个功能,那就是playbook,playbook顾名思义就是剧本的意思。我们写好一个playbook剧本后,使用ansible-play命令去执行他,然后他就会根据我们写的剧本进行操作。这样可以将我们需要的多个动作集成到一起,避免多次执行ansible命令,减少工作量,提高效率。
如下是我写好的一个剧本test.yml,这个playbook中进行了两个操作,第一个是修改root账号的密码,第二个操作是将123456重定向到/tmp/test.txt文件中。剧本的格式要严格的遵守缩进,属于同一级别的要并列,并且不能空格键和tab键混合使用。
如下这个剧本定义了我要操作的服务器组为test-srv,执行的账号是root,tasks是指定我要做的操作,name是对我们的操作做注释,之后就可以调用模块进行相对应的操作,当前我使用的是shell模块进行操作。
写完playbook后,执行ansible-playbookl test.yml,然后到远端服务器验证操作是否成功。
结果:
可以看到/tmp/test.txt文件中的内容已经更新,并且我验证了root密码也是如此,说明这个playbook已经成功了。
Palybook不止能调用shell模块,其他模块也可以使用,使用方法可以查看相应的文档,这里有个ansible的中文文档网站:www.ansible.com.cn,如果有不清楚的可以再去查看ansible的官方文档。
三、总结
Ansible是一个很好的自动化管理工具,对大型的集群/服务器有很好的效果,当我们学会使用他的各种功能,能很好的提高我们的工作效率。本文就只是简单的说明了一下ansible的安装和基本操作,其更深入的使用需要各位自己摸索。本文有错误的希望大佬们能指出,我看到后加以更正。
四、附录
配置项 | 说明 | 默认值 |
inventory | ansible inventory文件路径 | /etc/ansible/hosts |
library | ansible模块文件路径 | /usr/share/my_modules/ |
remote_tmp | ansible远程主机脚本临时存放目录 | ~/.ansible/tmp |
local_tmp | ansible管理节点脚本临时存放目录 | ~/.ansible/tmp |
forks | ansible执行并发数 | 5 |
poll_interval | ansible异步任务查询间隔 | 15 |
sudo_user | ansible sudo用户 | root |
ask_sudo_pass | 运行ansible是否提示输入sudo密码 | True |
ask_pass | 运行ansible是否提示输入密码 | True |
transport | ansible远程传输模式 | smart |
remote_port | 远程主机SSH端口 | 22 |
module_lang | ansible模块运行默认语言环境 | C |
gathering | facts信息收集开关定义 | smart |
roles_path | ansible role存放路径 | /etc/ansible/roles |
timeout | ansible SSH连接超时时间 | 10 |
remote_user | ansible远程认证用户 | root |
log_path | ansible日志记录文件 | /var/log/ansible.log |
module_name | ansible默认执行模块 | command |
executable | ansible命令执行shell | /bin/sh |
hash_behaviour | ansible主机变量重复处理方式 | replace |
private_role_vars | 默认情况下,角色中的变量将在全局变量范围中可见。为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers的任务可以看到角色变量 | yes |
vault_password_file | 指定vault密码文件路径 | 无 |
ansible_managed | 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 | Ansible managed |
display_skipped_hosts | 开启显示跳过的主机 | True |
error_on_undefined_vars | 开启错误,或者没有定义的变量 | False |
action_plugins | ansible action插件路径 | 无 |
cache_plugins | ansible cache插件路径 | 无 |
callback_plugins | ansible callback插件路径 | 无 |
connection_plugins | ansible connection插件路径 | 无 |
lookup_plugins | ansible lookup插件路径 | 无 |
inventory_plugins | ansible inventory插件路径 | 无 |
vars_plugins | ansible vars插件路径 | 无 |
filter_plugins | ansible filter插件路径 | 无 |
terminal_plugins | ansible terminal插件路径 | 无 |
strategy_plugins | ansible strategy插件路径 | 无 |
fact_caching | 定义ansible facts缓存方式 | memory |
fact_caching_connection | 定义ansible facts缓存路径 | 无 |