简介
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
总体架构
核心:ansible
核心模块(Core Modules):这些都是ansible自带的模块
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
- 插件(Plugins):完成模块功能的补充
- 剧本(Playbooks):把需要完成的多个任务定义在剧本中
- 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机群(Host Inventory):ansible在管理多台主机时,可以选择只对其中的一部分执行某些操作
特性
(1)、no agents:不需要在被管控主机上安装任何客户端;
(2)、no server:无服务器端,使用时直接运行命令即可;
(3)、modules in any languages:基于模块工作,可使用任意语言开发模块;
(4)、yaml,not code:使用yaml语言定制剧本playbook;
(5)、ssh by default:基于SSH工作;
(6)、strong multi-tier solution:可实现多级指挥。
优点
(1)、轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)、批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)、使用python编写,维护更简单,ruby语法过于复杂;
(4)、支持sudo。
任务执行流程
Ansible的安装
安装方法
Ansible的安装方式有很多种,常用的安装方法是基于yum或者源码,
- 如果是基于yum安装,需要先配置epel源
1 | wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm |
- 源码安装需要先解决依赖关系,然后下载ansible
1 | yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto |
- pip安装,首先先安装
python2.7+setuptools+pip
,然后直接使用pip install ansible
即可,类似yum一样,会自动解决依赖问题
建议使用yum来安装,比较简单,安装完查看ansible的版本1
2
3
4[root@node1 ansible]# ansible --version
ansible 2.2.0.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
注:控制服务器:需要安装Python2.6/2.7
被管理服务器:需要安装Python2.4 以上版本,若低于Python2.5 需要安装python-simplejson
;若启用了selinux,则需要安装libselinux-python
生成ssh以方便远程链接
ansilbe采用ssh的方式管理节点,为了方便管理,使用密钥方式面密码登陆被管理节点。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#1、生成rsa格式密钥
[root@node1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
c3:47:65:53:bf:be:37:1d:94:86:69:b0:4c:e5:38:e2 root@node1
The key's randomart image is:
+--[ RSA 2048]----+
| =o. |
| =o. . |
| .+oo.o o|
| ....o.+ +.|
| SE. . o. |
| o .. |
| .o|
| .+|
| .o|
+-----------------+
#把公钥写入到远端主机的~/.ssh/authorized_keys
[root@node1 ~]# ssh-copy-id 192.168.1.121
ansible相关配置与命令
ansible命令
1 | Usage: ansible <host-pattern> [options] |
host-pattern可以是域名,IP,也可以在/etc/ansible/hosts指定。相关的参数如下:
1 | -m MODULE_NAME 后接模块名 |
当命令执行时间比较长时,也可以放到后台执行,使用-B、-P参数,如下:
1 | ansible all -B 3600 -a "/usr/bin/long_running_operation --do-stuff" #后台执行命令3600s,-B 表示后台执行的时间 |
更多详细参数可参考:Ansible系列(二):选项和常用模块
ansible.cfg配置说明
Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg
,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等。
Ansible配置以ini格式存储配置数据,在Ansible中几乎所有配置都可以通过Ansible的Playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照以下顺序查找配置文件。
ANSIBLE_CONFIG
:首先,Ansible命令会检查环境变量,及这个环境变量指向的配置文件。./ansible.cfg
:其次,将会检查当前目录下的ansible.cfg配置文件。~/.ansible.cfg
:再次,将会检查当前用户home目录下的.ansible.cfg配置文件。/etc/ansible/ansible.cfg
:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文件。
具体如下:
1 | [defaults] |
如果在对之前未连接的主机进行连结时报错如下:
1 | ansible test -a 'uptime' |
是由于在本机的~/.ssh/known_hosts文件中并有finger print key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中。
方法1:
在进行ssh连接时,可以使用-o参数将StrictHostKeyChecking设置为no,使用ssh连接时避免首次连接时让输入yes/no部分的提示。
通过查看ansible.cfg配置文件,发现如下行:
1 | [ssh_connection] |
可以启用ssh_args 部分,使用下面的配置,避免上面出现的错误:
1 | ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no |
方法2:
在ansible.cfg配置文件中,也会找到如下配置:
1 | # uncomment this to disable SSH key host checking |
默认host_key_checking部分是注释的,通过找开该行的注释,同样也可以实现跳过ssh 首次连接提示验证部分。但在实际测试中,似乎并没有效果,建议使用方法1.
其他部分
默认ansible 执行的时候,并不会输出日志到文件,不过在ansible.cfg 配置文件中有如下行:
1 | log_path = /var/log/ansible.log |
默认log_path这行是注释的,打开该行的注释,所有的命令执行后,都会将日志输出到/var/log/ansible.log文件。
打开之后,就会有日志了
1 | [root@node1 ~]# more /var/log/ansible.log |
ansible-doc命令
Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbook。Ad-hoc的执行依赖于模块,ansible官方提供了大量的模块。 如:command、raw、shell、file、cron等,具体可以通过ansible-doc -l
进行查看 。
可以使用ansible-doc -s module
来查看某个模块的参数,也可以使用ansible-doc help module
来查看该模块更详细的信息。
命令说明
一个ad-hoc命令的执行,需要按以下格式进行执行:
1 | ansible 主机或组 -m 模块名 -a '模块参数' ansible参数 |
主机和组,是在/etc/ansible/hosts 里进行指定的部分,当然动态Inventory 使用的是脚本从外部应用里获取的主机;
模块名,可以通过
ansible-doc -l
查看目前安装的模块,默认不指定时,使用的是command模块,具体可以查看/etc/ansible/ansible.cfg
的“#module_name = command ” 部分,默认模块可以在该配置文件中进行修改;模块参数,可以通过
ansible-doc -s 模块名
查看具体的用法及后面的参数;ansible参数,可以通过ansible命令的帮助信息里查看到,这里有很多参数可以供选择,如是否需要输入密码、是否sudo等。
ansible-playbook命令
ansible-playbook命令的选项和ansible命令选项绝大部分都相同。但也有其特有的选项。以下是截取出来的帮助信息。
1 | Options: |