ansible的介绍与安装(一)

一、 ansible介绍

       ansible是基于python开发的,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,ansible本身没有批量部署的能力,ansible只提供一个框架,通过ansbile所运行的模块实现批量部署的功能。

       ansible的特点:

       (1). 不安装客户端,不需要mq,没有服务器端,不需要启动任何服务,只需要在ansible服务器上面执行命令就可以控制所有节点执行命令。

       (2). 默认是ssh形式控制所有节点,但是又是基于python开发,可以多并发。相对于chef和puppet为代表的使用agent程序的配置管理系统默认使用“拉取模式”。ansible采用的是推送模式。如果想用拉取模式,ansible官方版本也可以支持,使用名为ansible-pull的工具。

       (3). 基于模块工作,可使用任意语言开发模块。也可以使用ansible在管理的远程服务器上执行任意Shell命令。

       (4).YAML语言来实现剧本的订制。ansible的配置管理脚本叫playbook。ansible的playbook语法是基于YAML开发的。而YAML是一种易于人类读写为设计理念的数据格式语言。某种程度上说,YAML之于JSON就好像Markdown之于HTML。

       ansible的架构(引自网上截图):

blob.png

ansible core:ansible自身核心模块

host inventory:主机库,定义可管控的主机列表

connection plugins:连接插件,一般默认基于ssh协议连接

modules:core modules(自带模块)、custom modules(自定义模块 )

playbooks:剧本,按照所设定编排的顺序执行完成安排任务

      ansible的注意事项:

      (1). 主控端python版本需要2.6或以上

      (2). 被控端Python版本小于2.4需要安装python-simplejson

      (3). 被控端如开启SElinux需要安装libselinux-python

      (4).  windows不能做为主控端

二、安装

centos6.4安装方法:http://www.51niux.com/?id=41

centos8.2安装方法:

  首先需要dnf安装一下epel-release库,然后再安装ansible

dnf install epel-release
dnf install -y ansible

centos7.4安装方法:

  centos7使用自带的yum源即可安装

yum install -y ansible

三、配置管理

  环境:

  服务器:172.16.5.238

  客户端1:172.16.5.239

  客户端2:172.16.5.240

  3.1、SSH免密钥登录设置

ssh-keygen  -t rsa   #服务器生成秘钥对
ssh-copy-id  -i .ssh/id_rsa.pub  root@172.16.5.239 
ssh-copy-id  -i .ssh/id_rsa.pub  root@172.16.5.241

  3.2、配置文件

vim  /etc/ansible/hosts
参考文件中案例追加内存如下
[test1]
172.16.5.239 

[test2]
172.16.5.241

  3.3、测试

[root@bogon ~]# ansible -i /etc/ansible/hosts test1  -m command -a 'uptime'
172.16.5.239 | SUCCESS | rc=0 >>
 20:03:33 up  2:54,  3 users,  load average: 0.00, 0.01, 0.05

[root@bogon ~]# ansible -i /etc/ansible/hosts test2  -m command -a 'uptime'
172.16.5.241 | SUCCESS | rc=0 >>
 20:03:49 up 41 min,  3 users,  load average: 0.00, 0.02, 0.05

 四、inventory使用

 4.1、inventory介绍

  Ansible,默认是调用“/etc/ansible/hosts”配置的主机组或者主机,同时也可以通过 -i 参数指定自定义的hosts文件。
Ansible Inventory实际上是包含静态Inventory和动态Inventory两部分。

  静态Inventory指的是在文件/etc/ansible/hosts中指定的主机和组,如果机器规模比较少或者增减不太频繁的话,这种手工维护要多一点,当然也可以通过一些自己写的监控手段以及采集手段来更新静态的文件,通过-i来引用。反正就是尽量的减少手工来操作,这样不会因为忘了更新什么的导致这个文件不准确。

  Dynamic Inventory指通过外部脚本获取主机列表,并按照ansible 所要求的格式返回给ansilbe命令的。这部分一般会结合CMDB资管系统、zabbix 监控系统、crobble安装系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的API 或者接入库查询等方式返回主机列表。

 4.2、inventory的行为参数

