前言

		Ansible是自动化运维的工具,基于Python开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。
		Ansible是基于模块工作的,ansible提供一个框架,通过模块实现批量部署。

ansible架构图

	右边绿色部分是被管理的主机(虚拟机,物理机,云主机等)从以上架构图中可以看出
	ansible是由主机清单(配置),playbook(配置),以及各模块插件组成;
	简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对
	清单中的主机进行统一管理;

1. ansible安装(epel源安装,或者下载以后编译安装)

	①pm包安装: EPEL源
				yum install ansible
		②编译安装:
					yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
					tar xf ansible-1.5.4.tar.gz
					cd ansible-1.5.4
					python setup.py build
					python setup.py install
					mkdir /etc/ansible
					cp -r examples/* /etc/ansible
	③Git方式:
				git clone git://github.com/ansible/ansible.git --recursive
				cd ./ansible
				source ./hacking/env-setup
		④pip安装(pip是安装Python包的管理器,类似yum)
				 yum install python-pip python-devel
				 yum install gcc glibc-devel zibl-devel  rpm-bulid openssl-devel
				 pip install  --upgrade pip
				 pip install ansible --upgrade

确认安装: ansible --version


2. 配置文件相关

						/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
						/etc/ansible/hosts 主机清单
						/etc/ansible/roles/ 存放角色的目录
**ansible主配置文件:/etc/ansible/ansible.cfg (一般保持默认) **
					[defaults]
					#inventory      = /etc/ansible/hosts  	# 主机列表配置文件
					#library  = /usr/share/my_modules/ 	# 库文件存放目录  
					#remote_tmp  = $HOME/.ansible/tmp  	# 临时py命令文件存放在远程主机目录
					#local_tmp      = $HOME/.ansible/tmp 	# 本机的临时命令执行目录
					#forks          = 5   					# 并发进程并行执行5条命令(提高工作效率)
					#sudo_user      = root  				# 可使用sudu命令切换身份执行命令
					#ask_sudo_pass = True	 			# 每次执行ansible命令是否询问ssh密码
					#ask_pass      = True    				#
					#remote_port    = 22				#默认连接管理主机端口号22

#host_key_checking = False  		# 检查对应服务器的host_key,建议开启
#log_path=/var/log/ansible.log  		# 日志文件(默认不打开,建议开启便于管理)

**ansible主机清单文件:/etc/ansible/hosts ** 管理IP地址存放位置(可分组) 如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机 [列表名称]


3. ansible系列命令

	ansible  ansible-doc  ansible-playbook ansible-vault  
	ansible-console   ansible-galaxy   ansible-pull  

**ansible-doc命令: 显示模块帮助 **

			语法: ansible-doc [选项] [模块...]
			选项: -a 显示所有模块的文档
								-l, --list 列出可用模块
								-s, --snippet显示指定模块的playbook片段

ansible命令:

ansible通过ssh服务实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点(主机)
					语法:ansible <host-pattern> [-m 模块名称] [-a 命令参数]
					选项:--version 显示版本
									 -m module 指定模块,默认为command
									 -v 详细过程 –vv -vvv更详细
									 --list-hosts 显示主机列表,可简写—list
									 -k, --ask-pass 提示输入ssh连接密码,默认Key验证
									 -K, --ask-become-pass 提示输入sudo时的口令
									 -C, --check 检查,并不执行
									 -T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
									 -u, --user=REMOTE_USER 执行远程执行的用户
									 -b, --become 代替旧版的sudo 切换

ansible命令中的Host-pattern匹配主机的列表 All: 表示所有Inventory中的所有主机 [列表名称]: 表示主机清单里创建列表下的所有主机 * : 通配符 示例1: ansible 192.168.1.* -m ping 示例2: ansible “srvs” -m ping : 逻辑或
示例1: ansible “websrvs:appsrvs” -m ping & 逻辑与 示例1: ansible “websrvs:&dbsrvs” –m ping(在websrvs组并且在dbsrvs组中的主机) ! 逻辑非 示例1: ansible ‘websrvs:!dbsrvs’ –m ping (在websrvs组,但不在dbsrvs组中的主机) 注意:此处为单引号 正则表达式 示例1: ansible “websrvs:&dbsrvs” –m ping 示例2: ansible “~(web|db).
.magedu.com” –m ping

**ansible命令执行过程 ** 1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件,如command 3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 4. 给文件+x执行 5. 执行并返回结果 6. 删除临时py文件,sleep 0退出

执行状态颜色:

		绿色:执行成功并且不需要做改变的操作 
		yellow:执行成功并且对目标主机做变更 
		红色:执行失败 

ansible-galaxy命令:(连接ansible网站下载相应的角色) 连接 https://galaxy.ansible.com/explore#/ 下载相应的roles

	列出所有已安装的galaxy
		示例:ansible-galaxy list
	安装galaxy
		示例:ansible-galaxy install geerlingguy.redis
	删除galaxy
		示例:ansible-galaxy remove geerlingguy.redis

ansible-pull命令

推送命令至远程,效率无限提升,对运维要求较高 

ansible-vault命令:(对playbook文件进行加密)

						功能: 管理加密解密yml文件 
						语法: ansible-vault [create|decrypt|edit|encrypt|rekey|view]
				选项示例: ansible-vault encrypt hello.yml 加密 
								ansible-vault decrypt hello.yml 解密 
								ansible-vault view hello.yml 查看 
								ansible-vault edit  hello.yml 编辑加密文件 
								ansible-vault rekey  hello.yml 修改口令 
								ansible-vault create new.yml 创建新文件 

ansible-console命令:(交互式控制台,支持tab)

执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
				设置并发数: forks n  		例: forks 10
				切换组: cd [主机组] 			例: cd web
				列出当前组主机列表: list
				列出所有的内置命令: ?或help

ansible-playbook命令:(运行yml脚本文件)

后续会详细解答


4. ansible常用模块及选项

	此处只列举常用选项,如需更多骚操作,查看帮助: ansible-doc -s [模块名称]

setup模块: 查看远程主机的一些基本信息

			ansible -i /etc/ansible/hosts test -m setup

ping模块: 测试远程主机的运行状态 **hostname模块:管理主机名 **

	name:修改的主机名
		ansible node1 -m hostname -a “name=websrv”  

**command模块:在远程主机执行命令,默认模块,可忽略-m选项 **

	free_form:		#要执行的linux命令
	chdir:			#运行前切换目录
	此模块不支持 $VARNAME <  >  |  ; & 等,用shell模块实现 

**shell模块:和command相似,用shell执行命令 **

	free_form:		#要执行的linux命令
	调用shell模块时:如果命令过于复杂,建议写在脚本里复制到远程,执行,再把需要的结果返回.否则可能会执行失败

**script模块:在管理的主机上 运行脚本 **

	选项和command相似
	free_form:		#要执行的linux命令

file模块:设置文件属性 (创建文件)

	path:必选项,定义文件/目录的路径
	state:	#状态选项
	directory:#如果目录不存在,创建目录
	file:#即使文件不存在,也不会被创建
	link:#创建软链接
	hard:#创建硬链接
	touch:#如果文件不存在,(创建新的文件),如果文件或目录已存在,(更新其最后修改时间)
	absent:#删除目录、文件或者取消链接文件
	group:#定义文件/目录的属组
	mode:#定义文件/目录的权限
	owner:#定义文件/目录的属主

copy模块:复制文件到远程主机

	dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
	src:#要复制到远程主机的文件在本地的地址
	content:用于替代"src",可以直接设定指定文件的值
	backup:#在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
	force:#强制覆盖(默认为yes),有两个选项:yes|no 
	directory_mode:#递归的设定目录的权限,默认为系统默认权限

fetch模块:从远程主机拉取文件到本地,于copy相反,只能抓取文件,不能抓取目录

	选项和copy相似
	ansible websrvs -m fetch -a "src=/var/log/messages dest=/data/test"

**cron模块:管理计划任务 **

		job:   #要执行的任务
		backup:#对远程主机上的原任务计划内容修改之前做备份
		state:#该计划任务是创建还是删除 present|absent
		disabled: #禁用或启用计划任务 true|false
		name:该任务的名称及描述
		user:#以哪个用户的身份执行
		cron_file:#如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
		special_time:#指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
		支持指定时间格式:minute(分钟),hour(小时),day(日),month(月),weekday(周)
	

yum模块:安装软件

	name:#软件包名称
	state:#状态选项(present,absent,latest)
	list:#查看包详细信息
	config_file:#yum的配置文件 
	updete_cache=yes #清理缓存

**service模块:管理服务 **

	name:必选项,服务名称
	state:#对当前服务执行启动,停止、重启、重新加载等操作	
	(started,stopped,restarted,reloaded)
	enabled:#是否开机启动 yes|no
	ansible websrvs -m service -a "name=httpd state=started enabled=no"

** user模块与group模块:管理用户,管理组**

	name:必选项,用户名称
	password:设置密码(需要特别说明的是,password后面指定的密码不能是明文)
	home:#用户家目录
	groups: #指定组
	uid: 		#指定id号
	createhome:
	system: #是否是系统账号 yes|no
	remove:#是否删除家目录 yes|no
	state: #是否删除账号present|absent
	shell: #shell类型


5. playbook介绍

	playbook是一个非常简单的配置管理和多主机部署系统。可作为一个适合部署复杂应用程序的基础。
	playbook可以定制配置,可以按指定的操作步骤有序执行,支持同步和异步方式。
	playbook是通过YAML格式来进行描述定义的,可实现多台主机应用的部署,对不同分组的主机执行特定指令步骤。
	Ansible-playbook(剧本)执行过程: 
	将已有编排好的任务集写入Ansible-Playbook
	通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行

Playbook工作流程图 YAML简介(是一种标记语言)

	YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
	 特性: YAML的可读性好
		 YAML和脚本语言的交互性好
		 YAML使用实现语言的数据类型
		 YAML有一个一致的信息模型
		 YAML易于实现
		 YAML可以基于流来处理
		 YAML表达能力强,扩展性好

更多YAML内容及规范参见http://yaml.org/


6. Playbook核心元素

	hosts   执行的远程主机列表 
	tasks   任务列表(任务集) 
	varniables 内置变量或自定义变量在playbook中调用 
	templates  模板,可替换模板文件中的变量并实现一些简单逻辑的文件 
	handlers  和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
	tags 标签  指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

playbook基础组件

	Hosts: playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
	remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
	tasks:play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行自下而下某playbook时,如果中途发生错误,所有已执行任务都将回滚,因此,在更正playbook后重新执行一次即可
			①task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
			②每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出

tasks应用:任务列表和action

	语法格式:	(1) action: module arguments
						(2) module: arguments 建议使用
					shell和command模块后面跟命令,而非key=value
	如果命令或脚本的退出状态码不为0,可使用如下方法
	任务执行失败会影响后续操作执行,即使当前任务执行失败后续任务继续执行
					 || /bin/true			#管道返回值为真
	或者使用ignore_errors来忽略错误信息: 
					 ignore_errors: True	#不论命令执行结果,继续执行后续命令 

handlers(触发器)和notify结合使用触发条件

	Handlers:是一些task的列表,通过名字来引用,它们和一般的task并没有什么区别。handlers是由通知者进行notify,如果没有被notify,handlers不会执行不管多少个通知者进行了notify,等到play中的所有task执行完成之后handlers也不会被执行一次
	Notify:此action可用于在每个task结束时被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
		对应关系:notify中调用handler中定义的操作
	notify调用handlers定义的触发条件


7. 运行playbook的方式

		语法:ansible-playbook <filename.yml> ... [options]
		选项: --check 只检测可能会发生的改变,但不真正执行操作
				--list-hosts 列出运行任务的主机
				--limit 主机列表 只针对主机列表中的主机执行
				-v 显示过程 -vv -vvv 更详细

小结

	通过ansib-doc来获取模块信息及指定模块帮助信息;
	ansible通过常用模块在命令行就可以针对主机清单来管理配置远程主机,无需要代理客		户端程序,但需要目标主机有ssh和python2.4+;
	基于ssh协议既可以通过用户名和密码,也可以通过私钥,推荐使用私钥;
	ansible-playbook 基于YAML语法配置;可以对playbook文件进行测试,解析并执行应用于指定无端主机;非常方便我们统一编排分发管理远程主机;
	①一个模块定义一个name,相同的模块,多个操作也必须定义多个name
	②某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
	③任务可以通过"tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用