ansible
ansible是一个基于Python开发的自动化运维工具!(saltstack)
其功能实现基于SSH远程连接服务!
ansible可以实现批量系统配置、批量软件部署、批量文件拷贝、批量运行命令等功能
1.1.1 特点
不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端
需要依靠大量的模块实现批量管理
配置文件/etc/ansible/ansible.cfg,yum安装的不用配置。pip安装则需要
1.1.2 部署使用
yum -y install ansible //安装
yum -y install libselinux-python (如果selinux开启的话需要安装这个)
vim /etc/ansible/hosts //对软件配置主机模块
[zombie]//要求在ssh免密码登陆的基础上(创建分发完密钥后)
172.16.1.7//都是可控制的主机
172.16.1.31//主机部分可以是IP或是域名,也支持通配符,如:192.168.5.*
172.16.1.41//↓特殊的主机,特殊对待↓
172.16.1.8 ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass=123456
1.1.3 ansible软件颜色信息:
绿色: 表示查看信息,对远程主机未做改动的命令
红色: 批量管理产生错误信息
黄色: 对远程主机做了相应改动
粉色: 对操作提出建议或忠告
1.1.4 帮助:
ansible系统命令帮助文档查看方法:
ansible-doc -l --- 列出所有可用的模块信息
ansible-doc -s cron --- 查看指定模块的参数信息
ansible mount -m setup -vvvv --- 主要用于排查ansible批量管理错误(输出详细信息)
ansible软件命令参数总结(最常用)
-k, --ask-pass ask for connection password
以交互方式输入密码,进行远程管理
1.1.5 命令格式
ansible 主机模块 -m 模块 -a “参数(命令)” //不加模块的话默认是command模块
ansible zombie -a "uptime"//例子
1.1.6 模块
command//命令模块
在受控制主机执行ifconfig命令
ansible zombie -m command -a "ifconfig"
参数:
chdir //在执行命令前,切入到指定目录
creates //定义文件是否存在,如不在则运行相应命令,在存在则跳过此步骤
removes //定义文件是否存在,如存在则运行相应命令,不如在则跳过此步骤
free_form //可以输入任何系统命令,但不包括特殊变量信息和特殊符号
raw//可以使ansible像linux一样执行命令,支持特殊符号,类似shell模块
查看zombie模块下主机的22端口有没有开启 比conmmand 要好一点
ansible zombie -m rwa -a "netstat -anpt | grep 22"
shell//执行shell脚本模块,也可执行普通命令(支持特殊符号)
执行zombie模块下主机的/root/123.sh 脚本
ansible zombie -m shell -a "/root/123.sh"
批量启动docker容器
ansible zombie -m shell -a "docker start nginx"
script//把脚本发到客户端,然后执行;执行脚本命令在远端服务器上
script模块也可以用来执行脚本的,但是它和shell模块是有区别的
shell模块是执行放在客户端上的脚本;
而script模块则是在客户端上执行放在ansible服务端上的脚本
ansible zombie -m script -a "/root/123.sh"
copy//复制模块
将/root/test文件复制到zombie模块下主机的/root/test,并设置权限755,属主,属组
ansible zombie -m copy -a "src=/root/test dest=/root/test mode=755 owner=root group=root"
参数:
backup在覆盖远端服务器文件之前,将远端服务器源文件备份,备份文件包含时间信息。选项:yes|no
force //如果目标主机包含改文件,但内容不同,为yes时,则强制覆盖;为no时,则只有当目标主机的目标文职不存在文件时,才复制。默认为yes
dest //文件的目标路径,如果src是一个目录,dest也必须是目录
src //被复制到远程主机的本地文件。如果路径是一个目录,将会递归复制。如果路径使用“/”来结尾,则智慧复制目录里的内容;如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync
content //用于代替’src’,可以直接设定指定文件的内容,等价于echo
mode //定义文件或目录的权限信息,同chmod命令使用
others //所有的file模块里的选项都可以在这里使用
owner //定义属主
group //定义属组
remote_src //为False,将搜索源信息在本地/管理机上(默认)
//为True,将到远程/目标主机的机器上搜索
file//设定文件属性模块
将zombie模块下主机的/root/test.txt的权限设置成755,属主=root,属组=root
ansible zombie -m file -a "dest=/root/test.txt mode=755 owner=ansible group=root"
在zombie模块下主机创建一个/backup目录,并指定属主,属组
ansible zombie -m file -a "dest=/backup owner=oldboy group=oldboy state=directory"
使用file模块创建目录
ansible zombie -m file -a "dest=/tmp/ansible mode=755 owner=ansible group=ansible state=directory"
参数:
ownet //定义文件/目录的属主
group //定义属组
mode //定义权限,755/644
path //定义路径
src //要链接的文件路径(只能使用state=link),解释绝对/相对/不存在的路径
state //如果指定参数为directory,所有不存在的子目录将会被创建
//如果指定参数为file,如果文件不存在将不能被创建
//如果指定参数为link,符号链接将会被创建或更改
//如果指定参数为hard,便会创建出硬链接
//如果指定参数为absent,将会被递归删除目录/文件,连接将被取消
//如果指定参数为touch,如果路径不存在将创建一个空文件,如果文件
或目录存在将接收更新的文件访问和修改时间
ansible zombie -m file -a "dest=/server/scripts/test01.sh mode=0644"
ansible zombie -m file -a "dest=/tmp/oldboy_01dir/ state=directory"
ansible zombie -m file -a "dest=/tmp/oldboy_01file state=touch"
ansible zombie -m file -a "dest=/tmp/oldboy_01file state=absent"
ansible zombie -m file -a "src=/etc/hosts dest=/tmp/hosts state=link" ---创建链接文件
yum//yum模块
name代表要使用yum安装的软件名称,state则代表的是软件状态:latest最新版本,absent卸载软件,present特殊版本
ansible zombie -m yum -a "name=lrzsz state=latest"
setup//主要用于获取主机信息,信息量很大!IP 日期 网卡名 环境变量等等
ansible zombie -m setup
synchronize//rsync的一个包装器,使剧本任务更快速和简单
参数:http://docs.ansible.com/ansible/latest/synchronize_module.html
dest //将与源同步的目标主机上的路径
src //将同步到目标的源主机上的路径
delete //删除src路径中不存在的文件(在传输之后),需要=yes
service//系统服务管理模块
重启httpd服务 ##启动和停止需要使用过去式started stopped
ansible zombie -m service -a "name=httpd state=restarted"
设置httpd服务开机自启动 是|否
ansible zombie -m service -a "name=httpd enable=yes | no"
user//用户模块(管理账户与属性)
创建用户,但不创建用户的家目录
ansible zombie -m user -a "name=renyi createhome=no"
删除用户
ansible zombie -m user -a "name=ansible state=absent remove=yes"
remove=yes则表示连同家目录一起删除,等价于userdel -r
参数:
append //如果为yes,将只添加组,而不是将他们设置为组中的列表
comment //可选设置用户账户描述信息
createhome //为yes时,创建用户家目录(默认)
//为no时,不创建用户家目录
user //创建、移除、修改用户名称信息
uid //可选设置UID信息
ping//ping模块后面不用加参数,直接使用就可以了,测试连通性
ansible zombie -m ping
cron//计划任务管理模块
ansible zombie -m cron -a "name='test' user=root hour='*/10' job='/usr/bin/ls -alh &> /dev/null'"
-alh #是ls命令的参数
参数:
minute//定义分钟
hour //定义小时
day //定义日期
month //定义月份
weekday //定义周几,0-6
job //定义要执行的计划任务,建议包含的命令写全路径
name //对定时任务加上备注,避免重复
state //为present,表示创建定时任务(默认)
//为absent,表示删除定时任务
user //指定由哪个用户来执行定时任务
disabled //将定时任务信息临时关闭(在定时任务前添加注释)
//yes注释掉 no取消注释
fetch//从远程节点取来一个文件
将可控制主机的/etc/hosts文件拉到本机的/data目录(如没有会自动创建),并校验
ansible zombie -m fetch -a "dest=/data src=/etc/hosts validate_checksum=yes"
参数:
dest //定义一个保存文件的目录
src //在远程主机上要拉取的文件,必须为文件
flat //允许覆盖默认附加hostname/path行为直接转变废/file到目标上
//如果结尾有/,将使用源文件的名,类似于copy
//很明显,如果文件名是唯一的就很方便
fail_on_missing //为yes时,如由于任何原因无法读取远程文件,则任务失败
//yes为默认值
validate_checksum //获取文件后,验证源和目标校验和是否匹配。别名:Value_MD5
//yes为默认值
archive//给远程主机打包压缩文件或目录
将可控制主机的/backup目录打包压缩到/root下,文件名= 年-月-日(当天)
ansible zombie -m archive -a "path=/backup dest=/root/`date +%F`.tar.gz"
参数:
path //要压缩或打包的文件或目录的远程绝对路径
dest //把打包的文件放在那,叫什么
format //要使用的压缩类型(gz bz2 zip)
group //指定属组
owner //指定属主
mode //指定权限
exclude_path //要在path中排除的文件,绝对路径
remove //在添加到存档后,删除所有添加的源文件
unarchive//从本地机器复制一个归档文件之后进行解压
参数:
dest//远程绝对路径,其中存档应该被解压缩
src//为yes时,则目标服务器上的路径到现有存档文件进行解压缩
//为no时,则将文档归档的本地路径复制到目标服务器
exclude//列出要从解压缩操作中排除的目录和文件条目
copy//为yes时,则将文件从本地‘主’复制到目标计算机
//为no时,插件将在目标计算机上查找src归档文件
//此选项与remote_src互相排斥
remote_src //为yes时,以指示已存档的文件已经在远程系统上,而不是本地到可控制的控制器。
//此选项与copy是互斥的。
mount//挂载模块
参数:
fstype //指定挂载时的文件系统类型
opts //挂载时指定挂载参数信息
path //指定挂载点路径
src //指定将什么目录或设备进行挂载
state //为mounted,在fstab文件中的设备将被激活挂载和适当配置
//为unmounted,设备将被卸载,并不会改变fstab文件信息
absent和present只处理fstab,但将不会影响目前的挂载
如果指定mounted和挂载点不存在,挂载点将被创建
类似,指定absent将移除挂载点目录
ansible输出详细信息方法:
ansible mount -m setup -vvvv --- 主要用于排查ansible批量管理错误
synchronize//使用rsync同步文件模块
1.1.7 剧场
ansible-playbook //执行剧本的命令
剧本扩展名为 .yaml
pyYAML语法规则:
规则一:缩进
yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级
别由两个空格组成。一定不能使用tab键
规则二:冒号
CMD="echo"
yaml:
mykey:
每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的摸
版可以不需要空格)
规则三:短横线
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作
为同一个列表的一部分
核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的
一个名称跟着一个要求,而且每件事都是 &,前面的执行对了,后面的才能执行
编写方式:
多主机单任务编写方式
多主机多任务编写方式
不同主机多任务编写方式
总结说明
找什么服务器,让服务器干写什么
多使用检查命令-C(-C类似于彩排)
ansible-playbook -C 剧本路径
例如:
剧本编写内容扩展:剧本任务编写多个任务
- hosts: all
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
剧本编写内容扩展:剧本任务编写多个主机
- hosts: 172.16.1.7
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
- hosts: 172.16.1.31
tasks:
- name: show ip addr to file
shell: echo $(hostname -i) >> /tmp/ip.txt