简介

Ansible 是 python 中的一套模块,系统中的一套自动化工具,只需要使用 ssh 协议连接及可用来系统管理、自动化执行命令等任务。

程序架构

安装目录如下(yum安装):
	  配置文件目录:/etc/ansible/
			ansible的配置文件为/etc/ansible/ansible.cfg,ansible有许多参数,其中一些常见的参数有:
				1: inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
				2: library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
				3: forks = 5 #并发连接数,默认为5
				4: sudo_user = root #设置默认执行命令的用户
				5: remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
				6: host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
				7: timeout = 60 #设置SSH连接的超时时间,单位为秒
				8: log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
			ansible的主机清单
				#主机组
				[webserver]
				172.16.1.31 
				172.16.1.41
				#主机+端口+密码
				[webserver]
				172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
				172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
				#1.主机支持主机名通配以及正则表达式,例如 web[1:3].test.com 代表三台主机
				#2.主机支持基于非标准的 ssh 端口,例如 hostname/ipaddress:666
				#3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
				#4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]
				
				#对整个主机组/所有webserver组都生效的变量效的变量
				[webserver:vars]
				ansible_ssh_pass='123456'

	  执行文件目录:/usr/bin/
	  Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
	  Help文档目录:/usr/share/doc/ansible-X.X.X/
	  Man文档目录:/usr/share/man/man1/

Ansible 命令集

/usr/bin/ansible  Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc   Ansible 模块功能查看工具
	ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下:
		## ansible-doc -l 获取全部模块的信息
		## ansible-doc -s MOD_NAME 获取指定模块的使用帮助
	   #参数说明:
	   		-s  #显示playbook制定模块的用法
	   		-l #列出可用的模块
	   		#例如:查看mysql相关的
	   		ansible-doc -l |grep mysql
		   		mysql_db Add or remove MySQL databases from a remote...
				mysql_replication Manage MySQL replication
				mysql_user Adds or removes a user from a MySQL databas...
				mysql_variables Manage MySQL global variables
			ansible-doc -s mysql_user		   		
				#mysql_user:
					     append_privs:          # Append the privileges defined by priv to the existing ones for this user instead of overwriting existing ones.
					      check_implicit_admin:   # Check if mysql allows login as root/nopassword before trying supplied credentials.
					      config_file:           # Specify a config file from which user and password are to be read.
					      connect_timeout:       # The connection timeout when connecting to the MySQL server.
					      encrypted:             # Indicate that the 'password' field is a `mysql_native_password` hash
					      host:                  # the 'host' part of the MySQL username
						  ......
						  
/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 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"

常用模块:

ping:
		应用场景:
			测试服务端与客户端之间的连通性,
			ansible 主机名称/主机组名称/主机地址信息/all -m ping
	shell(万能)
		应用场景:
			所有命令都可以执行,和本地执行效果一样
			ansible 主机名称/主机组名称/主机地址信息/all -m shell -a "ip ad s eth0|grep 172"
			批量执行脚本:

				方法一:
					在清单定义的主机上创建脚本,内容:打印主机名
						cat > /root/echo.sh << EOF 
						#!/bin/bash
						echo "$(hostname)"
						EOF
					然后使用ansible的shell模块批量执行
						ansible 主机名称/主机组名称/主机地址信息/all -m shell -a "/bin/bash /root/echo.sh"
	copy
				方法二:
					在ansible服务端建立脚本,内容为:打印主机名
						cat > /root/echo.sh << EOF 
						#!/bin/bash
						echo "$(hostname)"
						EOF
					然后使用ansible的shell模块批量执行(复制到目标主机,批量执行该脚本)
						ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/root/echo.sh dest=/root"
						ansible 主机名称/主机组名称/主机地址信息/all -m shell -a "/bin/bash /root/echo.sh"
					复制过程中更改文件属性及权限:
						更改属主和属组信息:(需注意该用户必须已经存在)
							ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/root/echo.sh dest=/root owner=test group=test"
						需改文件权限:
							ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/root/echo.sh dest=/root owner=test group=test mode=0600" 
					创建文件并直接写入内容
						ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "content='123' dest=/etc/rsync mode=0600"
					复制目录
						src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
							ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/data dest=/opt"
						src后面目录有/: 只将目录下面的内容都进行远程传输复制
							ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m copy -a "src=/data dest=/opt"	
					参数说明:
						src #推送数据的源文件信息
						dest #推送数据的目标路径
						backup=yes/no  #文件不一致的情况下,在覆盖前,目标源文件进行备份,备份文件包含时间信息,有两个选项 yes|no
						content #直接批量在被管理端文件中添加内容,
						group #将本地文件推送到远端,指定文件属组信息
						owner #将本地文件推送到远端,指定文件属主信息
						mode #将本地文件推送到远端,指定文件权限信息
	file
		应用场景:
			设置文件属性:
				1:创建文件夹(类似 mkdir -p):
					ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m file -a "path=/root/data state=directory"
				2:创建文件并更改属性
					ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"
				3:创建软链接(被link文件需要提前存在,否则需要添加force=yes,但是是一个无用的链接)
					ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m file -a "src=/root/abc path=/root/abc_link state=link"
			参数说明:
				path #指定远程主机目录或文件信息
				recurse #递归授权
				state
				directory #在远端创建目录
				touch #在远端创建文件
				link #link 或 hard 表示创建链接文件
				absent #表示删除文件或目录
				mode #设置文件或目录权限
				owner #设置文件或目录属主信息
				group #设置文件或目录属组信息
    script
    	应用场景:
    		可直接在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行。
    		ansible 目标主机名称/目标主机组名称/目标主机地址信息/all-m script -a "/root/echo.sh"
    cron
    	应用场景:
    		创建定时任务:
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh'"
    		创建含注释信息的定时任务,防止重复。
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "name='cron01' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh'"
    		删除相应定时任务
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "name='None' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh' state=absent"
    		注释相应定时任务,使定时任务失效
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m cron -a "name='cron01' minute=* hour=* day=* month=* weekday=* job='/bin/bash /root/echo.sh' disabled=no"
    user
    	应用场景:
    		创建用户指定uid,gid,不创建家目录也不允许登陆(组需提前建立)
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m user -a "name=test uid=888 group=z shell=/sbin/nologin createhome=no"
    	参数说明:
    		name #需要创建的用户名
    		uid #指定用户的 uid
			group #指定用户组名称
			groups #指定附加组名称
			password #给用户添加密码
			shell #指定用户登录 shell
			createhome #是否创建家目录 createhome=yes/no
	group
		应用场景:
			创建用户组
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m group -a "name=z gid=888 state=absent"
			参数说明:
				name #指定创建的组名
				gid #指定组的 gid
				state
					absent #移除远端主机的组
					present #创建远端主机的组(默认)
	yum
		应用场景:
			远程安装:
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m yum -a "name=httpd state=installed"
		参数说明:
			name       #指定要安装的软件包名称
			state      #指定使用 yum 的方法
			installed, present #安装软件包
			removed, absent #移除软件包
			latest     #安装最新软件包

	service
		应用场景:
			服务启动:
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m service -a "name=nfs state=stopped enabled=yes"
			参数说明:
				name # 定义要启动服务的名称
				state # 指定服务状态
				started #启动服务
				stopped #停止服务
				restarted #重启服务
				reloaded #重载服务
				enabled #开机自启
	mount
		应用场景:
			挂载:
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=present"
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted"
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=unmounted" 
				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=absent"
			状态解释:
				present # 开机挂载,仅将挂载配置写入/etc/fstab
				mounted # 挂载设备,并将配置写入/etc/fstab
				unmounted # 卸载设备,不会清除/etc/fstab 写入的配置
				absent # 卸载设备,会清理/etc/fstab 写入的配置
    unarchive
    	应用场景:
    		1:解压远程服务器的压缩包到指定目录
    			远程服务器创建压缩包:
    				tar -czvf /opt/sys.tar.gz /etc/fstab /etc/hosts  
    				ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"
    		2:把本地文件解压到目标机器指定目录
    			本地创建:
    				tar -czvf /opt/sys.tar.gz /etc/fstab /etc/hosts 
    				 ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/"
    	   3:copy:
				将远程主机上的某个压缩包解压缩到指定路径下。这种情况下,需要设置copy=no,远程主机上面的操作,不涉及ansible服务端
				copy:默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的,如果设置为copy=no,那么会在远程主机上寻找src源文件
    archive
    	应用场景:
    		压缩单个文件:
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m archive -a "path=/var/log/message* dest=/tmp/log.tar.gz format=gz force=true" 
    setup
    	应用场景:
    		直接执行获取主机信息:
    			ansible 目标主机名称/目标主机组名称/目标主机地址信息/all -m setup 
   lineinfile:
			功能:文件中行的添加,替换
			path参数 :必须参数,指定要操作的文件
			line参数 : 使用此参数指定文本内容
			regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
			作用:
				lineinfile:
				      dest: /etc/profile
				      regexp: "{{ item.regexp }}"
				      line: "{{ item.line }}"
				    with_items:
				    - { regexp: '^JAVA_HOME=',line: 'export JAVA_HOME=/usr/local/jdk1.8.0_144' }
				    - { regexp: '^JRE_HOME=',line: 'export JRE_HOME=$JAVA_HOME/jre' }
				    - { regexp: '^CLASSPATH=',line: 'export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib' }
			大意指,匹配以	^JAVA_HOME=开头的行,如果有,则替换成line指定的内容,如果没匹配到,则在文本末尾添加line指定的内容,如果匹配到多行,则最后一行替换成line指定的内容

ansible输出信息颜色解释:

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

`