因某业务环境部署agent采集,且OS多为Linux,部分windows;基于负载及管理,制动化执行任务,任务临时性等特性,考虑采用ansible进行批量部署,因其是去中心化的,无需额外部署agent,对环境友好无侵入,安装维护容易,社区活跃和文档丰富,尤其适用于简单到中等规模的环境,自动化处理临时任务;
相关友情链接:ansible运维、官网、官方文档、中文手册、prometheus-ansible、/rulebook
ansible作为一款自动化运维工具,它是基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,Ansible主要由Paramiko和PyYAML两个关键模块构建。Ansible默认通过 SSH 协议管理客户机,可实现批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供了一种框架。它的主要组件包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;ansible基于连接插件连接到各个主机上,默认ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,如图示中的local 、ssh、zeromq ;
(2)、受管主机群host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;可以按应用类型等方式对Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作;其中,单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
(3)、各种模块核心模块、command模块、自定义模块;CoreModules:核心模块是通过调用核心模块来完成管理任务。CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本(非必需)执行多个任务时,可以让节点一次性运行多个任务。通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。
【产品优势】:
(1)、no agents:轻量级,不需要在被管控主机上安装任何客户端;更新时,只需在操作机上进行一次更新即可;因此,对云计算平台、大数据都有很好的支持;
(2)、no server:无服务器端,只需要安装ansible软件,配置完之后,使用时直接运行命令即可;
(3)、modules in any languages:基于模块工作,可使用任意语言开发模块;可使用python编写,维护更简单;模块是幂等性的,定义的任务已存在则不会做任何事情,意味着在同一台服务器上多次执行同一个playbook和执行一次,效果一样
(4)、yaml,not code:使用yaml语言定制剧本playbook;批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(5)、ssh by default:基于SSH工作;
(6)、strong multi-tier solution:可实现多级控制管理。
(7)、支持API及自定义模块,可通过Python轻松扩展;
(8)、另外Ansible还提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台;
ansible执行任务的2种模式:
1)ad-hoc模式:单模块,批量执行单条命令;
2)playbook模式:批量执行多个任务,多个任务完成一个大的功能,相当于多个ad-hoc的配置文件。
官方文档:http://www.ansible.com.cn/
【产品特性】:
1)跨平台支持
2)人类可读自动化:ansible提供linux、windows、unix和网络设备的无代理支持,适用于物理、虚拟、云和容器环境。
3)完美描述应用:playbook
4) 轻松管理版本控制:playbook是纯文本,可视作源代码。
5)支持动态清单。
6)编排可与其他系统轻松集成:puppet、jenkins。
7)基础架构即代码。
8)减少人为错误。任务、play和playbook设计为具有幂等性,所以在运行playbook时,如果目标主机处于正确状态,则不会进行任何更改。
3.1 架构了解和工作原理:
3.2 安装注意及资源要求
安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库.只要在一台电脑(可以是一台笔记本)上安装好,就可以通过这台电脑管理一组远程的机器。在远程被管理的机器上,不需要安装运行任何软件,因此升级Ansible版本不会有太多问题。Ansible一般每两个月出一个发行版本。
1)对管理主机测的要求:
目前,只要机器上安装了 Python 2.6 或 Python 2.7 (windows系统不可以做控制主机),都可以运行Ansible,主机的系统可以是 Red Hat, Debian, CentOS, OS X, BSD的各种版本,等等。
自2.0版本开始,ansible使用了更多句柄来管理它的子进程,对于MacOS X系统,你需要增加ulimit值才能使用15个以上子进程,方法 **sudo launchctl limit maxfiles 1024 2048,**否则你可能会看见”Too many open file”的错误提示.
2)对托/受管节点的要求:
通常我们使用 ssh 与托管节点通信,默认使用 sftp;如果 sftp 不可用,可在 ansible.cfg 配置文件中配置成 scp 的方式.,在托管节点上也需要安装 Python 2.4 或以上的版本,如果版本低于 Python 2.5 ,还需要额外安装一个模块:python-simplejson。
没安装python-simplejson,也可以使用Ansible的raw模块和script模块,因此从技术上讲,你可以通过Ansible的raw模块安装python-simplejson,之后就可以使用Ansible的所有功能了.如果托管节点上开启了SElinux,你需要安装libselinux-python,这样才可使用Ansible中与copy/file/template相关的函数。也可以通过Ansible的yum模块在需要的托管节点上安装libselinux-python。
Python 3 与 Python 2 是稍有不同,大多数Python程序还不能在 Python 3 中正确运行,一些Linux发行版(Gentoo, Arch)默认没有安装 Python 2.X 解释器,这时,你需要安装一个 Python 2.X 解释器,并在 inventory (详见 Inventory文件) 中设置 ‘ansible_python_interpreter’ 变量指向你的 2.X Python;Red Hat Enterprise Linux, CentOS, Fedora, and Ubuntu 等发行版都默认安装了 2.X 的解释器,包括几乎所有的Unix系统也是如此。你可以使用 raw’模块在托管节点上远程安装Python 2.X:
eg:ansible myhost --sudo -m raw -a “yum install -y python2 python-simplejson” ;这条命令可以通过远程方式在托管节点上安装 Python 2.X 和 simplejson 模块.
3)Ansible安装版本选择
Ansible一般每两个月出一个发行版本.小bugs一般在下一个发行版本中修复,并在稳定分支中做backports.大bugs会在必要时出一个维护版本,且也并不是很频繁。
如果当前使用的操作系统是 Red Hat Enterprise Linux ™, CentOS, Fedora, Debian, Ubuntu,建议使用系统的软件包管理器,即rpm 来安装最新版,或使用pip安装。
若希望跟进开发版本,想使用和测试最新的功能特性,可从源码运行Ansible,从源码运行程序不需要进行软件安装,直接运行即可。
最后再强调一次:Ansible的运行不要求root权限,也不依赖于其他软件,不要求运行后台进程,也不需要设置数据库。
4.1、Ansible的安装与配置
1)RedHat系列中Yum安装ansible环境:
2)下载ansible,选择相应的版本进行下载
软件地址:http://releases.ansible.com/ansible/
SHA:https://releases.ansible.com/ansible/ansible-2.9.21.tar.gz.sha
最新稳定版:
#对于Red Hat Enterprise Linux7的更新包只对注册的用户生效,所以需要自己手动改成Centos的更新包
rpm -qa | grep yum | xargs rpm -e --nodeps #不检查依赖关系,直接卸载,重新安装centos的yum软件包
如果yum安装,适用于 EPEL 6, 7,执行:
$ sudo yum -y install ansible //Fedora 用户可直接安装Ansible, 但RHEL或CentOS用户,需要配置 EPEL
$ apt-get install ansible //Ubuntu 、Debian,以及兼容发行版,完整命令见下文
注意:Fedora、RHEL、CentOS要配置epel源仓库。Ubuntu 源码安装最新版:
配置Epel源:
配置Pip源:
3)解压下载的文件并安装:
【ansible版本总结】:
4)控制端进行ssh免密钥登录设置(只在控制端使用)
5)Ansible默认安装好后有一个配置文件**/etc/ansible/ansible.cfg**,该配置文件中定义了ansible的控制主机的默认配置部分;(为防止数据混乱,建议建立新的配置文件和清单文件用来储存相关数据)
配置文件中包含有:默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等,默认的都是关闭,ansible上开启remote_port和private_key_file两个配置,修改:
remote_port = 22 ####用于连接远程ssh的端口
private_key_file = /root/.ssh/id_rsa_web ####用于免密码登陆的
6)ansible上默认清单文件为:/etc/ansible/hosts,该清单文件定义了hosts主机组(被控制主机,ansible将要管理的一批主机)
#vim /etc/ansible/hosts //一般我们使用的静态清单(常复制手动创建一份而不用默认的),即清单配置文件中每行一个,填写主机名或ip;类似如下:
[web] ##主机组名称
192.168.180.4
192.168.180.5
192.168.180.3
[db] ##主机组名称,注意:一台主机可以存在于多个主机组中
192.168.180.2
192.168.180.3
另外,ansible主机清单可以包含多个主机组构成的组,如:
[web]
rhel7_node2.cmcc.com
rhel8_node1.cmcc.com
192.168.43.30
[dbs]
server1.cmcc.com
server2.cmcc.com
192.168.43.30
[servers:children]
web
db
我们还可以通过指定主机名称或ip范围或者数字和字母范围来动态纳管更多主机:
语法:[START:END]
eg:192.168.43.[0:254] //匹配192.168.43.0/24 ip的主机
【动态清单】:可以从开源社区的脚本中获取
【自定义清单】:
#mkdir deploy-inventory ##建立清单目录
#vim inventory ##建立清单文件
#ansible all -i inventory --list-hosts ##列出inventory 清单所有受管主机
7)验证测试:
8)其他模块
#ansible-doc –l //查看更多模块,-s 模块名称,查看指定模块
- 文件模块:
-copy 将本地文件复制到其他受管主机
-file 设置文件的权限和其他属性
-lineinfile 确保特定行是否在文件中
-synchronize 使用rsync同步内容
- 系统模块:
-firewalld 使用firewalld管理任务端口和服务
-reboot 重启
-service 管理服务
-user 添加、删除和管理用户账户
- Net Tools模块:
-get_url 通过http 、https、或者ftp下载文件
-nmcli 管理网络
-uri 与web服务交互
- 其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。
service:系统服务管理
cron:计划任务管理
yum:yum软件包安装管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理
setup:用来查看远程主机的一些基本信息
ping:用来测试远程主机的运行状态;ansible-doc ping 可查看ping模块的帮助文档
file模块: 设置文件的属性,相关选项如下:
eg1:ansible web -m file -a “src=/etc/resolv.conf dest=/tmp/resolv.conf state=link” //远程主机上创建文件符号链接
eg2:ansible web -m command -a “ls -al /tmp/resolv.conf” //远程文件查看信息
eg3:ansible storm_cluster -m file -a “path=/tmp/resolv.conf state=absent” //远程文件符号链接删除
- copy模块: 复制文件到远程主机,相关选项如下:
eg1:#ansible web -m copy -a “src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644” //将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器,src=指明本地文件路径;dest=远程主机上用来引用的路径,通常是绝对路径;mode=指定权限onwer=指定属主,group=指定数组
eg2:#ansible web -m command -a “ls -al /tmp/ansible.cfg” // 远程文件信息查看
- command模块:在远程主机上执行命令;该模块通过-a跟上要执行的命令可以直接执行,不过命令里如果有带有如下字符部分则会执行不成功: “ so variables like $HOME and operations like “<”, “>”, “|”, and “&” will not work (use the shell module if you need these features).”;相关选项如下:
#ansible hostname -m ping //测试主机连通性
shell模块: 远程执行shell,需要在ansible服务器先在本地创建一个SHELL脚本,然后发送到托管主机上;用法其本和command一样,不过的是其是通过/bin/sh进行执行,所以shell 模块可以执行任何命令,就像在本机执行一样。
eg1:#ansible web -m copy -a “src=/tmp/rocketliu_test.sh dest=/tmp/rocketliu_test.sh owner=root group=root mode=0755” //将创建的脚本文件分发到远程
#ansible storm_cluster -m shell -a “/tmp/rocketliu_test.sh” // 远程执行
RAW模块:用法和shell 模块一样 ,其也可以执行任意命令,就像在本机执行一样,“Executes a low-down and dirty SSH command, not going through the module subsystem. There is no change handler support for this module. This module does not require python on the remote system”
script模块:其是将管理端的shell 在被管理主机上执行,其原理是先将shell 复制到远程主机,再在远程主机上执行,原理类似于raw模块,“This module does not require python on the remote system, much like the raw module.” ;raw模块和comand、shell 模块不同的是其没有chdir、creates、removes参数,chdir参数的作用就是先切到chdir指定的目录后,再执行后面的命令。
9)ansible命令:
ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块,但默认使用的模块是可以在ansible.cfg 中进行修改。
语法:ansible [options]
ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块;类似于centos下的yum、python下的pip或easy_install。
ansible-lint是对playbook的语法进行检查的一个工具。用法是ansible-lint playbook.yml
ansible-playbook该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作;
ansible-pull:该指令用于ansible的pull 模式
ansible-vault:主要应用于配置文件中含有敏感信息,vault可以帮你加密/解密这个配置文件;主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行。
11)命令示例:
详细示例可参看:https://blog.csdn.net/asd1992498/article/details/53884276?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-5.no_search_link&spm=1001.2101.3001.4242
4.2 源码安装
$ git clone git://github.com/ansible/ansible.git --recursive //GitHub仓库下载项目
$ cd https://blog.csdn.net/ximenjianxue/article/details/ansible
$ source https://blog.csdn.net/ximenjianxue/article/details/hacking/env-setup //加-p参数可抑制错误和告警输出
$ sudo easy_install pip //需先安装对应于你的Python版本的pip
$ sudo pip install paramiko PyYAML Jinja2 httplib2 six //安装相关的python模块,注意,当更新ansible版本时,不只要更新git的源码树,也要更新git中指向Ansible自身模块的 “submodules” (不是同一种模块)
$ git pull --rebase
$ git submodule update --init --recursive
一旦运行env-setup脚本,就意味着Ansible从源码中运行起来了.默认的inventory文件是 /etc/ansible/hosts.inventory文件也可以另行指定
$ echo “127.0.0.1” > ~/ansible_hosts
$ export ANSIBLE_HOSTS=~/ansible_hosts
$ ansible all -m ping --ask-pass //验证
我们可以自己创建RPM软件包.在Ansible项目的checkout的根目录下,或是在一个tarball中,使用 make rpm 命令创建RPM软件包. 然后可分发这个软件包或是使用它来安装Ansible.在创建之前,先确定你已安装了 rpm-build, make, and python2-devel :
$ git clone git://github.com/ansible/ansible.git
$ cd https://blog.csdn.net/ximenjianxue/article/details/ansible
$ make rpm
$ sudo rpm -Uvh ~/rpmbuild/ansible-*.noarch.rpm
$ make deb //从源码checkout中创建 Debian/Ubuntu 软件包
4.3 Pip安装
通过 Pip 安装最新发布版本,Ansible可通过 “pip” 安装(安装和管理Python包的工具);
$ sudo easy_install pip
$ sudo pip install ansible
4.4 配置文件
默认:/etc/ansible/ansible.cfg,有时使用 ~/.ansible.cfg代替前者;一般常用ansible命令所在目录的配置文件,https://blog.csdn.net/ximenjianxue/article/details/ansible.cfg(如果有)。
#ansible all -i inventory --list-hosts -v //显示当前使用的配置文件:
4.5、web管理界面工具Ansible Tower
CMDB:CMDB存储和管理者企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达到的目标;
PUBLIC/PRIVATE方式:Ansible除了丰富的内置模块外,同时还提供丰富的API语言接口,如PHP、Python、PERL等多种流行语言,基于PUBLIC/PRIVATE,Ansible以API调用的方式运行;
Ad-Hoc命令集:Users直接通过Ad-Hoc命令集调用Ansible工具集来完成任务;
Playbooks:Users预先编写好Ansible Playbooks,通过执行Playbooks中预先编排好的任务集,按序执行任务;
技术博客:https://www.ansible.com/blog
参考文档:http://www.ansible.com.cn/
Ansible官方文档:http://www.ansible.com.cn/index.html,https://docs.ansible.com/ansible/latest/index.html
相关视频:https://www.bilibili.com/video/BV1Cz411q7XN/?p=2&spm_id_from=pageDriver
5.1、远程管理执行命令
5.2、Playbook剧本编写
playbooks 是简单的配置管理系统与多机器部署系统的基础,playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务。Playbooks 采用YAML(YAML语法)格式编写,YAML文件的扩展名通常为.yaml或.yml。每一个 YAML 文件都是从一个列表开始.。列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”。另外, 所有的 YAML 文件(无论和 Ansible 有没有关系)开始行都应该是 —. 这是 YAML 格式的一部分, 表明一个文件的开始。列表中的所有成员都开始于相同的缩进级别, 并且使用一个 “- 成员name:” 作为开头(一个横杠和一个空格);一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)。总之,YAML其结构通过缩进来展示,通过“-”来代表项;“:”用来分隔键和值;所有的“-”和“:”后面均有空格,而且注意缩进和对齐,整个文件以“—”开头并以“…”结尾。
playbook 由一个或多个 ‘plays’ 组成.它的内容是一个以 ‘plays’ 为元素的列表。在 play 之中,一组机器被映射为定义好的角色.在 ansible 中,play 的内容,被称为 tasks,即任务.在基本层次的应用中,一个任务是一个对 ansible 模块的调用,以下是一个ansible的一个剧本示例: