Ansible 小结(一)ansible的安装

Posted by Yancy on 2016-03-07

上一篇文章记录了解ansible,这篇大概记录下常规使用命令。

这里以CentOS Linux release 7.2.1511 (Core)系统为准。

一、Ansible的安装

Centos安装

1、yum源安装

以centos为例,默认在源里没有ansible,不过在fedora epel源里有ansible,配置完epel 源后,可以直接通过yum 进行安装。这里以centos6.8为例:

1
2
3
4
5
6
centos 6
# yum install http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
centos 7
# yum install http://mirrors.sohu.com/fedora-epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
# yum install -y ansible

Ubuntu安装

2、apt-get安装

在ubuntu及其衍生版中,可以通过增加ppa源进行apt-get安装,具体如下:

1
2
3
4
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

3、源码安装

源码安装需要python2.6以上版本,其依赖模块paramiko、PyYAML、Jinja2、httplib2、simplejson、pycrypto模块,以上模块可以通过pip或easy_install 进行安装,不过本部分既然提到的是源码安装,主要针对的无法上外网的情况下,可以通过pypi 站点搜索以上包,下载后通过python setup.py install 进行安装。

最后通过github或pypi上下载ansible源码包,通过python setup.py install 安装即可。由于安装过程相对简单,这里略过,主要介绍安装后,可能遇到的问题。

a、安装PyYAML时,报错如下:

1
2
3
4
5
6
7
8
9
# python setup.py install
libyaml is not found or a compiler error: forcing --without-libyaml
(if libyaml is installed correctly, you may need to
specify the option --include-dirs or uncomment and
modify the parameter include_dirs in setup.cfg)
running install_lib
running install_egg_info
Removing /usr/lib64/python2.6/site-packages/PyYAML-3.11-py2.6.egg-info
Writing /usr/lib64/python2.6/site-packages/PyYAML-3.11-py2.6.egg-info

在centos6.8系统中,可以通过yum -y install libyaml包解决,或者从ISO文件中提供该包,通过rpm -ivh进行安装。

###二、Ansible的配置与验证

yum 安装使用默认示例配置文件后,编辑/etc/ansible/hosts文件,通过以下方式验证ansible是否可用:

1
2
3
4
5
[root@docker ~]# cat /etc/ansible/hosts
[test]
10.212.52.252 ansible_ssh_user=root ansible_ssh_pass=qwe123.com
10.212.52.14 ansible_ssh_user=root ansible_ssh_pass=abc123
10.212.52.16 ansible_ssh_user=root ansible_ssh_pass=91it.org

以上的配置中,我配置了一个test组,该组下有三台主机,三台都使用root验证,三台的密码分别是361way.com、abc123、91it.org 。

注:后面的用户和密码项是非必须的,在配置key认证的情况下,不使用密码也可以直接操作 。未使用key的,也可以在ansible通过 -k参数在操作前询问手动输入密码。

配置文件就是一般下目录的hosts文件。

在库存中,我们可以定义如下信息:

  • 主机地址
  • 主机分组
  • 连接属性(登录名,密码,秘钥,端口等)
    1,主机地址和分组

定义主机地址和名称比较简单:

1
2
[<主机名>]
<主机 IP>

定义分组的语法类似,就是在名字后加上:children,成员可以是主机名,也可以是分组名:

1
2
3
[<分组名>:children]
<主机名>
<分组名>

2,连接属性

可以针对SSH连接指定一些参数:

  • ansible_ssh_host:主机名。
  • ansible_ssh_port:SSH端口,默认22。
  • ansible_ssh_user:登录用户。
  • ansible_ssh_pass:登陆密码。
  • ansible_ssh_private_key_file:私钥。

通过私钥登陆的话,就不要指定登录密码了,主机名也可以忽略。当然,既然是使用私钥登陆,需要你确保已经在各个中主机的authorized_keys里添加了对应的公钥。

3,演示

完整的库存例子如下:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# -----------------
# 首先定义各个主机
# -----------------
#============================01_version=============================#
[tomcat-account_01]
10.27.232.82
[tomcat-point_01]
10.27.2.12
[tomcat-system_01]
10.27.232.12
[tomcat-family_01]
10.27.230.63
[tomcat-mission_01]
10.47.59.12
[tomcat-card_01]
10.47.74.12
[tomcat-check_01]
10.47.107.153
# -----------------
# 定义分组
#
# 在这里我们定义了三个分组,分别名为:
# - cluster1
# - light
# - starwar
# -----------------
[cluster1:children]
tomcat-account_01
tomcat-point_01
tomcat-system_01
tomcat-family_01
tomcat-mission_01
[light:children]
tomcat-account_01
tomcat-point_01
tomcat-system_01
tomcat-family_01
tomcat-mission_01
[starwar:children]
tomcat-account_01
tomcat-point_01
tomcat-system_01
tomcat-family_01
tomcat-mission_01
# -----------------
# 给分组定义变量
#
# 这里我们给 starwar 组定义了变量
# -----------------
[cluster1:vars]
ansible_ssh_port=7525
ansible_ssh_user=lucas
ansible_ssh_private_key_file=./ssh/id_rsa

这里设置分组的时候名字不能与单台机器名称一样。比如:

1
2
3
4
[tomcat-account_01]
10.27.232.82
[tomcat-account_01:children]
tomcat-account_01

这里例子是错误的,会提示分组存在。

为了安全和方便在hosts里面就不需要写用户名和密码。
做个免秘钥登陆。
这里我自己对控制的机器全部做了免秘钥登陆,所以这里只需要这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[redis1]
192.168.1.173
[redis2]
192.168.1.174
[tomcat_A1]
192.168.1.175
[tomcat_B1]
192.168.1.176
[tomcat_C1]
192.168.1.177
[tomcat_D1]
192.168.1.178

这里是执行脚本。

1
ansible tomcat_D1 -m shell -a "sh +x /root/update/shoppingmall.sh"

例子操作查看zk1分组上所有机器端口:

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
[root@salt ansible]# ansible zk1:children -m shell -a "netstat -ntulp"
10.27.238.75 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 12497/java
tcp 0 0 0.0.0.0:56521 0.0.0.0:* LISTEN 12497/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1251/sshd
tcp 0 0 0.0.0.0:4888 0.0.0.0:* LISTEN 12497/java
tcp 0 0 127.0.0.1:15770 0.0.0.0:* LISTEN 1434/aegis_quartz
udp 0 0 118.178.240.129:123 0.0.0.0:* 1262/ntpd
udp 0 0 10.27.238.75:123 0.0.0.0:* 1262/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1262/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1262/ntpd
10.47.100.200 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:58367 0.0.0.0:* LISTEN 11232/java
tcp 0 0 10.47.100.200:10050 0.0.0.0:* LISTEN 646/zabbix_agentd
tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 11232/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1243/sshd
tcp 0 0 0.0.0.0:4888 0.0.0.0:* LISTEN 11232/java
tcp 0 0 127.0.0.1:15770 0.0.0.0:* LISTEN 1436/aegis_quartz
udp 0 0 120.27.152.77:123 0.0.0.0:* 1254/ntpd
udp 0 0 10.47.100.200:123 0.0.0.0:* 1254/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1254/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1254/ntpd