ansible系列之一:简介与安装方法

简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

总体架构

image

  • 核心: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。

任务执行流程

image

Ansible的安装

安装方法

Ansible的安装方式有很多种,常用的安装方法是基于yum或者源码,

  1. 如果是基于yum安装,需要先配置epel源
1
2
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install ansible
  1. 源码安装需要先解决依赖关系,然后下载ansible
1
2
3
4
5
6
7
8
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget https://github.com/ansible/ansible/archive/release1.6.1.zip
unzip release1.6.1
cd ansible-release1.6.1
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
  1. 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
2
3
4
5
6
7
8
9
10
11
12
-m MODULE_NAME   后接模块名
-a MODULE_ARGS 后接模块的参数
-u 指定用户名
-f 启动的并发线程数

-B SECONDS 异步后台方式执行任务,并在指定的秒数后超时,超时会杀掉任务的进程。默认是同步,即保持长连接,它会等待所有执行完毕(即阻塞模式)
-i INVENTORY 指定inventory文件,多个文件使用逗号分隔。默认为/etc/ansible/hosts
--list-hosts 不会执行任何操作,而是列出匹配到的主机列表

-o/--one-line 简化输出(一行输出模式)
-C 不对远程主机做出一些改变,而是预测某些可能发生的改变
--syntax-check 检查语法

当命令执行时间比较长时,也可以放到后台执行,使用-B、-P参数,如下:

1
2
3
4
5
ansible all -B 3600 -a "/usr/bin/long_running_operation --do-stuff" #后台执行命令3600s,-B 表示后台执行的时间

ansible all -m async_status -a "jid=123456789" #检查任务的状态

ansible all -B 1800-P 60-a "/usr/bin/long_running_operation --do-stuff" #后台执行命令最大时间是1800s即30分钟,-P 每60s检查下状态,默认15s

更多详细参数可参考: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
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
27
28
29
30
31
32
33
[defaults]
# some basic default values...
hostfile = /etc/ansible/hosts #指定默认hosts配置的位置
# library_path = /usr/share/my_modules/ #指定存放Ansible模块的目录。
remote_tmp = $HOME/.ansible/tmp
pattern = *
forks = 5 #设置多少个进程同时工作
poll_interval = 15
sudo_user = root #远程sudo用户
#ask_pass = True #每次执行ansible命令是否询问ssh密码
#ask_sudo_pass = True #每次执行ansible命令时是否询问sudo密码
transport = smart
remote_port = 22
module_lang = C
gathering = implicit
host_key_checking = False #关闭第一次使用ansible连接客户端是输入命令提示
system_warnings = False #关闭运行ansible时系统的提示信息,一般为提示升级
log_path = /var/log/ansible.log
# set plugin path directories here, separate with colons
action_plugins = /usr/share/ansible_plugins/action_plugins
callback_plugins = /usr/share/ansible_plugins/callback_plugins
connection_plugins = /usr/share/ansible_plugins/connection_plugins
lookup_plugins = /usr/share/ansible_plugins/lookup_plugins
vars_plugins = /usr/share/ansible_plugins/vars_plugins
filter_plugins = /usr/share/ansible_plugins/filter_plugins
fact_caching = memory
[accelerate]
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
# The daemon timeout is measured in minutes. This time is measured
# from the last activity to the accelerate daemon.
accelerate_daemon_timeout = 30

如果在对之前未连接的主机进行连结时报错如下:

1
2
3
ansible test -a 'uptime'
192.168.1.1| FAILED =>Using a SSH password instead of a key is not possible because HostKey checking is enabled and sshpass does not support this.Please add this host's fingerprint to your known_hosts file to manage this host.
192.168.1.2 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.

是由于在本机的~/.ssh/known_hosts文件中并有finger print key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中。

方法1:
在进行ssh连接时,可以使用-o参数将StrictHostKeyChecking设置为no,使用ssh连接时避免首次连接时让输入yes/no部分的提示。

通过查看ansible.cfg配置文件,发现如下行:

1
2
3
4
5
[ssh_connection]
# ssh arguments to use
# Leaving off ControlPersist will result in poor performance, so use
# paramiko on older platforms rather than removing it
#ssh_args = -o ControlMaster=auto -o ControlPersist=60s

可以启用ssh_args 部分,使用下面的配置,避免上面出现的错误:

1
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no

方法2:

在ansible.cfg配置文件中,也会找到如下配置:

1
2
3
4
5
# uncomment this to disable SSH key host checking
host_key_checking = False

或者
sed -i 's/^#host_key_checking = False/host_key_checking = False/' /etc/ansible/ansible.cfg

默认host_key_checking部分是注释的,通过找开该行的注释,同样也可以实现跳过ssh 首次连接提示验证部分。但在实际测试中,似乎并没有效果,建议使用方法1.

其他部分

默认ansible 执行的时候,并不会输出日志到文件,不过在ansible.cfg 配置文件中有如下行:

1
log_path = /var/log/ansible.log

默认log_path这行是注释的,打开该行的注释,所有的命令执行后,都会将日志输出到/var/log/ansible.log文件。

打开之后,就会有日志了

1
2
3
[root@node1 ~]# more /var/log/ansible.log
2016-12-31 23:35:17,586 p=3661 u=root | 192.168.1.121 | SUCCESS | rc=0 >>
23:35:17 up 4:49, 3 users, load average: 0.00, 0.00, 0.00

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
2
3
4
5
6
7
8
9
10
11
12
Options:
-e EXTRA_VARS,--extra-vars=EXTRA_VARS # 设置额外的变量,格式为key/value。-e "key=KEY",
# 如果是文件方式传入变量,则-e "@param_file"
--flush-cache # 清空收集到的fact信息缓存
--force-handlers # 即使task执行失败,也强制执行handlers
--list-tags # 列出所有可获取到的tags
--list-tasks # 列出所有将要被执行的tasks
-t TAGS,--tags=TAGS # 以tag的方式显式匹配要执行哪些tag中的任务
--skip-tags=SKIP_TAGS # 以tag的方式忽略某些要执行的任务。被此处匹配的tag中的任务都不会执行
--start-at-task=START_AT_TASK # 从此task开始执行playbook
--step # one-step-at-a-time:在每一个任务执行前都进行交互式确认
--syntax-check # 检查playbook语法

参考链接

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/linux/ansible-install.html
  • 本文主题: ansible系列之一:简介与安装方法
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%