admin管理员组

文章数量:1531479

ansible使用

    • ansible发展史
    • 特性
    • ansible的命令执行过程:
    • ansible的主要组成部分
    • ansible主要组成部分
    • ansible的安装
    • ansible配置文件
    • 主机清单inventory、/etc/ansible/hosts
    • ansible的配置文件/etc/ansible/ansible.cfg
    • ansible系列命令,执行临时命令
    • ansible常见模块介绍:
    • ansible-galaxy
    • ansible-playbook:执行playbook
    • ansible-valut
    • ansible-console
    • Playbook:剧本
    • 示例
    • handlers和notify结合使用触发条件
    • tags:标签

ansible发展史

创始人:Michael DeHaan(cobbler和func的作者)func也是一个自动化运维工具
2012-03-09发布0.0.1版本,被红帽收购
2015-10-17,红帽被IBM收购

特性

模块化:调用特定的模块,完成特定的任务
有Paramiko(Python开发的模块),PyYAML(一门语言),Jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于Python和SSH服务,agentless(无代理,不需要安装代理软件),走的是ssh,而ssh服务器默认安装好的
安全,基于OpenSSH协议
支持playbook编排任务,剧本的意思。相当于shell的脚本,集中命令
幂等性:一个任务执行1遍和执行n遍效果一样,不会重复执行带来意外情况
无需代理不依赖PKI证书(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
ansible不是一个服务软件,只是一个管理工具

ansible的命令执行过程:

	1.加载自己的配置文件,默认/etc/ansible/ansible.cfg
	2.加载自己对应的模块文件,如command,默认模块可在配置文件中自定义
	3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程主机的对应执行用户¥HOME/.absible/tmp/ansible-tmp-数字.py文件
	4.给文件+x执行执行
	5.执行并返回结果
	6.删除临时py文件
	7.退出
执行状态:
	绿色:执行成功并且不需要做改变的操作
	黄色:执行成功并且对目标主机做变更
	红色:执行失败
	蓝色:执行过程,使用-v -vv -vvv,v越多,显示的信息越详细

ansible的主要组成部分

ANSBLE PLAYBOOKS:任务剧本(任务集),编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:ansible管理主机的清单/etc/anslble/hosts文件
MODULES:ansible执行命令的功能模块,多数为内置核心模块,也可自定义
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
ANSBLE:组合INVENRORY,API,MODULES,PLUGINS的绿框,可以理解为是ansible的命令工具,其为核心执行工具

ansible主要组成部分

ansible命令执行来源
	USER,普通用户,即system administrator
	CMDB(配置管理数据库)API调用
	PUBLIC/PRIVATE CLOUD API调用
	USER -> Ansible playbook -> ansible
利用ansible实现管理的方式
	Ad-Hoc 即ansible命令,主要用于临时命令使用场景
	ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
ansible-playbook(剧本)执行过程
	将已有编排好的任务写入ansible-playbook
	通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
ansible主要操作对象
	hosts主机
	networking网络设备

注意事项
	执行ansible的主机一般为主控端,中控,master或堡垒机
	主控端Python版本需要2.6以上
	被控端Python版本小于2.4需要安装Python-simplejson
	被控端如开启selinux需要安装libselinux-python
	windows不能做主控端
	absible不是一个服务,没有service文件,只是管理时执行下然后就退出了,不需要长时间运行

ansible的安装

rpm包安装:EPEL源
	yum -y install ansible	
	安装时如果出现依赖Python某些包,是因为版本不兼容,centos7的镜像中的版本过新,挂载一个centos6的镜像盘,并更新yum源,接着安装以下包
		yum install python-simplejson python-babel PyYAML python-six python-pyasn1 python-markupsafe
	安装完成后再接着安装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
确认安装:
	ansible --version

ansible配置文件

/etc/ansible/absible.cfg	:主配置文件,配置ansible工作特性
/etc/ansible/hosts			:主机清单,在此文件中是被控制的主机IP
/etc/ansible/roles			:存放角色的目录
程序:
/usr/bin/ansible			:主程序,临时命令执行工具
/usr/bin/ansible-doc		:查看配置文件,模块功能查看工具
/usr/bin/ansible-galaxy		:下载/上传优秀代码或roles模块的官网平台
/usr/bin/ansible-playbook	:定制自动化任务,编排剧本工具/usr/bin/ansible-pull远程执行命令的工具
/usr/bin/ansible-valut		:文件加密工具
/usr/bin/ansible-console	:基于console界面与用户交互的执行工具

主机清单inventory、/etc/ansible/hosts

ansible的主要功能在于批量主机操作,为了便捷的使用其中的部分主机。可在inventory file中将其分组命名

默认的inventory file为/etc/ansible/hosts

inventory file可以有多个。也可以通过dynamic inventory来动态生成

想要管理主机必须将被管理主机的IP地址放在/etc/ansible/hosts此文件中

文件中有示例,可根据示例自定义管理单台主机,或分组管理主机

/etc/ansible/hosts文件的格式
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一主机归并再多个不同的组中。
此外当如若目标主机使用了非默认的SSH端口,还可以在主机名称后使用冒号加端口来表明
例:可使用主机名或IP地址
	www.linux
	[webserver]
	www1.linux:2222 | 192.168.0.130:2222
	www2.linux
	[dnserver]
	db1.linux
	db2.linux
	db3.linux
如果主机名遵循相似的命名风格,还可以使用列表方式表示个主机
	[webserver]
	www[01:100].example		:表示www01,02,..100.example
	[dbserver]
	db-[a:f].example		:表示db-a,b,c..f.example

ansible的配置文件/etc/ansible/ansible.cfg

一般保持默认	
[default]
inventory      = /etc/ansible/hosts                         #被控端主机清单文件
library        = /usr/share/my_modules/                     #指定ansible搜索模块位置,如果需要自定ansible模块,需要放到 library 所指定的目录下
remote_tmp     = ~/.ansible/tmp                             #临时文件远程主机存放目录
	临时py命令文件存放在远程主机目录,将执行的ansible命令转换成Python文件,然后复制到远程管理主机上。在远程主机上执行一遍,执行完毕后会自动删除
local_tmp      = ~/.ansible/tmp                             #临时文件本地主机存放目录       
forks          = 5                                          #ansible在执行工作时进程数量
poll_interval  = 15                                         #默认轮询间隔时间,单位秒
sudo_user      = root                                       #被控端默认执行sudo命令所切换的用户
ask_sudo_pass = True                                        #每次执行sudo命令时是否询问sudo到目标用户的密码
ask_pass      = True                                        #每次执行ansible命令是否询问ssh密码
transport      = smart                                      #通信机制,传输时用的协议
remote_port    = 22                                         #远程连接被控端的ssh端口
module_lang    = C                                          #模块和系统之间通信的语言,默认为C语言
gathering = implicit                                        #控制默认facts收集,远程系统变量
roles_path    = /etc/ansible/roles                          #角色存储路径
host_key_checking = False                                   #是否检查远程主机密钥
sudo_exe = sudo                                             #sudo远程执行命令
sudo_flags = -H -S -n                                       #传递sudo之外的参数
timeout = 10                                                #SSH超时时间
remote_user = root                                          #指定默认的远程连接用户
log_path = /var/log/ansible.log                             #ansible日志文件,执行ansible的用户需要对日志文件具有写入权限,建议取消注释启用,记录日志有利于排错
module_name = command                                       #ansible默认执行的模块
executable = /bin/sh                                        #执行的shell环境,用户shell模块
hash_behaviour = replace                                    #如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换
private_role_vars = yes                                     #默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量
private_key_file = /path/to/file                            #私钥文件存储位置
command_warnings = False                                    #command模块Ansible默认发出警告
nocolor = 1                                                 #ansible输出带上颜色区别,0表示开启,1表示关闭
pipelining = False                                          #开启pipe ssh通道优化


[inventory]

[privilege_escalation]
#出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置
become=True                                                 #是否sudo
become_method=sudo                                          #sudo方式
become_user=root                                            #sudo后变为root用户
become_ask_pass=False                                       #sudo后是否需要验证密码


[paramiko_connection]
pty=False                                                   #是否禁用sudo功能


[ssh_connection]
#Ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s   #ssh连接时的参数
pipelining = False                                          #SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 ansible 执行没有传输时 ssh 在被控机器上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项
scp_if_ssh = smart                                          #该项为True时,如果连接类型是ssh,使ansible使用scp,为False是,ansible使用sftp。默认为smart,smart为先尝试sftp,然后尝试scp

[persistent_connection]                                     #持续连接
connect_timeout = 30                                        #ansible如果在30秒内没有收到请求,则关闭连接,默认为30秒
command_timeout = 30                                        #ansible执行命令如果在30秒内没有收到回应则认为命令超时

[accelerate]                                                #缓存加速
accelerate_port = 5099                                      #加速连接端口5099
accelerate_timeout = 30                                     #命令执行超时时间
ccelerate_connect_timeout = 5.0                             #连接超时时间,单位为秒
accelerate_daemon_timeout = 30                              #上一个活动连接的时间,单位为分钟
accelerate_multi_key = yes                                  #允许多个私钥被加载到daemon

[selinux]
special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p        #文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统
libvirt_lxc_noseclabel = yes                                #将此设置为yes,以允许libvirt_lxc连接在没有SELinux的情况下工作

[colors]
#Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。
highlight = white
verbose = blue
warn = bright purple
error = red
debug = dark gray
deprecate = purple
skip = cyan
unreachable = red
ok = green
changed = yellow
diff_add = green
diff_remove = red
diff_lines = cyan

[diff]
always = no
context = 3

ansible系列命令,执行临时命令

ansible显示模块帮助
	ansible-doc [option] [mudule]
		-a	:显示所有模块的文档
		-l	:列出可用模块
		-s	:显示指定模块的playbook片段
	示例:
		ansible-doc -l		:列出所有模块
		ansible-doc ping	:查看指定模块帮助用法
		ansible-doc -s ping	:简要查看指定模块的帮助用法
ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于ssh-key验证的方式连接各个被管理服务器
基本用法:
	ansible <host-pattern> [-m modules_name] [-a]:-a是模块的参数,例如ls是模块,ls自身有很多参数,ansible的模块参数需要-a指定
		--version:显示版本
		-m modules:指定模块,ansible配置文件中默认模块为command
					需要修改/etc/ansible/ansible.cfg找到#module_name = command,修改即可
		-v:详细过程-vv -vvv更详细
		--list:显示主机列表
		-k:提示输入ssh连接密码,默认为key验证
		-K:提示输入sudo时的口令
		-C:检查,但不执行
		-T:执行命令的超时时长,默认10s
		-u user:执行远程执行的用户
		-b:代替旧版的sudo 切换
			--become-user=username:指定sudo的runas用户,默认为root

ansible的host-pattern:匹配主机的列表有以下几种方式

all:标识所有在/etc/ansible/hosts文件中定义的主机
*:通配符
	ansible "*" -m ping			:所有主机
	ansible "192.168.40.*" -m ping 	:40网段的主机
	ansible "*server" -m ping 	:ping所有组名为server结尾的组
或关系:
	ansible "webserver:appserver" -m ping	:两个组内的所有主机
	ansible "192.168.40.140:192.168.40.139" -m ping :PING两个主机
与关系:
	ansible "webserver:&appserver" -m ping	:某一个主机IP在webserver并且同时也在appserver组中
非关系:
	ansible 'webserver:!appserver' --list	:表示在webserver组中,但是不在appserver组中
	注意:此处是单引号
正则表达式:
	ansible "~(web|app).*\.magedu\" -m ping	
		注意:使用正则表达式前面必须有 ~ 符号,. 需要转义

ansible的命令执行过程:

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

执行状态:
	绿色:执行成功并且不需要做改变的操作
	黄色:执行成功并且对目标主机做变更
	红色:执行失败
	蓝色:执行过程

ansible常见模块介绍:

ansible-doc -s mudules_name	:查看模块帮助
	ansible-doc -s shell command script	:这三个模块里面都有以下子命令
		chdir:在远程主机上切换目录,相当于本机的cd命令
			例:ansible all -a 'chdir=/data touch file1'	:先进入到data目录,然后touch文件
				ansible all -a 'chdir=/data/ ls'	:查看
		creates:如果远程主机上文件存在,则此命令不执行
			例:ansible all -a 'creates=/etc/fstab rm -f /data/*'	:/etc/fstab文件存在。所以后面的命令不执行
				ansible all -a ' ls /data/'	:查看
		removes:如果远程主机上文件不存在,则此命令不执行
			例:ansible all -a 'removes=/etc/fstab rm -f /data/*' 	:如果/etc/fstab文件存在,后面的命令执行
ping模块是个小模块,只是用来测试主机之间是否连通,绿色为通,红色为不通
	示例:
		ansible all -m ping		:all是所有在hosts文件中的主机
		ansible webserver -m ping	:所有在webserver组的主机
		ansible 192.168.40.140 -m ping	:单个主机

command:在远程主机执行命令,默认模块,编写命令时可忽略 -m 选项
	示例:
		ansible webserver -m command -a 'useradd cheng'	:创建用户
		ansible webserver -m command -a 'getent passwd cheng'	:查看是否创建成功
		ansible webserver -a 'getent passwd cheng'	:一样的效果,command是默认模块,可省略-m选项
		ansible webserver -a 'echo 123123|passwd --stdin cheng'	
			此命令不支持变量,管道等,输出只是打印了一遍123123|passwd --stdin cheng,用shell模块支持简单变量等

shell:和command相似,用shell执行命令,如果不想每次-m shell指定,可直接修改配置文件ansible.cfg,找到默认模块那一行改为shell
	ansible webserver -m shell -a 'echo 123123|passwd --stdin cheng'	:修改cheng用户密码
	调用bash执行命令。类似cat /tmp/stanley.md|awk -F '|' '{print $1,$2}' &> /tmp/example.txt这些复杂命令即使使用shell模块也可能会失败,解决办法,写到脚本里,
	copy到远程。执行,再把需要的结果拉回执行命令的设备

script:在远程主机上运行ansible服务器上的脚本
	-a "/path/to/script_file"
	ansible webserver -m script -a /data/ping.sh
	示例:编写脚本test.sh
		#!/bin/bash
		hostname
		sed -i 's#^SELINUX=.*#SELINUX=AAA#' /etc/selinux/config
	ansible all -m script -a '/root/test.sh'	:复制过去执行并返回结果
	ansible all -a 'grep "^SELINUX" /etc/selinux/config'	:查看
	
copy:从服务器复制文件到客户端
	ansible-doc -s copy
		src=:源文件,也就是ansible主机的文件,全部使用=号赋值
		dest=:目标文件,被ansible管理的主机
		backup=:如果目标有同名文件,会先将目标文件备份,然后在copy过去
		owner=:指定所属主
		group=:指定所属组
		mode=:指定权限
	示例:
		ansible all -m copy -a 'src=/etc/fstab dest=/data/ mode=600'	:将本机fstab文件复制到被管理主机上/data/目录下并修改文件权限
		ansible all -a 'ls -l /data/fstab'	:查看,注意这里不支持使用ll
		ansible all -m copy -a 'src=/etc/issue dest=/data/fstab backup=yes'	
			再次复制时有backup选项,它会先将原有的fstab文件备份,接着在copy,备份文件名格式:fstab.4020.2019-10-11@20:44:03~
		ansible all -m copy -a 'src=/data/bin dest=/data/'	:将/data/bin目录copy到远程主机
		ansible all -m copy -a 'src=/data/bin/ dest=/data/'	:/data/bin/加斜线表示bin目录下文件copy到远程主机,注意区分
		
fetch:从客户端取文件至服务器端,和copy相反
		注意:如果取目录需要先将目录使用tar压缩,不支持直接取目录
	ansible-doc -s fetch
		dest:这里的目标是本机的某个目录,因为是从远程主机抓取到本机,所以dest是本机目录
		src:这里的源文件反而成了远程主机上的文件,只能抓取文件,不能抓取目录,遥想抓取目录将目录打包
	示例:
		ansible all -m fetch -a 'src=/data/file1 dest=/mnt/'
			从远程主机data目录下复制file1文件到本机的mnt目录下。/mnt目录下会创建以远程主机IP命名的目录,目录下就是复制过来的内容
		ansible all -a 'tar cf /root/data.tar /data/'	:将远程主机上的data目录打包成tar文件
		ansible all -m fetch -a 'src=/root/data.tar dest=/data/':再将打包文件取到本机data目录下

file:设置文件属性
	ansible-doc -s file
		owner:设置文件所属主
		group:设置文件所属组
		mode:设置文件权限			
		src:源文件,主要是配合link,为哪个文件创建链接
		state=:touch创建、absent删除文件、link创建软链接、hard创建硬链接、directory创建目录
		path:将来管理的文件路径,要写清,dest,name和path同义
	示例:
		ansible all -m file -a 'path=/data/file.txt state=touch mode=000'	:创建文件并设置属性,前提要指明在哪个路径下创建
		ansible all -a 'ls -l /data/file.txt'	:查看
		ansible all -m file -a 'path=/data/file1 state=absent'	:absent删除file1文件
		ansible all -m file -a 'src=/data/bin path=/root/bin.link state=link'
			为bin目录创建链接,src指明为bin,path是指明创建后的路径,link创建软连接
		ansible all -m file -a 'src=/data/file.txt path=/root/file.link state=hard'	:创建硬链接
		ansible all -m file -a 'path=/data/haha state=directory'	:创建一个目录
		ansible all -m file -a 'path=/data/haha state=absent'	:删除目录,删文件也相同
	
hostname:管理主机名
	ansible-doc -s hostname
		name=:后面跟替换的主机名即可
	示例:	
		ansible 192.168.40.139 -m hostname -a 'name=centos6_2'
			修改主机名,主机名文件也会修改
	
cron:计划任务
	ansible-doc -s cron
		month:月
		weekday:周0,6
		day:天
		hour:时
		minute:分
		reboot:重启后执行的任务计划
		job:要执行的命令
		name:为计划任务去个名称
		state:absent删除任务计划
		disabled:禁用cron任务
	示例:
		ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall ha ha ha!!!" name=wall'
			创建任务,每5分钟并且在周六日执行wall hahaha命令。注意是命令的绝对路径,然后为任务创建了命令叫wall
		ansible all -a 'crontab -l'	:查看计划任务
			#Ansible: wall	:名字
			*/5 * * * 0,6 /usr/bin/wall ha ha ha!!!
		ansible all -m cron -a 'minute=*/5 weekday=0,6 job="/usr/bin/wall ha ha ha!!!" name=wall disabled=yes'
			禁用cron任务,要明确写明为那一条任务禁用,要启用将disabled=no就可以了
		ansible all -m cron -a 'name=wall state=absent'	:删除计划任务给出任务名即可,前提是创建任务时有名字

yum:管理包,必须是使用yum管理包的系统才行
	ansible-doc -s yum
		list:
		name=:给出要安装的软件名,安装时多个软件名使用逗号隔开
		state=:`present' or `installed'是安装包,`absent' or `removed'是删除包
	示例:
		ansible all -m yum -a 'name=vsftpd state=installed':可省略state=installed,因为默认就是安装包
			在安装时确认yum源,我在使用此条名命令时,centos6主机上的yum源有centos7的镜像源,执行此命令时,却升级了bash,glibc等包,导致centos6无法使用,后来在centos6主机上将centos7yum源清除,安装正常,注意,不过此条命令不常用
		ansible all -m yum -a 'name=httpd,dhcp state=installed'	:安装多个时,使用逗号隔开
		ansible all -m yum -a 'name=httpd,dhcp state=absent'	:卸载包
		ansible all -m yum -a 'name=vsftpd state=absent'	:卸载包
		
service:管理服务
	大家知道centos6和centos7管理服务的方式不同,但是在ansible中全部统一,由service模块管理即可
	ansible-doc -s service
		enabled:yes是开机自启动
		name:给出服务名
		state:started'/`stopped,`restarted',`reloaded'
	示例:
		ansible all -m service -a 'name=vsftpd state=started enabled=yes'	:启动vsftpd服务并设置为开机自启动
		ansible all -a 'ss -nltup'	:查看端口是否开启
		ansible all -m service -a 'name=vsftpd state=stopped'	:停止服务
		ansible all -m service -a 'name=vsftpd state=restarted'	:重启
		ansible all -m service -a 'name=vsftpd state=reloaded'	:重新加载配置文件

user:管理用户
	ansible-doc -s user
		append:yes加入到附加组
		group:指定主组
		groups:指定附加组
		home:指定家目录
		name:指定用户名。用于创建,删除,修改
		password:指定用户密码,是加密后的密码,可使用openssl passwd -1输入两遍密码后然后复制到ansible命令中
		remove:=yes删除家目录
		shell:指定用户shell
		state:absent删除用户,但是不删除用户家目录
		system:指定为系统用户
	示例:
		ansible all -m user -a 'name=cheng password=123123 groups=root'	:创建用户并指定密码和附加组
		ansible all -a 'id cheng'	:查看
		ansible all -m user -a 'name=test home=/data/testhome shell=/sbin/nologin groups=cheng'
			创建test用户。home为/data/testhome,shell为/sbin/nologin groups为cheng 
		ansible all -m user -a 'name=test state=absent remove=yes':删除用户并删除家目录

group:管理组
	ansible-doc -s group 
		state:absent删除组
		system:系统组
		name:指定组名
	示例:
		ansible all -m group -a 'name=testgroup state=present'	:创建一个组
		ansible all -m group -a 'name=testgroup state=absent'	:删除一个组	

ansible-galaxy

连接htpps://galaxy.ansible下载响应的roles(角色)
	htpps://galaxy.ansible	:此网站是个开源网站,里面存放的是各个大牛自己写的playbook,然后上传到此网站,各种项目的,可下载修改
	roles角色的理解:将多个脚本存放在一个目录结构中,我们下载时将整个目录下载,其中包括好多playbook(剧本。脚本)
示例:
	ansible-galaxy list	:列出所有已安装的Galaxy
	ansible-galaxy install geerlingguy.redis	:下载role角色
	cp -r /root/.ansible/roles/geerlingguy.redis/ /root/.ansible/roles/test.redis
		可以复制一份当作自己的role,然后进行修改
	ansible-galaxy remove geerlingguy.redis		:删除role角色

ansible-playbook:执行playbook

示例:ansible-playbook hello.yml
	
cat hello.yml
	#hello world yml file
	- hosts:webserver
	  remote_user:root
	  tasks:
		- name:hello world
		  command:/usr/bin/wall hello world
注意:格式必须对其

ansible-valut

功能:管理、加密和解密yml文件,用的不多,了解一下
示例:
	ansible-valut encrypt hello.yml		:加密
	ansible-valut decrypt hello.yml		:解密
	ansible-valut view hello.yml		:查看
	ansible-valut edit hello.yml		:编辑加密文件
	ansible-valut rekey hello.yml		:修改口令
	ansible-valut create hello.yml		创建新文件

ansible-console

2.0新增,可交互执行命令,支持tab补全,用的不是特别多,但是要知道,使用与测试用

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

示例:
	[root@centos7_1 ~]#ansible-console	直接回车
	Welcome to the ansible console.
	Type help or ? to list commands.

	root@all (3)[f:5]$ list
	192.168.40.139
	192.168.40.140
	192.168.40.142
	root@all (3)[f:5]$ cd webserver			:切换组
	root@webserver (2)[f:5]$ forks 10		:修改并发数
	root@webserver (2)[f:10]$ list
	192.168.40.142
	192.168.40.139
	root@webserver (2)[f:10]$  file			:tab键补全查看
	file        files       filesystem  
	root@webserver (2)[f:10]$ file dest=/data/ansible.txt state=touch	:可直接使用file模块进行创建文件
	root@webserver (2)[f:10]$ shell ls /data/ -l	:使用shell模块调用shell命令查看

Playbook:剧本

是由一个或多个"play"组成的列表

play的主要功能在于将预定义的一组主机,装扮成实现通过ansible中的task定义好的角色。task实际是调用ansible的一个模块,将多个paly组织在一个playbook中,即可以让他们联合起来,按时限编排的机制执行预定义的动作

playbook采用YAML语言编写

YAML介绍
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,摆阔XML,C,Python等
特性:
	可读性好
	和脚本语言的交互性好
	使用实现预言的数据类型
	有一个一致的信息模型
	易于实现
	可以基于流来处理
	表达能力强,扩展性好
官网地址:http://www.yaml	:网站中定义了YAML在各种语言中书写的格式

YAML语法简介
	在单一文件中,可用连续三个 - (减号)区分多个文件段,另外,还有选择性的连续三个 . 用来表示档案结尾
	慈航开始正常写playbook的内容,一般建议写明该playbook的功能
	使用#号注释代码
	缩进必须是统一的,不能空格和tab混用,缩进用两个空格
	缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
	YAML文件内容是区别大小写的,key/value的值均需大小写敏感
	key/value的值可同行写也可换行写,同行使用:分隔
	value可是个字符串,也可是一个列表
	一个name只能包括一个task
	YAML文件扩展名通常为yml或yaml
list:列表,其所有元素均使用"-" 打头,注意-后面有一个空格
字典:通常由多个key与value构成
	示例:
		name: create user
		
		tasks: name=vsftpd
		也可以将key:value放于{}花括号中表示,用逗号分隔开
			{name: create user,tasks: name=vsftpd}

Playbook核心元素:

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

hosts:
	playbook中的每一个play的目的都是为了让特定主机以某个特定的用户身份执行任务,hosts用于指定要执行指定任务的主机,须事先定义在=主机清单中
	可以是以下形式:
		www.cheng
		www.cheng:www.ning
		192.168.40.5
		192.168.40.*
		webserver:appserver		:或关系。两个组的并集
		webserver:&appserver	:与,两个组的交集
		webserver:!appserver	:在webserver组,但不在APPserver组
			
remote_user:
	远程时执行命令的用户,可用于host和task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务。
	此外,甚至可以在sudo时使用sudo_user指定sudo时切换身份的用户
	- hosts: wenserver
	  remote_user
	  tasks:
	    - name: test connect	:任务名称
		  ping:					:模块
		  remote_user: ning		:执行命令的用户身份
		  sudo: yes				:默认sudo用户为root
		  sudo_user: cheng		:让ning用户使用cheng用户sudo权限执行此模块中定义的命令,前提是在远程主机上,sudo配置文件中cheng用户是否为ning用户授权了sudo权限

task列表和action:
	play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
	task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行时幂等的。这意味着多次执行是安全的,因为其结果是一致的
	每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰的描述任务执行步骤,如果为提供name,则action的结果将用于输出
		
tasks任务列表
	两种格式:
		1.action: module_name arg	:action后跟模块名和模块的参数用的不多
		2.module_name: arg			:直接模块名后面分参数,建议使用,常用
	注意:shell和command模块后面跟命令,而非key=value		某任务的状态在运行后为changed时,可用过"notify"通知给相应handle
任务可以通过"tags"打标签。可在ansible-playbook命令上使用-t指定进行调用
	例:
		tasks:
		  - name: disable selinux
		    shell: /sbin/setenforce 0
		
如果命令或脚本的退出码不为0,使用场景为当你认为某个错误信息,不是什么大问题,但是它提示错误时,可以使用如下方式代替:
	tasks:
	  - name: run this cammand and ignore the result
	    shlle: /usr/bin/aaabbb || /bin/true		:显然是没有aaabbb这样的命令的,肯定会报错,使用短路或执行后面的命令/bin/true,这样就不会报错了

运行playbook的方式

ansible-playbook <filename.yml> [option]
常见选项:
	-C:只检测可能会发生的改变,但不是真正的运行这个剧本
	--list-hosts:列出运行任务的主机
	--list-tags:列出标签
	--list-tasks:列出任务
	--limit 主机列表:只针对主机列表中的主机执行
		例:ansible-playbook test.yml --limit 192.168.40.140	:只针对40.140这台主机执行
	-v -vv -vvv:显示过程
	
示例测试文件:cat test.yml
	---
	- hosts: appserver
	  remote_user: root

	  tasks:
		- name: test connect
		  ping:
		- name: display hostname
		  shell: /usr/bin/hostname

playbook检查:

	ansible-playbook -C test.yml

执行

	ansible-playbook test.yml -v	:-v详细信息,-vv,-vvv

示例

1、使用ansible在多台主机上添加用户,前提是已经经过SSH key验证

ansible all -m user -a 'name=test home=/data/test shell=/sbin/nologin group=root uid=9527'

2、使用playbook创建nginx用户并指定属性。安装nginx包,将本地编辑好的nginx配置文件复制给远程主机,并启动服务,设置为开机自启

	vim install_nginx.yml		
		---
		- hosts: appserver
		  remote_user: root
		 
		  tasks: 
			- name: create group
			  group: name=nginx system=yes gid=80
			- name: create user
			  user: name=nginx home=/data/nginx group=nginx shell=/sbin/nologin uid=80 password='$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfgirYaeNOZQWmVGD9o/2Bj3n2fCS/'
			- name: install nginx
			  yum: name=nginx
			- name: copy config_file
			  copy: src=/root/playbook/nginx.conf dest=/etc/nginx/ backup=yes
			- name: start nginx service
			  service: name=nginx state=started enabled=yes
	
	使用Python生成sha512算法密码:注意,每次虽然是相同的密码,但是得出加密后的字符并不相同
		python -c 'import crypt,getpass;pw="123123";print(crypt.crypt(pw))
		$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfgirYaeNOZQWmVGD9o/2Bj3n2fCS/
	
	检查语法:
		ansible-playbook -C install_nginx.yml
	
	执行此playbook
		ansible-playbook install_nginx.yml
		
	验证:
		ansible appserver -a 'ss -nlt'	:验证端口是否开启,是否为自定义端口,此处当时将端口改为了8080
		ansible appserver -a 'getent passwd nginx'	:验证用户是否存在且为自定义属性
		ansible appserver -a 'ls -l /etc/nginx/'	:验证是否有备份文件,因为上面定义了备份
		ansible appserver -a 'ls -a /data/nginx'	:验证Apache用户家目录,上面指定了家目录

handlers和notify结合使用触发条件

handlers
	也和tasks一样是一个列表,只不过 handlers是被动触发才执行,这些task与前述的task并没有本质上的不同,用于关注的资源变化时,才会采取定义的操作
notify
	此动作可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,
	仅在所有的变化发生完成之后一次性执行指定的操作,在notify中列出的操作称为handler,
	也即notify中调用handler中定义的操作

示例:拿上面的playbook做实验:

vim install_httpd.yml		
	---
	- hosts: appserver
	  remote_user: root

	  tasks:
		- name: create group
		  group: name=apache system=yes gid=80
		- name: create user
		  user: name=apache home=/data/httpd group=apache shell=/sbin/nologin uid=80 pass
				word='$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfg
				irYaeNOZQWmVGD9o/2Bj3n2fCS/'
		- name: install httpd
		  yum: name=httpd
		- name: copy config_file
		  copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
#	  notify: restart service		:此处定义notify触发条件,要求此处和handlers中的任务名必须相同
	  notify						:多个触发条件写法稍微不同
		- restart service			:第一个触发条件,前提是httpd.conf文件修改了内容,没有修改内容不会触发
		- check service				:第二个触发条件
		- name: start httpd service
		  service: name=httpd state=started enabled=yes
				 
	  handlers:		:handlers和tasks一样是一个列表
		- name: restart service			:此处就是任务的名称,要求此处的名字必须和notify相同
		  service: name=httpd state=restarted
		- name: check service			:被触发后执行以下命令
		  shell: /usr/bin/killall -0 httpd &> /tmp/httpd.log	:执行时要确定远程主机有没有killall这个命令
																			killall命令来自psmisc包,没有就安装这个包

tags:标签

为某一个任务添加标签,通常为一个单词。一个动作可有两个标签,使用逗号隔开,使得每次不用执行整个playbook,从而节约资源和时间

示例:拿上面的playbook做实验:
vim install_httpd.yml		
	---
	- hosts: appserver
	  remote_user: root

	  tasks:
		- name: create group
		  group: name=apache system=yes gid=80
		- name: create user
		  user: name=apache home=/data/httpd group=apache shell=/sbin/nologin uid=80 pass
				word='$6$RItuBfi9Hg5VMpn4$Y6c3Lyq85yy1gEc2qzcrZqJ7T0YC3Tvv.AtNbk08X.0V/uf.TNbEKkbyjfg
				irYaeNOZQWmVGD9o/2Bj3n2fCS/'
		- name: install httpd
		  yum: name=httpd
		- name: copy config_file
		  copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
		  tags: config,copy		:添加标签名,多个标签使用逗号隔开,两个标签执行效果相同
											  在执行此标签时,下方的notify同时出发,所以handlers中命令也会执行
	  notify
		- restart service			
		- check service	
		- name: start httpd service
		  tags: service			:添加标签名
		  service: name=httpd state=started enabled=yes

	  handlers:		
		- name: restart service			
		  service: name=httpd state=restarted
		- name: check service			
		  shell: /usr/bin/killall -0 httpd &> /tmp/httpd.log

执行标签 -t 指定标签名

ansible-playbook -t config install_httpd.yml
ansible-playbook -t "config,service" install_httpd.yml	:可一次执行两个标签,逗号隔开,注意引号"

笔记记录,不喜请绕路!

本文标签: 工具ansible