ansible_ssh_host:SSH目标主机名或IP(默认值是主机的名字)
ansible_ssh_port:SSH目的端口(默认是22)
ansible_ssh_user:SSH登录使用的用户名(root)
ansible_ssh_pass:SSH认证所使用的密码(默认是none,这是不安全的,ansible极力推荐使用--ask-pass选项或使用SSH keys)
ansible_sudo_pass SSH认证的sudo用户的密码
ansible_connection:ansible支持多种transport机制,ansible使用何种连接模式连接到主机,连接类型有local,ssh,docker,paramiko(默认是smart,也就是智能选择)
ansible_ssh_private_key_file:SSH认证所使用的私钥(默认是none)
ansible_shell_type:命令所使用的shell(默认是sh)目标系统的shell类型,你不应该设置这个参数,除非你设置的ansible_shell_executable与默认的sh不兼容。默认情况下,命令是在sh shell 环境风格下运行的。此处可以设置为csh或fish shell。
ansible_python_interpreter:主机上的python解释器(默认是/usr/bin/python)
ansible_*_interpreter:如果不是用python编写的自定义模块,可以使用这个参数来指定解释器的路径(如/usr/bin/ruby),(默认是none)

 4.3、通常有两种写法如下

  中括号里面代表的是你这个台服务器叫什么名字,下面第一列为目标服务器的域名,第二列为服务器ip地址,第三列为目标端口,第四列为登录用户,第五列为登录用的密码。这里需要注意,第一列和第二列一般不这么写,直接写目标ip即可,如果不想跟服务器做ssh互信,就用允许登录用户和密码登陆,这里还可以使用sudo用户,具体参数如上。

[test1]
localhost  ansible_ssh_host=172.16.5.239  ansible_ssh_port=22 ansible_ssh_user=leihaidong ansible_ssh_pass=12345678

[test2]
172.16.5.241  ansible_ssh_port=22  ansbile_ssh_user=root ansible_ssh_pass=yunwei.123

4.4、正则写法;

[test3]
172.16.5.2[3:3][8:9]
这里会在172.16.5.238和172.16.5.239两台服务器上执行

4.5、包含,使用场景,A组,B组,C组,然后要在A、B、C组上执行有两种方法,第一种直接在执行的之后用逗号隔开每个组名即可,如下:

[root@bogon ansible]# ansible -i /etc/ansible/hosts test1,test2  -a 'uptime'
172.16.5.241 | SUCCESS | rc=0 >>
 10:06:49 up 46 min,  2 users,  load average: 0.00, 0.01, 0.05

localhost | SUCCESS | rc=0 >>
 10:06:49 up 46 min,  3 users,  load average: 0.00, 0.01, 0.05

但是这里如果组名很多的话就比较麻烦,每次都得写一遍,而且容易写错,所以衍生了下面的配置。新建一个组名,然后名字后面加上一个冒号和children,就可以将两个组合并为一个组了。

[test1]
localhost  ansible_ssh_host=172.16.5.239  ansible_ssh_port=22 ansible_ssh_user=leihaidong ansible_ssh_pass=12345678

[test2]
172.16.5.241  ansible_ssh_port=22  ansbile_ssh_user=root ansible_ssh_pass=yunwei.123

[test4:children]
test1
test2

执行结果

[root@bogon ansible]# ansible -i /etc/ansible/hosts test4  -a 'uptime'
172.16.5.241 | SUCCESS | rc=0 >>
 10:10:11 up 49 min,  2 users,  load average: 0.04, 0.03, 0.05

localhost | SUCCESS | rc=0 >>
 10:10:11 up 49 min,  3 users,  load average: 0.00, 0.01, 0.05

这里需要注意,配置文件中已经默认执行文件是/etc/ansible/hosts文件,所以这里如果服务器信息写在这里面的话,就不用加上-i这个参数和后面的路径,不过这个可以在配置文件中修改,这里可以建立多个类似的文件,但是每次都需要用-i指定(否则就在/etc/ansible/ansible.cfg文件中标明)

 上面说的是静态Inventory,这里还有动态Inventory,其实就是写个小脚本,将很多的服务器ip地址自动批量分组。

 4.6、首先我们要准备一个list.txt文件,把所有需要被管理的服务器IP地址写进去。

[root@bogon ansible]# cat  list.txt 
172.16.5.239
172.16.5.241

4.7、然后写一个脚本

   其实特别好理解,就是叫list.txt文件中的ip地址一个个的读出来,然后下面的数据类型即可。

[root@bogon ansible]# cat test.py
#!/bin/env python
# -*- coding:utf-8 -*-
import json
f = file('list.txt','r')  
list = []
group = 'test'
for num in f.readlines():
    v = num.strip('\n')
    list.append(v)
hostdata = {group:{"hosts":list}}
jsonlist = json.dumps(hostdata,indent=4)
print jsonlist

  数据类型结果:

[root@bogon ansible]# python test.py 
{
    "test": {
        "hosts": [
            "172.16.5.239", 
            "172.16.5.241"
        ]
    }
}

  如果使用ansible执行test.py的话需要给执行的权限

chmod +x test.py 

  使用ansible执行

[root@bogon ansible]# ansible -i  /etc/ansible/test.py  test -a 'uptime'
172.16.5.239 | SUCCESS | rc=0 >>
 10:29:06 up  1:08,  3 users,  load average: 0.00, 0.01, 0.05

172.16.5.241 | SUCCESS | rc=0 >>
 10:29:06 up  1:08,  2 users,  load average: 0.00, 0.01, 0.05 

  

此文参考与:http://www.51niux.com/?id=41

 

posted @ 2018-08-29 08:05  Charles.L  阅读(512)  评论(0)    收藏  举报