Ansible介绍与安装

一.  Ansible 介绍

Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的(集合了众多运维工具 puppet、cfengine、chef、func、fabric的优点)自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有saltstack 等批量管理软件.

Ansible能做什么? 
ansible可以帮助运维人员完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nginx服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,运维人员都要为新服务器部署某个服务,也就是说运维人员需要经常重复的完成相同的工作。
这些场景中运维人员都可以使用到ansible。

Ansible软件特点?
ansible不需要单独安装客户端,SSH相当于ansible客户端。
ansible不需要启动任何服务,仅需安装对应工具即可。
ansible依赖大量的python模块来实现批量管理。
ansible配置文件/etc/ansible/ansible.cfg。

Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。Ansible的两个特性:
模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块;
playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务;

Ansible 架构

a.连接插件(connectior plugins) 用于连接主机 用来连接被管理端。
b.核心模块(core modules) 连接主机实现操作, 它依赖于具体的模块来做具体的事情。
c.自定义模块(custom modules) 根据自己的需求编写具体的模块。
d.插件(plugins) 完成模块功能的补充。
e.剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
f.主机清单(host inventory)定义ansible需要操作主机的范围。

最重要的一点: ansible是模块化的, 它所有的操作都依赖于模块, 不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端, 不需要服务端(no sever),需要依靠大量的模块实现批量管理, 配置文件 /etc/ansible/ansible.cfg (前期不用配置)。 


Ansible架构图核心组件说明:

Ansible:Ansible的核心程序

Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

Playbooks:YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Connection Plugins:连接插件,Ansible和Host通信使用

 

 

二、 Ansible 安装

 

环境准备

1
2
3
4
5
IP地址                 主机名               角色           系统版本
172.16.50.68       ansible-server        主控节点        centos7.5
172.16.50.65       ansible-node01        受控节点1       centos7.5
172.16.50.66       ansible-node02        受控节点2       centos7.5
172.16.50.67       ansible-node03        受控节点3       centos7.5  

 进行主机名修改:命令:hostnamectl set-hostname XXX  (hostnamectl set-hostname ansible-server)

1
2
3
4
[root@ansible-server ~]# hostnamectl set-hostname ansible-server
[root@ansible-node01 ~]# hostnamectl set-hostname ansible-node01
[root@ansible-node02 ~]# hostnamectl set-hostname ansible-node02
[root@ansible-node03 ~]# hostnamectl set-hostname ansible-node03

设置主控节点到受控节点的ssh无密码信任关系 (ansible应用环境下, 主控节点必须要设置ssh无密码跳转到受控节点的信任关系)  

1
2
3
4
5
6
7
添加主控节点到受控节点的认证! 首先主控节点必须要生成公私密钥对, 否则不能进行免密信任关系设置!
[root@ansible-server ~]# ssh-keygen -t rsa                                 //一直回车即可
[root@ansible-server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.65      //回车, 输入远程登录的密码即可
[root@ansible-server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.66
[root@ansible-server ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.50.67
  
如果受控节点数量比较多的话, 可以使用expect进行远程ssh连接的免密信任关系, 具体可参考: https://www.cnblogs.com/kevingrace/p/5900303.html

 

[root@ansible-server ~]# ssh-keygen -t rsa 
[root@ansible-server ~]# cat fenfa_pub_key.sh  #批量处理
#!/bin/bash

for ip in {111,112,114,115,116}
do
    echo "================host 10.192.27.$ip pub-key start fenfa =============="
    sshpass -p123123 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.192.27.$ip "-o StrictHostKeyChecking=no" &>/dev/null
    echo -e "host 10.192.27.$ip fenfa success."
    echo "================host 10.192.27.$ip fenfa end ========================="
done

[root@ansible-server ~]# bash fenfa_pub_key.sh 
批量处理验证

 

 

 

 

Ansible安装部署  

Ansible有两种安装方式: yum 和 pip 安装方式。

1、yum方式安装

Ansible在epel的yum中有提供,所以配置好epel源,直接使用yum命令安装即可,CentOS系统, 可以使用默认的yum源直接安装ansible。

1
2
3
4
5
6
7
[root@ansible-server ~]# yum install -y ansible
   
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/

[root@ansible-server ~]rpm -ql ansible | egrep -v "^/usr/(lib|share)"

/etc/ansible/ansible.cfg #ansible服务配置文件
/etc/ansible/hosts #主机清单文件 定义可以管理的主机
/etc/ansible/roles #角色目录

[root@ansible-server ~]# vim /etc/ansible/hosts 
...
# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com
172.16.50.65
172.16.50.66
172.16.50.67
172.16.50.68


[root@ansible-server ~]# ansible all -a "hostname"
172.16.50.65 | CHANGED | rc=0 >>
ansible-node01

172.16.50.66 | CHANGED | rc=0 >>
ansible-node02

172.16.50.67 | CHANGED | rc=0 >>
ansible-node03

172.16.50.68 | CHANGED | rc=0 >>
ansible-server 
测试一下

 

2、pip方式安装  

1
2
# yum -y install python-pip python-devel
# pip install 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
ansible程序文件
/usr/bin/ansible:  命令行工具
ansible命令通用格式: ansible <host-pattern> [options] [-m module_name] [-a args]
/usr/bin/ansible-doc: 帮助文档
/usr/bin/ansible-playbook: 剧本执行工具
/etc/ansible/ansible.cfg: 主配置文件
/etc/ansible/hosts: 管理的主机清单
/etc/ansible/roles: 角色存放处
   
查看ansible命令帮助
[root@ansible-server ~]# ansible -h
   
查看支持的模块
[root@ansible-server ~]# ansible-doc -l
[root@ansible-server ~]# ansible-doc -l|grep copy    #查看copy模块
   
查看ansible的支持的模块个数
[root@ansible-server ~]# ansible-doc -l |wc -l
2080
   
查看ansible版本
[root@ansible-server ~]# ansible --version
ansible 2.7.8
  config file /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

 

linux主机性能变差
  1、top htop 查看cup负载情况
  2、free -h 查看内存负载情况
  3. iotop 查看磁盘负载情况

 

 

ansible服务部署过程总结
a.安装服务软件
b.编写主机清单
c.进行管理测试

 

ansible服务特点说明
01.管理端不需要启动服务程序(no server)
02.管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
03.受控端不需要安装软件程序
  受控端selinux服务没有关闭---影响ansible软件的管理
  libselinux-python让selinux开启的状态也可以使用ansible程序
04.受控端不需要启动服务程序(no agent)
05.服务程序管理操作模块众多(module)
06.利用剧本编写来实现自动化(playbook)

 

 

 

 

三、  Ansible常用命令简述

语法格式: 
ansible <pattern_goes_here> -m <module_name> -a <arguments>
也就是: 
ansible  匹配模式   -m  模块  -a  '需要执行的内容'

解释说明: 
匹配模式:即哪些机器生效 (可以是某一台, 或某一组, 或all) , 默认模块为command , 执行常规的shell命令.

-m name, --module-name=name:  指定执行使用的模块。
-u username, --user=username:  指定远程主机以username运行命令。
-s, --sudo:  相当于linux系统下的sudo命令。
-usudo_username, --sudo-user=sudo_username:  使用sudo, 相当于linux系统下的sudo命令。
-C, --check:  只检查不实际执行。
-e, 即extra_vars:  引用外部参数。
-i, 即inventory:  指定仓库列表, 默认/etc/ansible/hosts。
--list-host:  列出执行主机列。 

 

 

补充说明:ansible执行结果输出的颜色说明
01.绿色信息:查看主机颜色/对主机未做改动
02.黄色信息:对主机数据信息做了修改
03.红色信息:命令执行出错了
04.粉色信息:忠告信息
05.蓝色信息:显示ansible命令执行的过程???

 

四、Ansible常用模块(23个)

ping 模块: 检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 。
raw 模块: 执行原始的命令,而不是通过模块子系统。
yum 模块: RedHat和CentOS的软件包安装和管理工具。
apt 模块: Ubuntu/Debian的软件包安装和管理工具。
pip 模块 : 用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements。
synchronize 模块: 使用rsync同步文件,将主控方目录推送到指定节点的目录下。
template 模块: 基于模板方式生成一个文件复制到远程主机(template使用Jinjia2格式作为文件模版,进行文档内变量的替换的模块。
copy 模块: 在远程主机执行复制操作文件。 
user 模块 与 group 模块: user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
service 模块: 用于管理远程主机的服务。 
get_url 模块: 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)。
fetch 模块: 它用于从远程机器获取文件,并将其本地存储在由主机名组织的文件树中。 
file 模块: 主要用于远程主机上的文件操作。
lineinfile 模块: 远程主机上的文件编辑模块
unarchive模块: 用于解压文件。
command模块 和 shell模块: 用于在各被管理节点运行指定的命令. shell和command的区别:shell模块可以特殊字符,而command是不支持
hostname模块: 修改远程主机名的模块。
script模块: 在远程主机上执行主控端的脚本,相当于scp+shell组合。
stat模块: 获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息。
cron模块: 远程主机crontab配置。
mount模块: 挂载文件系统。
find模块: 帮助在被管理主机中查找符合条件的文件,就像 find 命令一样。
selinux模块:远程管理受控节点的selinux的模块



 



posted @ 2019-07-29 16:52  冥想心灵  阅读(314)  评论(0编辑  收藏  举报