2019独角兽企业重金招聘Python工程师标准>>>
自动化运维 工具
1、cobbler实现自动装机
2、saltstack实现工程自动化配置
3、kubernetes实现容器自动化编排
4、zabbix实现自动化监控
5、elastic实现应用日志自动化收集
6、jenkins实现开发持续化交付
自动化运维范围包括 : 安装自动化、部署自动化、监控自动化、发布自动化、升级自动化、安全管控自动化、优化自动化、数据备份自动化等。
自动化运维系统包括 : 商用自动化运维系统、开源自动化运维系统,自建(研发)自动化运维系统。
常见的自动化运维产品技术
ansible
Puppet
Chef
SaltStack
腾讯蓝鲸
Splunk
IBM
BMC
日志易
天旦
一、Ansible简介
Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack。Ansible 是通过 Python 语言开发。Ansible 平台由 Michael DeHaan 创建,他同时也是知名软件 Cobbler 与 Func 的作者。Ansible 的第一个版本发布于 2012 年 2 月。Ansible 默认通过 SSH 协议管理机器,所以 Ansible 不需要安装客户端程序在服务器上。
Ansible是一种配置和管理工具,面向客户端的软件部署和配置,支持Unix、Linux和Windows。它使 用JSON和YAML,而不是IAC,根本不需要节点代理就可以安装。它可以通过OpenStack在内部系统上使用,也可以在亚马逊EC2上使用。
Ansible 可以从中央控制节点统一配置服务器、安装软件或执行各种 IT 任务。它采用一对多、无客户端的机制,从控制节点上通过 SSH 发送指令给远端的客户机来完成任务(当然除了 SSH 外也可以用别的协议)。
Ansible是新出现的运维工具是基于Python研发的综合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。在进行大规模部署时,手工配置服务器环境是不现实的,这时必须借助于自动化部署工具。
Ansible 是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用 SSH 进行远程连接。无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展。
Ansible作为一款灵活、高效、功能丰富的自动化部署工具在企业运维管理中备受推崇。经过测试,我来使用ansible部署小型企业服务框架,实现高可用、负载均衡的目标。如有错误敬请赐教。
Ansible基本架构
上图为ansible的基本架构,从上图可以了解到其由以下部分组成:
核心:ansible
核心模块(Core Modules):这些都是ansible自带的模块
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
插件(Plugins):完成模块功能的补充
剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
主机群(Host Inventory):定义ansible管理的主机
Ansible工作原理
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
安装完ansible后,ansible一共提供了七个指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。查看usage部分,详细部分可以通过 "指令 -h" 的方式获取。
常见的自动化运维工具 : Fabric、Puppet、Chef、SaltStack、Ansible。
Ansible 中小企业高可用负载均衡部署方案拓扑图 :
前端代理层由两台nginx实现,并安装keepalived实现地址滑动达成高可用。 web层由两套Apache+PHP+WordPress 构建应用环境。
相关链接:https://www.ansible.com
Ansible特性
(1)no agents :不需要在被管控主机上安装任务客户端 ;
(2)no server : 无服务器端,使用时直接运行命令即可;
(3)modules in any languages : 基于模块工作,可使用任意语言开发模块;
(4)yaml. not code : 使用yaml语言定制剧本playbook;
(5)ssh by default : 基于SSH工作;
(6)strong multi-tier solution : 可实现多级指挥;
Ansible优点
(1)轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
(2)批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
(3)使用python编写,维护更简单,ruby语法过于复杂;
(4)支持sudo。
(5) 无代理,部署简单。
(6) 模块丰富,覆盖面较广,使用场景较多。
(7) 社区热度高,资料丰富。
Ansible的缺点是:
一、性能相对较弱,需要优化或更改连接模式提升性能。
二、HPUX、WindowsServer08支持较弱。
三、对于中文环境依旧存在一些弊端。
四、日志记录功能不够强大。
五、基于幂等设计,回退机制弱。
优缺点分析:优点是模块可以用任何语言开发、备管节点不需要安装代理软件、有Web管理界面、安装运行简单,缺点是对windows备管节点需要加强、执行效率相对较低。
下图是Puppet、Saltstack、Ansible这三款运维工具处理能力与处理效率的对比:
区别 : Puppet适用于软件自动化配置和部署;SaltStack适用于基础设施管理,在几分钟内可运行起来,很容易管理上万台服务器,速度够快;Ansible适用于批量操作系统配置、批量程序的部署、批量运行命令等。
Ansible基本架构
组成部分 :
核心:ansible
核心模块(Core Modules):这些都是ansible自带的模块
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
插件(Plugins):完成模块功能的补充
剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
主机群(Host Inventory):定义ansible管理的主机
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
(6)、Ansible常用模块command、shell、copy、cron、fetch、file、service、user、 setup等模块
(7)、Anshible playbook(剧本)核心元素Hosts、Tasks、Variables、Templaters、 Handlers、Roles
(8)、Puppet高级用法:安装配置puppet-dashboard、Puppet kick功能实现
(9)、目前主流的自动化运维工具有puppet、ansible、saltstack。
(10)、如果考虑到快速使用,建议puppet,有一个foreman做web平台,上手快。
(11)、ansible主要是远程命令执行,比较适合做“一次性”的工作。统部署、应用发布、打补丁等等。
注意:
在企业中使用ansible,要注意以下几点:
1. 安全控制,简单来说就是避免用root用户来执行。
2. 控制好依赖 在写playbook的时候,控制好先后顺序和依赖关系。
3. 结果的收集和分析 因为一下子几百台机器一起干活,所以,就要自己写外置脚本,更好地收集ansible的操作结果,并且进行直观的汇总和展现。
Ansible工作原理
1、管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
2、可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
3、管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
ansible的七个命令
安装完ansible后,发现ansible一共提供了七个指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。只查看usage部分,详细部分可以通过 "指令 -h" 的方式获取。
1、ansible
[root@localhost ~]# ansible -h
Usage: ansible [options]
ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。如:
[[email protected] ~]# ansible 192.168.0.102 -a 'date'
192.168.0.102 | success | rc=0 >>
Tue May 12 22:57:24 CST 2015
不过默认使用的模块是可以在ansible.cfg 中进行修改的。ansible命令下的参数部分解释如下:
2、ansible-doc
ansible-doc -h
Usage: ansible-doc [options] [module...]
该指令用于查看模块信息,常用参数有两个-l 和 -s ,具体如下:
//列出所有已安装的模块
# ansible-doc -l
//查看具体某模块的用法,这里如查看command模块
# ansible-doc -s command
3、ansible-galaxy
ansible-galaxy -h
Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
ansible-galaxy 指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip或easy_install 。如下示例:
[root@localhost ~]# ansible-galaxy install aeriscloud.docker
- downloading role 'docker', owned by aeriscloud
- downloading role from https://github.com/AerisCloud/ansible-docker/archive/v1.0.0.tar.gz
- extracting aeriscloud.docker to /etc/ansible/roles/aeriscloud.docker
- aeriscloud.docker was installed successfully
这个安装了一个aeriscloud.docker组件,前面aeriscloud是galaxy上创建该模块的用户名,后面对应的是其模块。在实际应用中也可以指定txt或yml 文件进行多个组件的下载安装。这部分可以参看官方文档。
4、ansible-lint
ansible-lint是对playbook的语法进行检查的一个工具。用法是ansible-lint playbook.yml 。
5、ansible-playbook
该指令是使用最多的指令,其通过读取playbook 文件后,执行相应的动作,这个后面会做为一个重点来讲。
6、ansible-pull
该指令使用需要谈到ansible的另一种模式---pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;你要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。这部分也会单独做一节来讲。
7、ansible-vault
ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 --ask-vault-pass参数,同样需要输入密码后才能正常执行。(来源:361way)
Ansible使用的模块与对应的软件的应用
系统层:Linux、Windows、AIX等,对应的模块有acl、cron、pip、yum、shell、command、file、copy、user、lvol等等。
虚拟化:OpenStack、VMware、Docker、CloudStack、LXC等,对应的模块glance_image、os_server、vmware_vmkernel、docker等等。
商业化软件:F5、ASA、Citrix、Eos等
系统应用层:Apache、Jboss、Zabbix、Rabbitmq、SVN、GIT、Mysql、Mariadb等,对应的模块apache2_module、jboss、zabbix_group、rabbitmq_binding、subversion、git等
Ansible与Puppet和Saltstack的对比
GitHub社区活跃度:
Ansible运行任务的方式
1、Ad-hoc - ansible命令
2、Playbook - YAML
Ad-hoc
ansible主机或组 -m模块名-a'模块参数' ansible参数
• 主机和组 : 是在/etc/ansible/hosts里面进行指定的部分,动态Inventory使用的是脚本从外部应用里面获取的主机
• 模块名 : 可以通过ansible-doc -l 查看目前安装的模块,默认不指定时,使用的是command模块,具体可以查看/etc/ansible/ansible.cfg的”#module-name = command“ 部分,默认模块可以在配置文件中进行修改
• 模块参数 : 可以通过 ”ansible-doc -s ,模块名“查看具体的用法及后面的参数
• ansible参数 : 可以通过ansible命令的帮助信息李查看到,这里有很多参数可以供选择,如是否需要输入密码、是否sudo等。
Ansible常用模块使用
ping模块
ansible all -m ping
command模块
ansible all -m command -a "uptime"
shell模块
ansible all -m shell -a "cat /dev/null > /var/log/nginx/access.log"
yum模块
ansible all -m yum -a "name=telnet state=present"
service模块
ansible all -m service -a "name=nginx state=retarted"
copy模块
ansible all -m copy -a "src=root/nginx.conf desc=/etc/nginx/nginx.conf owner=nginx group=nginx mode=644"
unarchive模块
ansible all -m unarchive -a "src=java7.tar.gz copy=yes dest=/usr/java owner=root group=root"
file模块
ansible all -m file "src=/usr/java/jdk1.7 dest=/usr/java/jdk state=link owner=root"
lineinfle模块
ansible all -m lineinfile -a "dest=/etc/hosts line='10.10.31.181 db1'"
replace模块
ansible all -m replace -a "path=/etc/hosts regexp='^10.10' replace='10.12'"
Ansible的应用场景
批量变更
主要应用在Linux操作系统上,根据实际运维需要我们应用在Agent批量安装、用户批量开设、配置批量更新等方面。
使用最多的是Zabbix和Flume的Agent批量安装,特别是Zabbix使用Ansible工具特别方便,除了安装Agent之外,批量更改配置非常方便,如使用Zabbix服务器或代理服务器地址更换、自定义Key的新增调整等等。
在使用Ansible进行批量变更的时候,需要保证代码进行充分测试,虽然Ansible在使用上非常简单,但回退机制较弱。比如文件的批量更新,虽然可以进行备份,但无法将备份批量进行回退。
基础设施即代码的概念中最困难的一点是碎片服务器,由于存在大量的存量服务器,所以这个问题无法避免。这就需要企业内部使用Ansible的时候一定要将Ansible作为一种软件代码进行管理,建立开发测试发布机制,保证代码充分测试。在批量变更的时候寻找不同类型的设备进行试点后再逐步推送。如果使用Ansible进行过一次推送后,碎片的问题基本就不是问题了,今后可以较为放心的反复更新。
软件安装
除了批量变更之外,Ansible主要是实现基础软件的安装,比如mysql、oracle、jboss等等。在使用Ansible安装此类软件时将配置独立出来,这样可以根据用户需求获取不同参数,以实现不同配置的软件。
环境交付
除了批量变更之外,Ansible主要是实现基础软件的安装,比如mysql、oracle、jboss等等。
在环境交付层面,由于Ansible是基于操作系统或是虚拟化云平台的,所以在裸机部署上并不适用。在虚拟化云平台上,通过Ansible基于OpenStack和VMWare的模块开设实例和虚机以及挂盘,完成虚机的下放后,再进行软件的安装。从Ansible的Playbook的设计上只需要将下放虚机挂盘操作作为一部分再集成前述的软件安装部分即可。下放虚机挂盘的操作也可以由自动化运维平台中集成各个虚拟化平台的命令完成。
最后呈现的形式由用户递交环境申请信息,标注需要什么配置的服务器、几台、需要安装什么样的软件。递交申请审批通过,由自动化平台自动运行部署后交付至用户。
主机信息自动发现
利用Ansible的现成连接通道以及自带的facts模块,实现主机信息的自动发现和更新功能,并将这些信息定期更新至配置平台中,以辅助配置平台的数据准确性。由于Ansible的facts模块采集的信息有限,且基于Linux、HPUX以及Windows采集的内容也稍有不同,所以还是需要一些本地化的程序辅助。
Facts中可以采集的信息主要包含了主机的一些基础信息,如主机名、IP地址、网卡信息、CPU、MEM以及操作系统版本等信息。而从需求出发,我们可能还关注基础软件的版本信息、文件系统以及用户的信息等等。所以需要根据需求定义一些程序以获取这些信息。
目前采用如下图,设计方法获取主机信息,根据需求编制Ansible的模块,比如获取用户的信息,定义新的模块,定义完成后即形成新的AnsibleAD-HOC命令,通过一段程序获取所有受控的主机的facts以及自定义的信息之后将其入库,并同步更新至CMDB库。运维人员自己就可以根据自身的需求去定义需要的信息,并且将其入库,无需专业的开发人员实施。
Ansible主要是应用的发布和变更,利用Ansible本身与Git结合的能力.
Foreman的作用是什么?
foreman是基于puppet的一个“增强工具”,主要能够帮到我们运维狗的有:
1. 操作系统的部署
foreman提供了一个基于kickstart的部署工具,输入一台服务器的部署网卡的mac地址和hostname、ip等信息,就能自动的帮我们部署完,并且,还可以生成一个部署iso,用于该服务器的重新部署。
2. puppet的节点管理(ENC)
原声的puppet管理节点分类以及节点和puppet类之间的映射靠文件描述,企业客户更希望有一个直观的工具,foreman可以通过Web界面将节点分组,将类分组,并且构建两者的映射关系。
3. puppet的Web界面
有个Web总是比命令行要方便,foreman提供了一个还算的过去的web界面,用于节点管理、类管理、变量管理、配置管理、部署管理等功能。
如何利用foreman呢?
前面几个项目都是基于foreman进行扩展的,当时学习ruby,做需求分析,苦逼的用ruby实现功能,当时实现了自动化的安全检查、系统升级等功能。
后来客户需求越来越多,我们觉得不能局限于foreman的限制,就开始利用foreman的REST API实现功能的扩展,保证一个干净、原生的foreman。
foreman给我们的一个很大帮助就是,他把所有的配置、fact结果、运行结果什么都放到了mysql数据库里,所以,我们在做一些运行分析的时候,可以直接从数据库中获取数据进行分析即可。
foreman帮我们搞定了节点管理、数据入库,剩下的就是你的想象力了。
puppet的fact机制是什么,如何利用fact?
fact就是puppet的一个组件,这个组件以一堆ruby脚本的形式存在在被管理服务器上,每次运行puppet命令的时候,都会先执行这一堆脚本,获得一堆变量=>值对,然后返回给服务器。
可以在一个安装了puppet的服务器上执行facter命令:
[root@fm-server ~]# facter
architecture => x86_64
augeasversion => 1.0.0
bios_release_date => 12/01/2006
bios_vendor => innotek GmbH
bios_version => VirtualBox
......
interfaces => eth0,lo
ipaddress => 192.168.56.30
ipaddress_eth0 => 192.168.56.30
ipaddress_lo => 127.0.0.1
is_virtual => true
kernel => Linux
kernelmajversion => 3.8
kernelrelease => 3.8.13-44.1.1.el6uek.x86_64
kernelversion => 3.8.13
具体脚本的位置在:/usr/lib/ruby/site_ruby/1.8/facter/ 这个目录中,有兴趣的同学可以自己看看。
系统默认了将近100个fact变量,实际上我们也可以自己扩展自己需要的fact变量,扩展fact有4种方法:
1. 直接在/usr/lib/ruby/site_ruby/1.8/facter/目录中自己写一个fact脚本,看看其他的怎么写的,比划着写就行了
2. 自己随便找个目录,把你自己的ruby脚本放到哪个目录中,然后定义变量:export FACTERLIB=/mypuppet/myfact/,脚本写法同上
3. fact支持外部fact,这个定义写在了/usr/lib/ruby/site_ruby/1.8/facter/util/config.rb文件中:
@external_facts_dirs = ["/opt/puppetlabs/facter/facts.d",
"/etc/facter/facts.d",
"/etc/puppetlabs/facter/facts.d"]
把你的fact定义放到那些目录中(可能需要自己创建),fact定义支持txt、yaml、json、sh四种方式,我比较喜欢用sh:
[root@fm-server ~]# mkdir -p /etc/facter/facts.d
[root@fm-server ~]# cd /etc/facter/facts.d/
[root@fm-server facts.d]# vi test.sh
#!/bin/bash
echo "testfact=Test"
[root@fm-server facts.d]# chmod 755 test.sh
[root@fm-server facts.d]# facter |grep test
testfact => Test
4. 用pluginsync发布,这个方法我用的很少,因为太麻烦了,我是极简主义者
对于自定义facter,大家可以参考
https://docs.puppetlabs.com/facter/3.1/fact_overview.html
找到了这个机制,我们如何利用facter呢? 通常来说,有2个用法:
1. 使用fact变量来实现配置的自动调节
例如apache服务器,希望按照cpu的核数调整并发的进程数
fact变量中有一个:
[root@fm-server ~]# facter |grep process
physicalprocessorcount => 1
processor0 => Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
processorcount => 1
processors => {"physicalcount"=>1, "count"=>1, "models"=>["Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz"]}
就可以在apache的puppet类中写:
StartServers <%= @processorcount.to_i*12 %>
这样不同的服务器的apache的启动进程就不同了
2. 利用fact收集想收集的信息
这个在自定义配置中已经讲了方法,反正是shell脚本,你想干啥就干啥,
foreman会把fact入库,你可以很方便的通过api或者直接访问数据库来获得你想要的数据。
您只需要将 Ansible 安装在一台服务器,在 Ansible 安装完后,您就可以去管理控制其它服务器。不需要为它配置数据库,Ansible 不会以 daemons 方式来启动或保持运行状态。Ansible 可以实现以下目标:
-
自动化部署应用
-
自动化管理配置
-
自动化的持续交付
-
自动化的(AWS)云服务管理。
Linux中的官方源、镜像源汇总。:https://mp.weixin.qq.com/s?__biz=MzU5NDU0NTY4NQ==&mid=2247483940&idx=1&sn=7f3527d0e5004dcf7b0ee82cf38073ff&scene=21#wechat_redirect
根据 Ansible 官方提供的信息,当前使用 Ansible 的用户有:evernote、rackspace、NASA、Atlassian、twitter 等。
另一个centOS 的安装:https://my.oschina.net/kangvcar/blog/1830155
Ansible架构模式
Ansible是由控制机和被管理机组成:控制机是用来安装Ansible工具软件和执行指令的服务器,被管理机是指运行业务的服务器,由控制机通过SSH进行管理。
Ansible管理方式
Ansible是一个模型驱动管理器,支持多节点发布,远程任务执行,默认使用SSH远程连接,无需在被管理节点上安装附加软件。
Ansible系统架构
Ansible集合了许多运维工具,实现了批量系统配置、批量程序部署,批量运行命令等功能,Ansible是基于模块工作的,本身没有批量部署的能力,真正干活的Ansible所运行的模块,Ansible只提供一种框架。
Ansible功能特性
-
应用代码自动化部署;
-
系统管理配置自动化;
-
支持云计算、大数据平台;
-
轻量级无需安装agent;
-
批量任务执行可用脚本无需分发到远程;
-
支持非root用户和sudo;
Ansible任务执行流程
Ansible系统由控制主机对被管节点的操作方式可分为两类(ad-hoc)和(playbook)
-
ad-hoc支持单个模块,支持批量执行单条命令;
-
playbook通过多个task集合完成一类功能,可以理解为通过组合多条ad-hoc操作的配置文件;
三、Ansible的安装(centos7)
Ansible的安装方式非常灵活,满足各种环境的部署需求。
1、YUM安装
安装epel作为Ansible的默认yum源
#以CentOS7.2安装阿里的epel为例
rpm -Uvh https://mirrors.aliyun.com/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
其他源可参考:
Linux中的官方源镜像源汇总
安装Ansible
yum install -y ansible
2、Ansible配置参数
配置文件在:/etc/ansible/ansible.cfg
参考:http://www.ansible.com.cn/docs/intro_configuration.html#config-values-by-section
inventory
这个参数表示资源清单 . inventory文 件 的 位 置 , 资源清单就是 一些Ansible需要连接管理的主机列表 。
实例如下:
inventory == /etc/Ansible/hosts
library
Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块 , 这个library参数就是指向存放Ansible模块的 目录 。
实例如下:
library = /usr/share/Ansible
Ansible支持多个记录方式,只要用W号(:)隔幵就可以,同时也会检査当前执行playbook位罝下的•/library目录。
forks
默认悄况下Ansible最多能有多少个进程同时丁-作,默认设置敁多5个 进程并进行理 。 具体需要设置多少个,可以根据控制主机的性能和被管节点的数诂来确定,可能是50或100,默认值5是非常保守的设置。
实例如下:
forks = 5
sudo_user
这是设罝默认执行命令的用户,也可以在playbook中重新设置这个参数。
实例如下:
sudo_user = root
remote_port
这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端门.不然这个参数一般是不需要修改的。
实例如下:
remote_port = 22
host_key_checking
这是设置是否检査SSH主机的密钥。可以设置为True或False。
实例如下:
host_key_checking = False
timeout
这是设置SSH连接的超时间隔,单位是秒。
实例如下:
timeout = 60
log_path
Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录 到日志文件,需要设置log_ path指定一个存储Ansible日志的文件 。
实例如下:
log__path = /var/log/Ansible. log
注意:
执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现在日志中的。
三、Ansible的安装(centos6.8)
1、yum源安装
以centos为例,默认在源里没有ansible,不过在fedora epel源里有ansible,配置完epel 源后,可以直接通过yum 进行安装。这里以centos6.8为例:
# yum install http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install ansible
2、apt-get安装
在ubuntu及其衍生版中,可以通过增加ppa源进行apt-get安装,具体如下:
$ 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时,报错如下:
# 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进行安装。
b、安装完ansible是,报错如下:
[root@localhost ansible-1.9.1]# ansible -h
Traceback (most recent call last):
File "/usr/local/src/ansible-devel/bin/ansible", line 36, in
from ansible.runner import Runner
File "/usr/local/src/ansible-devel/lib/ansible/runner/__init__.py", line 62, in
from Crypto.Random import atfork
File "/usr/lib64/python2.6/site-packages/Crypto/Random/__init__.py", line 29, in
from Crypto.Random import _UserFriendlyRNG
File "/usr/lib64/python2.6/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 38, in
from Crypto.Random.Fortuna import FortunaAccumulator
File "/usr/lib64/python2.6/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.py", line 39, in
import FortunaGenerator
File "/usr/lib64/python2.6/site-packages/Crypto/Random/Fortuna/FortunaGenerator.py", line 34, in
from Crypto.Util.number import ceil_shift, exact_log2, exact_div
File "/usr/lib64/python2.6/site-packages/Crypto/Util/number.py", line 56, in
if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
AttributeError: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
import paramiko包时,报错如下:
>>> import paramiko
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python2.6/site-packages/paramiko/__init__.py", line 69, in
from transport import randpool, SecurityOptions, Transport
File "/usr/lib/python2.6/site-packages/paramiko/transport.py", line 32, in
from paramiko import util
File "/usr/lib/python2.6/site-packages/paramiko/util.py", line 32, in
from paramiko.common import *
File "/usr/lib/python2.6/site-packages/paramiko/common.py", line 98, in
from rng import StrongLockingRandomPool
File "/usr/lib/python2.6/site-packages/paramiko/rng.py", line 22, in
from Crypto.Util.randpool import RandomPool as _RandomPool
File "/usr/lib64/python2.6/site-packages/Crypto/Util/randpool.py", line 30, in
import Crypto.Random
File "/usr/lib64/python2.6/site-packages/Crypto/Random/__init__.py", line 29, in
from Crypto.Random import _UserFriendlyRNG
File "/usr/lib64/python2.6/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 38, in
from Crypto.Random.Fortuna import FortunaAccumulator
File "/usr/lib64/python2.6/site-packages/Crypto/Random/Fortuna/FortunaAccumulator.py", line 39, in
import FortunaGenerator
File "/usr/lib64/python2.6/site-packages/Crypto/Random/Fortuna/FortunaGenerator.py", line 34, in
from Crypto.Util.number import ceil_shift, exact_log2, exact_div
File "/usr/lib64/python2.6/site-packages/Crypto/Util/number.py", line 56, in
if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
AttributeError: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
经网上查找,确认为pycrypto包安装时依赖的GMP版本不对的问题,具体可以通过以下步骤验证:
[root@localhost pycrypto-2.6.1]# python setup.py build
running build
running build_py
running build_ext
running build_configure
warning: GMP or MPIR library not found; Not building Crypto.PublicKey._fastmath.
解决方法:
打开 /usr/lib64/python2.6/site-packages/Crypto/Util/number.py 文件,可以 看到 56 行上的注释说明,要求 libgmp 为 v5 以上版本。而系统现有版本为 4.1.4,把以下两行暂时注释掉,Ansible 执行正常。
if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
_warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack
vulnerability.", PowmInsecureWarning)
不过,此方法只是临时加以解决,更好的方式是去将 libgmp 升级到符合要求的版本。
c、执行时报错
[root@localhost src]# ansible test -m raw -a 'uptime'
10.212.52.14 | FAILED => to use the 'ssh' connection type with passwords, you must install the sshpass program
10.212.52.16 | FAILED => to use the 'ssh' connection type with passwords, you must install the sshpass program
安装sshpass程序。默认源里没有,我这里选择直接从sohu源里下载安装。
三、Ansible的配置与验证
这里以pypi上下载的源码内有一个examles包,可以将使用该示例文件做为默认配置,具体如下:
[root@localhost ansible-1.9.1]# mkdir -p /etc/ansible
[root@localhost ansible-1.9.1]# cp -rp examples/* /etc/ansible/
[root@localhost ansible-1.9.1]# cd /etc/ansible/
使用默认示例配置文件后,编辑/etc/ansible/hosts文件,通过以下方式验证ansible是否可用:
[root@localhost .com ~]# cat /etc/ansible/hosts
[test]
10.212.52.252 ansible_ssh_user=root ansible_ssh_pass=361way.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参数在操作前询问手动输入密码。
[root@localhost ~]# ansible test -a 'uptime'
10.212.52.252 | success | rc=0 >>
18:01pm up 21 days 3:24, 3 users, load average: 0.39, 0.38, 0.35
10.212.52.16 | success | rc=0 >>
18:09pm up 329 days 1:01, 2 users, load average: 0.08, 0.03, 0.05
10.212.52.14 | success | rc=0 >>
18:08pm up 329 days 0:23, 2 users, load average: 0.06, 0.06, 0.05
执行以上指令后,有结果输出,证明安装成功。
ansible常用模块
一、ping模块
测试主机是否是通的,用法很简单,不涉及参数:
[root@localhost ~]# ansible 10.212.52.252 -m ping
10.212.52.252 | success >> {
"changed": false,
"ping": "pong"
}
二、setup模块
setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):
[root@localhost ~]# ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb'
//查看主机内存信息
[root@localhost ~]# ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]'
//查看地接口为eth0-2的网卡信息
[root@localhost ~]# ansible all -m setup --tree /tmp/facts
//将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中
(/etc/ansible/hosts里的主机名)
三、file模块
file模块主要用于远程主机上的文件操作,file模块包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
-
group:定义文件/目录的属组
-
mode:定义文件/目录的权限
-
owner:定义文件/目录的属主
-
path:必选项,定义文件/目录的路径
-
recurse:递归的设置文件的属性,只对目录有效
-
src:要被链接的源文件的路径,只应用于state=link的情况
-
dest:被链接到的路径,只应用于state=link的情况
-
state: directory:如果目录不存在,创建目录
-
file:即使文件不存在,也不会被创建
-
link:创建软链接
-
hard:创建硬链接
-
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
-
absent:删除目录、文件或者取消链接文件
使用示例:
ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
ansible test -m file -a "path=/tmp/fstab state=absent"
ansible test -m file -a "path=/tmp/test state=touch"
四、copy模块
复制文件到远程主机,copy模块包含如下选项:
-
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
-
content:用于替代"src",可以直接设定指定文件的值
-
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
-
directory_mode:递归的设定目录的权限,默认为系统默认权限
-
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
-
others:所有的file模块里的选项都可以在这里使用
-
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
-
validate :The validation command to run before copying into place. The path to the file to validate is passed in via '%s' which must be present as in the visudo example below.
示例如下:
ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644"
ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"
ansible test -m copy -a "src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'"
五、service模块
用于管理服务
该模块包含如下选项:
-
arguments:给命令行提供一些选项
-
enabled:是否开机启动 yes|no
-
name:必选项,服务名称
-
pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
-
runlevel:运行级别
-
sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
-
state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
使用示例:
# Example action to reload service httpd, in all cases
- service: name=httpd state=reloaded
# Example action to enable service httpd, and not touch the running state
- service: name=httpd enabled=yes
# Example action to start service foo, based on running process /usr/bin/foo
- service: name=foo pattern=/usr/bin/foo state=started
# Example action to restart network service for interface eth0
- service: name=network state=restarted args=eth0
六、cron模块
用于管理计划任务
包含如下选项:
-
backup:对远程主机上的原任务计划内容修改之前做备份
-
cron_file:如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
-
day:日(1-31,,/2,……)
-
hour:小时(0-23,,/2,……)
-
minute:分钟(0-59,,/2,……)
-
month:月(1-12,,/2,……)
-
weekday:周(0-7,*,……)
-
job:要执行的任务,依赖于state=present
-
name:该任务的描述
-
special_time:指定什么时候执行,参数: reboot,yearly,annually,monthly,weekly,daily,hourly
-
state:确认该任务计划是创建还是删除
-
user:以哪个用户的身份执行
示例:
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible test -m cron -a 'name="yum autoupdate" weekday="2" minute=0 hour=12 user="root
ansible 10.212.52.252 -m cron -a 'backup="True" name="test" minute="0" hour="2" job="ls -alh > /dev/null"'
ansilbe test -m cron -a 'cron_file=ansible_yum-autoupdate state=absent'
七、yum模块
使用yum包管理器来管理软件包,其选项有:
-
config_file:yum的配置文件
-
disable_gpg_check:关闭gpg_check
-
disablerepo:不启用某个源
-
enablerepo:启用某个源
-
name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
-
state:状态(present,absent,latest)
示例如下:
ansible test -m yum -a 'name=httpd state=latest'
ansible test -m yum -a 'name="@Development tools" state=present'
ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/
nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present'
八、user模块与group模块
user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令,具体参数这里不再细讲,直接上示例。
1、user模块示例:
- user: name=johnd comment="John Doe" uid=1040 group=admin
- user: name=james shell=/bin/bash groups=admins,developers append=yes
- user: name=johnd state=absent remove=yes
- user: name=james18 shell=/bin/zsh groups=developers expires=1422403387
#生成密钥时,只会生成公钥文件和私钥文件,和直接使用ssh-keygen指令效果相同,
不会生成authorized_keys文件。
- user: name=test generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa
注:指定password参数时,不能使用后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中,所以需要先将密码字符串进行加密处理。然后将得到的字符串放到password中即可。
[root@localhost ~]# openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32)
Password:
$1$YngB4z8s$atSVltYKnDxJmWZ3s.4/80
或者
[root@localhost ~]# echo "123456" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]'
| head -c 32) -stdin
$1$4P4PlFuE$ur9ObJiT5iHNrb9QnjaIB0
#经验证下面生成的密码串也可以正常使用,不过与/etc/shadow的格式不统一,不建议使用
[root@localhost ~]# openssl passwd -salt -1 "123456"
-1yEWqqJQLC66
#使用上面的密码创建用户
[root@localhost ~]#ansible all -m user -a 'name=foo password="$1$4P4PlFuE$ur9ObJiT5iHNrb9QnjaIB0"'
不同的发行版默认使用的加密方式可能会有区别,具体可以查看/etc/login.defs文件确认,centos 6.5版本使用的是SHA512加密算法,生成密码可以通过ansible官方给出的示例:
python -c "from passlib.hash import sha512_crypt;
import getpass;
print sha512_crypt.encrypt
(getpass.getpass())"
2、group示例
- group: name=somegroup state=present
九、synchronize模块
使用rsync同步文件,其参数如下:
-
archive: 归档,相当于同时开启recursive(递归)、links、perms、times、owner、group、-D选项都为yes ,默认该项为开启
-
checksum: 跳过检测sum值,默认关闭
-
compress:是否开启压缩
-
copy_links:复制链接文件,默认为no ,注意后面还有一个links参数
-
delete: 删除不存在的文件,默认no
-
dest:目录路径
-
dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议
-
dirs:传速目录不进行递归,默认为no,即进行目录递归
-
rsync_opts:rsync参数部分
-
set_remote_user:主要用于/etc/ansible/hosts中定义或默认使用的用户-与rsync使用的用户不同的情况
-
mode: push或pull 模块,push模的话,一般用于从本机向远程主机上传文件,
-
pull 模式用于从远程主机上取文件
另外还有其他参数,这里不再一一说明。上几个用法:
src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
src=some/relative/path dest=/some/absolute/path archive=no links=yes
src=some/relative/path dest=/some/absolute/path checksum=yes times=no
src=/tmp/helloworld dest=/var/www/helloword rsync_opts=--no-motd,--exclude=.git mode=pull
十、mount模块
配置挂载点
选项:
-
dump
-
fstype:必选项,挂载文件的类型
-
name:必选项,挂载点
-
opts:传递给mount命令的参数
-
src:必选项,要挂载的文件
-
state:必选项present:只处理fstab中的配置
-
absent:删除挂载点
-
mounted:自动创建挂载点并挂载之'
-
umounted:卸载
示例:
name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present
name=/srv/disk src='LABEL=SOME_LABEL' state=present
name=/home src='UUID=b3e48f45-f933-4c8e-a700-22a159ec9077' opts=noatime state=present
ansible test -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'
ansible test -a 'losetup /dev/loop0 /disk.img'
ansible test -m filesystem 'fstype=ext4 force=yes opts=-F dev=/dev/loop0'
ansible test -m mount 'name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw'
十一、get_url 模块
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget),主要有如下选项:
-
sha256sum:下载完成后进行sha256 check;
-
timeout:下载超时时间,默认10s
-
url:下载的URL
-
url_password、url_username:主要用于需要用户名密码进行验证的情况
-
use_proxy:是事使用代理,代理需事先在环境变更中定义
示例:
- name: download foo.conf
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
- name: download file with sha256 check
get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf sha256sum=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
模块部分就先介绍到这里吧,官方提供的可能用到模块有git、svn版本控制模块,sysctl 、authorized_key_module系统模块,apt、zypper、pip、gem包管理模块,find、template文件模块,mysql_db、redis数据库模块,url 网络模块等。具体可以参看官方手册模块部分;
Ansible模块大全
ansible主要文件
(/etc/ansible/ansible.cfg)
ansible主配置文件。
(/etc/ansible/hosts)
主机清单,保存管理的主机信息。
(/etc/ansible/roles)
公共角色,主要在自动化部署多台主机时应用。
ansible命令集
ansible
定义并运行简单任务。
ansible-config
查看、编辑、管理ansible配置。
ansible-doc
文档查看工具。
ansible-galaxy
共享和下载roles的工具。
ansible-inventory
查看inventory的信息。
ansible-playbook
执行playbook。
ansible-pull
从仓库中拉去playbook。
ansible-vault
文件加密工具。
ansible-console
repl控制台执行ansible任务。
配置SSH免秘钥访问
为了避免ansible每次下发指令都要输入目标主机密码,所以这里使用(ssh-keygen)在控制主机创建一对秘钥,使用(ssh-copy-id)来下发生成的公钥。
[root@master ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): (回车)
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):(回车)
Enter same passphrase again:(回车)
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
e8:2b:a7:a2:6b:19:87:0b:b5:4e:fc:46:5b:9e:3d:7b root@master
The key's randomart image is:
+--[ RSA 2048]----+
| . . |
| o.. . S |
|.o+.... |
|.o=o +.o |
| +o = +.o E |
|+o o.+. .+ |
+-----------------+
在/root/.ssh/下生产一对秘钥,其中(id_rsa)为私钥,(id_rsa.pub)为公钥.
[root@master ~]# tree /root/.ssh/
/root/.ssh/
├── id_rsa
└── id_rsa.pub
控制主机把公钥(id_rsa.pub)下发到被管节点上用户下的.ssh目录,并重命名为authorized_key,权限制为400,这里使用秘钥拷贝工具(ssh-copy-id)把公钥文件(id_rsa.pub)拷贝到被管节点。
[root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
The authenticity of host '192.168.1.111 (192.168.1.111)' can't be established.
ECDSA key fingerprint is 75:5c:83:a1:b4:cc:bf:28:71:a5:d5:d1:94:35:3c:9a.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
公钥分发后,需要验证SSH无密码登录,如下为成功。
[root@master ~]# ssh [email protected]
Last login: Wed Jul 17 23:13:35 2018 from master
[root@slave ~]#
如果有多台节点分发公钥和上面一样,或者写一个简单的脚本分发。
主机连通性测试
[root@master ~]# cat >>/etc/ansible/hosts < [cluster_host]
> 192.168.1.111
> EOF
[root@master ~]# ansible cluster_host -m command -a 'uptime'
192.168.1.111 | SUCCESS | rc=0 >>
09:58:17 up 1:03, 2 users, load average: 0.01, 0.04, 0.05
常用模块解析
查询某个模块请执行:(ansible-doc -s 模块名)
查询更多模块请执行:(ansible-doc -l)
(setup)模块
#查看目标主机的一些信息
示例:
[root@master ~]# ansible cluster_host -m setup
192.168.1.111 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.16.1.15",
"192.168.1.111"
],
"ansible_all_ipv6_addresses": [
"fe80::20c:29ff:fe91:ce86",
"fe80::20c:29ff:fe91:ce7c"
],
"ansible_apparmor": {
"status": "disabled"
}
(ping)模块
#测试目标主机的运行状态
示例:
[root@master ~]# ansible cluster_host -m ping
192.168.1.111 | SUCCESS => {
"changed": false,
"ping": "pong"
}
(file)模块
#对目标主机的文件进行操作
参数如下:
force
在两种情况下强制创建软链接
1.源文件不存在但之后会建立的情况下;
2.目标软连接已经存在,需要取消之前的软链接,然后创建洗的软连接,有两个选项:yes|no;
group
定义文件/目标的属组。
mode
定义文件/目录的权限。
owenr
定义文件/目录的属主。
path
必选项,定义文件/目录的路径。
recurse
递归的设置文件的属性,只对目录有效。
src
要被链接的源文件的路径,只应用于state=link的情况。
dest
被链接到的路径,只应用于state=link的情况。
file
即使文件不存在,也不会被创建。
link
创建软连接。
hard
创建硬链接。
touch
如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间。
absent
删除目录、文件或者取消链接文件。
示例:
#创建远程文件符号链接
[root@master ~]# ansible cluster_host -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
192.168.1.111 | SUCCESS => {
"changed": true,
"dest": "/tmp/resolv.conf",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 16,
"src": "/etc/resolv.conf",
"state": "link",
"uid": 0
}
[root@master ~]#
#远程文件信息查看
[root@master ~]# ansible cluster_host -m command -a "ls -la /tmp/resolv.conf"
192.168.1.111 | SUCCESS | rc=0 >>
lrwxrwxrwx 1 root root 16 7月 18 10:21 /tmp/resolv.conf -> /etc/resolv.conf
#删除远程文件符号链接
[root@master ~]# ansible cluster_host -m file -a "path=/tmp/resolv.conf state=absent"
192.168.1.111 | SUCCESS => {
"changed": true,
"path": "/tmp/resolv.conf",
"state": "absent"
}
#远程文件信息查看
[root@master ~]# ansible cluster_host -m command -a "ls -la /tmp/resolv.conf"
192.168.1.111 | FAILED | rc=2 >>
ls: 无法访问/tmp/resolv.conf: 没有那个文件或目录non-zero return code
(copy)模块
#进行远程复制
参数如下:
src
被复制到远程主机的本地对象文件或者文件夹,可以是绝对路径,也可以是相对路径。
dest
被复制到远程主机的本地对象文件或者文件夹。
mode
复制对象的设定权限。
backup
在文件存在的时候可以选择覆盖之前,将源文件备份.设定值:yes/no 缺省为yes。
force
是否强制覆盖.设定值:yes/no 缺省为no。
示例:
#将本地文件/etc/ansible/ansible.cfg复制到目标机器/tmp/ansible.cfg
[root@master ~]# ansible cluster_host -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
192.168.1.111 | SUCCESS => {
"changed": true,
"checksum": "4cb7c9f51f91d0c5895c2ae5bca18b4904ed407e",
"dest": "/tmp/ansible.cfg",
"gid": 0,
"group": "root",
"md5sum": "1f7011f69060831cfcd3b04136c2be6a",
"mode": "0644",
"owner": "root",
"size": 19549,
"src": "/root/.ansible/tmp/ansible-tmp-1531881922.82-138288626316266/source",
"state": "file",
"uid": 0
}
#查看目标主机的/tmp/ansible.cfg文件
[root@master ~]# ansible cluster_host -m command -a "ls -la /tmp/ansible.cfg"
192.168.1.111 | SUCCESS | rc=0 >>
-rw-r--r-- 1 root root 19549 7月 18 10:45 /tmp/ansible.cfg
[root@master ~]#
(command)模块
#在远程主机上执行命令
参数如下:
chdiiv
在执行命令之前,通过cd命令进入指定目录中。
creates
定义一个文件是否存在,如果不存在运行相应命令;如果存在跳过此步骤。
executable
改变shell使用command进行执行,并且执行时要使用绝对路径。
free_form
命令模块采用自由形式命令组合;即可以输入任意linux命令。
removes
定义一^文件是否存在,如果存在运行相应命令;如果不存在跳过此步骤。
warn
如果ansible配置文件中定义了命令警告,如果参数设置了no/false将不会警告此行命令。
示例:
[root@master ~]# ansible cluster_host -m command -a "pwd"
192.168.1.111 | SUCCESS | rc=0 >>
/root
[root@master ~]# ansible cluster_host -m command -a "who"
192.168.1.111 | SUCCESS | rc=0 >>
root pts/0 2018-07-18 09:13 (10.0.0.1)
root pts/1 2018-07-18 10:58 (10.0.0.5)
(shell)模块
#切换到某个shell执行指定命令,参数与command模块相同
示例:
#本地创建一个shell脚本
[root@master ~]# vim /tmp/test.sh
#!/bin/bash
date +%F_%H.%M.%S
:wq
[root@master ~]# chmod +x /tmp/test.sh
#将创建的脚本分发到目标主机
[root@master ~]# ansible cluster_host -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=0755"
7192.168.1.111 | SUCCESS => {
"changed": true,
"checksum": "eccafd201f4a61757facc4a34e67e955b4f8a03f",
"dest": "/tmp/test.sh",
"gid": 0,
"group": "root",
"md5sum": "f027af9860d5c4548220b09bfa042b57",
"mode": "0755",
"owner": "root",
"size": 30,
"src": "/root/.ansible/tmp/ansible-tmp-1531883311.27-270962148668548/source",
"state": "file",
"uid": 0
}
#目标主机执行
[root@master ~]# ansible cluster_host -m shell -a "/tmp/test.sh"
192.168.1.111 | SUCCESS | rc=0 >>
2018-07-18_11.09.31
更多模块
service
系统服务管理
cron
计划任务管理
yum
yum软件包安装管理
synchronize
使用rsync同步文件
user
系统用户管理
group
系统用户组管理
查询更多模块请执行:(ansible-doc -l)
Ansible实现自动化运维的技巧
技巧1:校验你的模板文件是否正确
通常我们会使用template
module 来生成应用的配置,比如生成 Nginx 的配置或者 sudoers 配置。而像 sudoers 文件内的配置错误可能直接导致无法登录。所以,我们希望在生成这些配置文件后能校验一下它的正确性。如果校验失败,直接停止,不生成该配置文件。
而 template
module 有一个属性 validate
就是为了实现这一需求的:
- template:
src: "user-sudoers"
dest: "/etc/sudoers.d/abc"
validate: visudo -cf %s
校验 Nginx 配置文件的文件:
- name: Copy the nginx file
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
validate: "/usr/sbin/nginx -t -c %s"
notify:
- restart nginx
校验 Prometheus 配置文件:
- name: Copy Prometheus config
template:
src: prometheus.yml.j2
dest: "/etc/prometheus.yml"
validate: "promtool check config %s"
notify:
reload prometheus config
校验 Logstash 配置文件:
- name: template configs
template:
src: "logstash-filter.conf"
dest: "/opt/logstash/conf"
validate: "logstash -t -f %s"
environment:
JAVA_HOME: "" ## logstash 命令需要 JAVA_HOME 环境变量
技巧2:使用 host 变量解决分布式系统中的 id 问题
在部署 Zookeeper 时,通常会部署 3 台组成集群,同时每台 Zookeeper 都需要在配置一个 myid 的文本文件,而这个文件中只放id。而 id 是要求每台机器都是不同的。这时 host 变量派上用场了。定义 host 变量有两种方式:
第一种:直接在 inventory 文件中定义
[zk]
192.168.1.11 myid=1
192.168.1.12 myid=2
192.168.1.13 myid=3
第二种:在 host_vars 目录中定义
这种方式笔者认为可维护性更高
├── group_vars
├── host_vars
│ ├── 192.168.1.11
│ ├── 192.168.1.12
│ ├── 192.168.1.13
├── hosts
#cat 192.168.1.11myid: 1
不推荐两种方式都使用,因为变量的作用域问题会把你搞晕
技巧3:在执行 shell 时需要某个环境变量
某个 shell 需要一个临时变量,可以使用 environment 实现
- name: install | Build commons daemon.
shell: "./configure && make chdir=/opt/pinpoint/"
environment:
- JAVA_HOME: ""
技巧4:Jinjia2 语法:去除最后的逗号
以下方式会生成:a,a,a,a,
注意最后的逗号我们是不需要的:
{% for f in files %}
a,
{% endfor %}
这时,我们可以这样:
{% for f in files %}
a{%- if not loop.last -%},{% endif %}
{% endfor %}
技巧5: 利用 host 变量解决机器连接方式的不统一的问题
机器标准化要求每台机器的ssh连接方式及管理员用户名及密码都是一样的。但是事实中,面对老机器,常常做不过。所以,我们的 Ansible 脚本必须能做到不同的机器可以使用不同的连接方式、管理员用户名和密码。利用 host 变量就可以实现了。
举个例子,当前的文件内容如下:
├── group_vars
├── host_vars
│ ├── 192.168.1.11
│ ├── 192.168.1.12
│ ├── 192.168.1.13
├── hosts
#cat 192.168.1.11ansible_ssh_user: abcansible_become_method: sudoansible_ssh_private_key_file: /users/abc/id_rsa
#cat 192.168.1.12ansible_ssh_user: bcdansible_become_method: sudoansible_ssh_pass: 1234567
#cat 192.168.1.13ansible_ssh_user: bcdansible_become_method: suansible_ssh_private_key_file: /users/bcd/id_rsaansible_ssh_pass: 1234567
参考链接:
https://mp.weixin.qq.com/s/QCIXY4WFF15Coez4a6r53A
Ansible 自动化运维实践 : https://mp.weixin.qq.com/s/8p8CyIV0rAFYVw77Lf8gHA
Ansible 架构与工作原理 : https://mp.weixin.qq.com/s/fgeJZz6NYkciZy6O791rCA
企业级自动化运维方案设计及SaltStack、Ansible等5种工具比较分析 : https://mp.weixin.qq.com/s/m_rmvzJxrnIAtYLICIwsMw
链接:
11步极快速搭建:Ansible自动化运维体系在生产环境下实践 :https://mp.weixin.qq.com/s/6F6xmaE_9TYTxFylg4jMbQ
自动化运维工具Ansible详细部署 : https://www.cnblogs.com/gzxbkk/p/7515634.html
自动化工具——ansible : http://blog.51cto.com/cuchadanfan/1693889
『Ansible 上手指南』 : https://juejin.im/post/5a9d61a5f265da238b7d8189
『Ansible 上手指南:2』 : https://juejin.im/post/5aa2b6b86fb9a028e25d2953
ansible: 当参数定义时执行task : http://smileytechadventures.blogspot.com/2015/07/ansible-test-variable-defined-and-not.html
243张图片为你解析Linux轻量级自动运维化工具Ansible : https://mp.weixin.qq.com/s/sw1TjFWiBlfvkbezwAWprw
ansible-playbook : https://www.cnblogs.com/liang-wei/p/6030755.html
Ansible 中小企业高可用负载均衡部署方案:https://mp.weixin.qq.com/s/pC2wocr76STpHLsMWBjJnw
Ansible的部署实践:https://mp.weixin.qq.com/s/b2fyDGMMfbr-TNeik6YPhg
用Ansible部署ELK STACK :https://mp.weixin.qq.com/s/hnAv5lrAHR-IZesPeOvLGA
运维自动化之ansible playbook安装mysql tpcc测试OLTP能力 :https://mp.weixin.qq.com/s/nthTPyJ0JC5LYCqZBnEiOA
Ansible 实战与配置Nginx:https://mp.weixin.qq.com/s/pNMvjn6klKhz1g6lckBr4A
Ansible系列:https://www.iyunv.com/thread-542911-1-1.html
(易百教程) Ansible自动化运维教程 : https://www.w3cschool.cn/automate_with_ansible/
SaltStack实战之manage、salt-ssh和salt jobs : http://blog.51cto.com/ygqygq2/1940981
SaltStack实战之配置管理-Jinja2模板 : http://blog.51cto.com/ygqygq2/1937361
SaltStack实战之配置管理-状态间关系 : http://blog.51cto.com/ygqygq2/1937340
SaltStack实战之配置管理-LAMP自动化部署 : http://blog.51cto.com/ygqygq2/1936947
SaltStack实战之配置管理-YAML编写技巧 : http://blog.51cto.com/ygqygq2/1934755
SaltStack实战之远程执行-Returners : http://blog.51cto.com/ygqygq2/1933921
SaltStack实战之远程执行-Modules : http://blog.51cto.com/ygqygq2/1933917
SaltStack实战之远程执行-Targeting : http://blog.51cto.com/ygqygq2/1933470
SaltStack实战之数据系统 Grains VS Pillar : http://blog.51cto.com/ygqygq2/1933008
SaltStack实战之数据系统-Pillar : http://blog.51cto.com/ygqygq2/1933003
SaltStack实战之数据系统-Grains : http://blog.51cto.com/ygqygq2/1932998
SaltStack实战之SaltStack快速入门 : http://blog.51cto.com/ygqygq2/1932769
SaltStack之修改salt-minion id : http://blog.51cto.com/ygqygq2/1932694
Ansible 系列之 Playbooks 剧本 (1) : https://www.cnblogs.com/hanyifeng/p/6435875.html
Ansible 系列之 Ad-Hoc介绍及使用 : https://www.cnblogs.com/hanyifeng/p/6431450.html
自动化运维工具之 Ansible 介绍及安装使用 : https://www.cnblogs.com/hanyifeng/p/6110926.html
Ansible 安装配置及使用 : http://www.azureyun.com/ansible-%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae%e5%8f%8a%e4%bd%bf%e7%94%a8/
ansible 简单入门与使用 : http://blog.51cto.com/xiaoluoge/1753903
自动化运维工具——ansible详解(一) :https://www.cnblogs.com/keerya/p/7987886.html
自动化运维工具——ansible详解(二) : https://www.cnblogs.com/keerya/p/8004566.html
Ansible详解(一) : http://blog.51cto.com/hmtk520/2058104
Ansible详解(二) : http://blog.51cto.com/hmtk520/2058175
Ansible详解(三) : http://blog.51cto.com/hmtk520/2058293
Ansible详解(一)基础安装和配置 : https://www.jianshu.com/p/686908012d99
Ansible 详解(二)Ad-Hoc : https://www.jianshu.com/p/7f9a4fad4faa
Ansible 详解(三):Playbooks : https://www.jianshu.com/p/df18142e0b90
Ansible 详解(四):Ansible-vault 和 Python api :https://www.jianshu.com/p/e9b8608245a2
自动化运 维之playbook : https://www.jianshu.com/p/07bd3a336a26
自动化运维之ansible : https://www.jianshu.com/p/d95414df5644
ansible自动化工具部署实例 荐 : http://blog.51cto.com/liangey/1625163
Ansible 中小企业高可用负载均衡部署方案 : https://mp.weixin.qq.com/s/pC2wocr76STpHLsMWBjJnw
Ansible 专题:http://www.jianshu.com/p/c56a88b103f8,
ansible总结 : https://www.jianshu.com/p/c82737b5485c
自动化运维工具Ansible之动态inventory文件 : http://blog.51cto.com/diannaowa/1683588
自动化运维工具Ansible之Python API : http://blog.51cto.com/diannaowa/1683455
自动化运维工具Ansible之Playbooks循环语句 : http://blog.51cto.com/diannaowa/1682061
自动化运维工具Ansible之Playbooks的when语句 : http://blog.51cto.com/diannaowa/1681885
自动化运维工具Ansible之Playbooks变量的使用 : http://blog.51cto.com/diannaowa/1680732
自动化运维工具Ansible之Playbooks的roles和include : http://blog.51cto.com/diannaowa/1679992
自动化运维工具Ansible之Playbooks基础应用 : http://blog.51cto.com/diannaowa/1679837
ansible组件 : http://blog.51cto.com/liangey/1883603
ansible安装 : http://blog.51cto.com/liangey/1883602
Ansible模块知多少 荐 : http://blog.51cto.com/nolinux/1607459
【Absible学习】Ansible常用模块---包管理模块 : http://blog.51cto.com/ityunwei2017/2133933
【Absible学习】Ansible常用模块---系统类模块 : http://blog.51cto.com/ityunwei2017/2133927
【Absible学习】Ansible常用模块---命令类模块 : http://blog.51cto.com/ityunwei2017/2133446
【Absible学习】Ansible常用模块---文件操作 : http://blog.51cto.com/ityunwei2017/2132627
【Absible学习】Ansible普通用户sudo执行指令 : http://blog.51cto.com/ityunwei2017/2131111
【Absible学习】Absible简介、安装 : http://blog.51cto.com/ityunwei2017/2130742
Ansible详解(一)基础安装和配置 : https://www.jianshu.com/p/686908012d99
Ansible 详解(二)Ad-Hoc : https://www.jianshu.com/p/7f9a4fad4faa
Ansible 详解(三):Playbooks : https://www.jianshu.com/p/df18142e0b90
Ansible 详解(四):Ansible-vault 和 Python api : https://www.jianshu.com/p/e9b8608245a2
Ansible 部署 Zabbix 客户端 : https://www.jianshu.com/p/a7352521e8a5
运维自动化之ansible playbook一键化安装redis主从 : http://blog.51cto.com/dl528888/1625280
运维自动化之ansible playbook安装mysql tpcc测试OLTP能力 荐 : http://blog.51cto.com/dl528888/1545032
运维自动化之ansible playbook结合docker安装redis主从 荐 : http://blog.51cto.com/dl528888/1539251
运维自动化之ansible playbook结合docker安装smokeping 荐 : http://blog.51cto.com/dl528888/1538444
运维自动化之ansible playbook安装ruby环境 荐 : http://blog.51cto.com/dl528888/1535724
运维自动化之ansible playbook安装mysql 荐 : http://blog.51cto.com/dl528888/1437882
运维自动化之ansible的安装与使用(包括模块与playbook使用) 荐 :http://blog.51cto.com/dl528888/1435415
运维自动化之ansible playbook安装node环境 : http://blog.51cto.com/dl528888/1535152
运维自动化之ansible playbook安装lamp环境 : http://blog.51cto.com/dl528888/1533086
运维自动化之ansible playbook安装apache : http://blog.51cto.com/dl528888/1531104
运维自动化之ansible playbook安装lnmp环境 荐 : http://blog.51cto.com/dl528888/1440775
运维自动化之ansible playbook安装nginx 荐 : http://blog.51cto.com/dl528888/1438847
运维自动化之ansible playbook安装zabbix客户端 荐 : http://blog.51cto.com/dl528888/1436745
ansible filter_plugins插件实现jinja2自定义filter过滤器 : http://blog.51cto.com/rfyiamcool/1440686
ansible自定义lookup_plugins插件实现playbook扩展 : http://blog.51cto.com/rfyiamcool/1441451
ansible调用callbacks插件实现结果nosql输出回调 荐 : http://blog.51cto.com/rfyiamcool/1440624
平台化之利用ansible api接口的async使任务异步 荐 : http://blog.51cto.com/rfyiamcool/1422263
探索ansible runner的源码及执行api原理 : http://blog.51cto.com/rfyiamcool/1420147
ansible通过cmdb资产接口动态创建hosts列表 荐 : http://blog.51cto.com/rfyiamcool/1416808
利用ansible modules模块来自定义集群管理 荐 : http://blog.51cto.com/rfyiamcool/1414417
关于ansible的playbook模板和facts的后续文档 荐 : http://blog.51cto.com/rfyiamcool/1413387
ansible的playbook配置及template模板的使用 : http://blog.51cto.com/rfyiamcool/1413031
以Chef和Ansible为例快速入门服务器配置 : https://mp.weixin.qq.com/s/PO9zCKGlUjrKEqFYFZaBAw
企业实战
运维自动化之ansible playbook一键化安装redis主从 :http://blog.51cto.com/dl528888/1625280
运维自动化之ansible playbook一键化解决大量主机bash更新问题 荐 :http://blog.51cto.com/dl528888/1558227
运维自动化之ansible playbook安装mysql tpcc测试OLTP能力 荐 : http://blog.51cto.com/dl528888/1545032
运维自动化之ansible playbook结合docker安装redis主从 荐 : http://blog.51cto.com/dl528888/1539251
运维自动化之ansible playbook结合docker安装smokeping 荐 : http://blog.51cto.com/dl528888/1538444
运维自动化之ansible playbook安装ruby环境 荐 : http://blog.51cto.com/dl528888/1535724
运维自动化之ansible playbook安装mysql 荐 : http://blog.51cto.com/dl528888/1437882
运维自动化之ansible的安装与使用(包括模块与playbook使用) 荐 : http://blog.51cto.com/dl528888/1435415
运维自动化之ansible playbook安装node环境 : http://blog.51cto.com/dl528888/1535152
运维自动化之ansible playbook安装lamp环境 : http://blog.51cto.com/dl528888/1533086
运维自动化之ansible playbook安装apache : http://blog.51cto.com/dl528888/1531104
运维自动化之ansible playbook安装lnmp环境 荐 : http://blog.51cto.com/dl528888/1440775
运维自动化之ansible playbook安装nginx 荐 : http://blog.51cto.com/dl528888/1438847
运维自动化之ansible playbook安装zabbix客户端 荐 : http://blog.51cto.com/dl528888/1436745
某银行数据中心自动化运维设计实施及Ansible应用探索 | 最佳实践:https://mp.weixin.qq.com/s/5EGVHImWwvjAa6jobXpBig
运维自动化之ansible playbook安装mysql tpcc测试OLTP能力 : https://mp.weixin.qq.com/s/nthTPyJ0JC5LYCqZBnEiOA
Ansible 实战与配置Nginx : https://mp.weixin.qq.com/s/pNMvjn6klKhz1g6lckBr4A
ansible :https://mp.weixin.qq.com/mp/homepage?__biz=MzI0ODAzNTMzMw==&hid=2&sn=f09228748403b97ca2133ffa7043c0ae&scene=1&devicetype=android-27&version=27000336&lang=zh_CN&nettype=WIFI&ascene=7&session_us=gh_383791c86de8&wx_header=1
Saltstack 集中化管理平台安装 :https://mp.weixin.qq.com/s/L2Lqv4xqPCOO0QGxTnSkSg
利用 Saltstack 远程执行命令 :https://mp.weixin.qq.com/s/63gV5O1bHnUeW_WoMObXfg
修改 salt-minion 的 ID 后报错解决方法 : https://mp.weixin.qq.com/s/87ENK6t6_6UtckY66DBGyg
Ansible 自动化运维体系在生产环境下实践(11步极快速搭建) : https://mp.weixin.qq.com/s/1Kz2qY50X3RjSxGnwtJFzQ
自动化运维利器 Ansible 和企业级 Ansible 应用解读 :https://mp.weixin.qq.com/s/rG-jkwKblYw9UVaAk7PLpQ
安全运维中基线检查的自动化之ansible工具巧用 : https://mp.weixin.qq.com/s/QMNOzwsg9b-NWNhcB6al3w
20分钟速通 ansible 自动化工具 : https://mp.weixin.qq.com/s/bl1NvxA-ls4C95prUume9g
Ansible 架构与工作原理 : https://mp.weixin.qq.com/s/_YcWJQYQvAI3TWwwN9t_kg
Ansible企业级自动化运维探索之旅
http://www.talkwithtrend.com/Document/detail/tid/424177
Ansible自动化运维体系在生产环境下实践(11步极快速搭建)
http://www.talkwithtrend.com/Article/216569
Ansible 自动化运维实践 | 周末送资料 : https://mp.weixin.qq.com/s/tOYm4MNwCDRL4x5kUVce_w
极简教程|20 分钟玩转Ansible系列手册! :https://mp.weixin.qq.com/s/SyVm9QmioZfGuYP0Ryc9CQ
ansible 初体验2 : https://www.jianshu.com/p/2d817811fca9
看完这243张图片,轻松掌握 Ansible ! :https://mp.weixin.qq.com/s/LxpVtVC7dHigC_5g6hTMdg