Ansible介绍
一、简介
Ansible是基于paramiko开发的,并且基于模块化工作,本身并没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。Ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。Ansible目前已经被收购是自动化运维工具中大家认可度最高的,并且容易上手,学习简单。是每个运维工程师必须掌握的技能之一。
二、ansible的特点
1、 部署简单,只需在主控制端部署Ansible环境,被控端无需做任何操作;
2、 默认使用SSH协议对设备进行管理;
3、 有大量常规运维操作模块,可实现日常绝大部分操作。
4、 配置简单、功能强大、扩展性强;
5、 支持API及自定义模块,可通过Python轻松扩展;
6、 通过Playbooks来定制强大的配置、状态管理;
7、 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
8、 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
三、ansible架构图
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
比较复杂的架构
Ansible的执行流程
简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。
Ansiblie命令执行过程
1、加载自己的配置文件 默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传
输至远程服务器的
5、对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0退出
四、ansible的安装
两种安装方式
这里提供二种安装方式,任选一种即可
1 使用yum 安装
yum install epel-release -y
yum install ansible –y
2 使用pip (python 的包管理模块)安装
pip install ansible
如果没pip,需先安装pip.yum可直接安装:
yum install python-pip
pip install ansible
3.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/
4.ansible配置文件的查找顺序
(1).检查环境变量ANSIBLE_CONFIG指向的路径文件(export
ANSIBLE_CONFIG=/etc/ansible.cfg)
(2).~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件
(3)./etc/ansible.cfg 检查etc目录的配置文件
5、ansible所支持的命令
/usr/bin/ansible # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc # Ansible 模块功能查看工具
/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull # Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault # Ansible 文件加密工具
/usr/bin/ansible-console # Ansible基于Linux Consoble界面可与用户交互的命令执行工具
五、Ansible的命令选项
1、#absible all -m ping执行效果如下:
ansible all -m ping
2、command:在远程主机执行命令:不支持|管道命令
ansible all -m command -a 'ifconfig'
3、Command命令模块接受命令名称,后面是空格分隔的列表参数。
(1)chdir : #在执行命令之前,先切换到该目录
#ansible all -m command -a 'chdir=/tmp ls'
(2)creates: #一个文件名。当这个文件存在,则该命令不执行,可以用来做判断
#ansible all -m command -a 'creates=/tmp/test ls'
(3)executable #切换shell来执行命令,需要使用命令的绝对路径
4、free_form: #要执行的Linux命令,一般使用Ansible的-a参数代替
5、removes : #一个文件名,这个文件不存在,则该命令不执行,与creates相反的判断(文件存在不执行,不存在才执行)
#ansible all -m command -a 'removes=/tmp/txt1 ls'
6、copy:复制文件到远程主机,可以该权限等
(1)复制文件
-a "src= dest= "
#ansible all -m copy -a 'src=/tmp/1 dest=/tmp/'
(2)给定内容生成文件
-a "content= (给文件添加的内容) dest= (生成的文件名)"
#ansible all -m copy -a 'content="hello\n" dest=/tmp/test2 mode=777'
7、file设置文件属性:
创建目录: -a "path= state=directory"
创建链接文件:-a "path=(目录加新文件名字) src=(旧文件) state=link"
删除文件:-a "path= state=absent"
ansible webservers -m file -a 'path=/tmp/test state=directory'
ansible all -m file -a 'path=/tmp/test-hard3src=test state=link '
8、fetch从远程某主机获取文件到本地:
dest:用来存取文件的目录,例如存放目录为backup,源文件名称为/etc/profile,在主机
pythonserver中,那么保存为/backup/pythonserver/profile
Src:在远程拉取的文件,并且必须是一个file,不能是目录
ansible webserver -m fetch -a 'src=/var/log/messages dest=/root'
#从远程主机拉取目录到本地
9、 cron 管理cron计划任务
10、 yum安装软件
ansible webservers -m yum -a 'name=htop state=present' #安装htop
ansible all -m yum -a 'name=tree state=present' #安装tree
ansible all -m command -a 'tree' #查看是否有tree这个包
11.service:服务程序管理
arguents #命令行提供额外的参数
enabled #设置开机启动
name= #开机启动的级别,一般不用指定
sleep #started启动服务,stopped停止服务=,restarted重启服务,reloaded重载配置
12. usr模块管理
comment #用户的描述信息
createhome #是否创建家目录
force #在使用state=absent是,行为与userdel -force一致
group #指定基本组
groups # 指定附加组,如果指定为(groups=)表示删除所有组
home # 指定用户家目录
move_home # 如果设置为home=时, 试图将用户主目录移动到指定的目录
name # 指定用户名
non_unique # 该选项允许改变非唯一的用户ID值
password # 指定用户密码
remove # 在使用state=absent时, 行为是与userdel –remove一致
shell # 指定默认shell
state # 设置帐号状态,不指定为创建,指定值为absent表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid # 指定用户的uid
13. group用户组模块,添加或删除组
action :group
gid #设置组的GiD号
name= #管理组的名称
state #指定组状态,默认为创建,设置值为absent为删除
system #设置值为yes,表示为创建系统组
创建为tom的组
ansible web -m group -a 'name=tom state=present'
14. script在指定节点运行服务端的脚本
vim test.sh
#/bin/bash
touch /tmp/test.sh.log
echo "hello" >> /tmp/test.sh.log
#将date命令结果输出到/root/test.sh.log
15. setup模块
facts组件是Ansible用来采集被管机器设备信息的一个功能,我们可以使用setup模块查看机器的所有facts信息,可以使用filter来查看指定信息,整个facts信息被包裹在一个JSON格式的数据结构中,absible_facts是最上层的值facts就是变量,内建变量。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中,调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息在做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件
#ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主机内存信息
#ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口为eth0-2网卡信息
六、配置实例
Ansible playbook简介
playbook是ansible用于配置,部署,和管理被控节点的剧本。
通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状
态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点
必须要完成。
也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在
Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及
组织计算机处理各种各样的事情。
在mysql.yml中,主要由三个部分组成。
hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,
hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的
/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的
时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。
remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也
可以使用sudo,但是用户必须要有执行相应task的权限。
tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。
tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必
须的,同时也要给予模块相应的参数。
配置Ansible playbook
Yum install ansible -y
1.Vim /etc/ansible/hosts
[web]
172.17.250.2
172.17.250.3
2.ansible all -m ping #测试连通性
Ansible all -m ping
3.编辑Ansible playbook文件
4.测试,安装vsftpd包
5、安装nginx包
6、停止并卸载vsftpd服务