一、批量管理服务知识介绍
1. ansible是一个基于Python开发的自动化运维工具。基于Python语言实现,由Paramiko和PyYAML两个关键模块构建。
2. ansible是一个基于ssh协议实现远程管理的工具
3. ansible软件可以实现多种批量管理操作(批量系统配置、批量软件部署、批量文件拷贝、批量运行命令)
二、批量管理服务特征介绍
1. Ansible不需要服务端,不需要守护进程服务。不需要启动任何服务 默认服务端不需要任何的配置
2. Ansible不需要单独安装客户端,基于系统自带的SSHD服务。
3. 依靠大量的模块或者使用shell/python写成脚本或程序实现批量管理
三、Ansible软件基本架构
从上图可以了解到其由以下部分组成:
核心:ansible
核心模块(Core Modules):ansible自带的模块
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
插件(Plugins):完成模块功能的补充
剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
主机群(Host Inventory):定义ansible管理的主机
四、ansible软件安装部署
1. ansible软件自动化环境架构规划
2. Ansible部署环境准备
Ansible管理服务节点需要安装软件,这里为m01,IP地址为172.16.1.61
1)安装软件包命令如下
yum install epel-release -y
yum install ansible -y
yum install libselinux-python -y #python 依赖包
2)查看Ansible软件安装了哪些文件
rpm -ql ansible
3)查看Ansible软件版本信息
ansible --version
4)Ansible被管理服务节点需要安装软件
yum install libselinux-python -y
3. Ansible批量管理方式
利用Ansible批量管理主机有两种方式:一种是密码认证的管理方式;一种是利用密钥的管理方式。
1)通过SSH密码认证方式批量管理主机
前提:假如主机nfs01和backup主机没有配置免密钥
ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数 -u 指定以什么身份远程登录 -k 采用密码方式登录
发现每次执行ansible命令都要输入root用户密码,如果不同主机的密码不一致,就要输入多次。解决办法:可以在/etc/ansible/hosts主机列表文件中添加指定配置参数信息,实现远程管理主机的效果。
注:主机列表文件中常见配置参数如下:
2)通过SSH密钥方式进行批量管理主机
a. 创建SSH秘钥对信息
交互式:ssh-keygen -t dsa
影响免交互创建密钥对创建因素:需要指定私钥存放路径;需要进行私钥文件密码设定
免交互式:ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" > /dev/null 2>&1
注:利用ssh-keygen命令参数实现免交互创建密钥对
-f:表示指定将密钥文件创建在什么路径
-P/-N:表示指定密钥文件的密码信息是什么,此处设置为空
-q:表示创建的密钥结果信息不用输出,等价于追加到空(>/dev/null 2>&1)
b.分发公钥信息,将SSH服务创建的公钥信息分发到被管理主机上
交互式:ssh-copy-id -i /root/.ssh/id_dsa.pub 被管理主机ip地址
影响免交互批量分发密钥因素:
需要有确认连接过程,需要输入yes/no:-o StrictHostKeyChecking=no 参数信息,跳过SSH连接确认信息。
需要解决密码问题:sshpass指定SSH密码信息
免交互式:sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no" 172.16.1.31
如果机器比较多,可以编写分发公钥脚本文件实现批量分发公钥
执行脚本,查看运行结果
c.编写Ansible被管理主机列表清单
vi /etc/ansible/hosts
d.利用Ansible管理命令进行批量管理
ansible 管理主机信息或者主机组信息 -m 模块名称 -a 相关模块参数
主机信息:远程主机IP地址 远程主机组名称 远程所有主机all
-m 指定相应模块
-a 利用模块中某些参数功能
五、Ansible批量管理模式和命令介绍
1. Ansible实现批量管理的两种模式
Ansible实现批量管理主机主要有两种模式,一种是利用ansible命令实现批量管理(ad-hoc模式),另一种是利用ansible剧本实现批量管理(playbook模式)
(1)ad-hoc模式
Ansible的ad-hoc模式即ansible命令行模式,这种模式常用来日常临时批量处理一些任务
(2)playbook模式
Ansible的playbook模式是针对指定的具体较大任务,事先写好执行剧本,然后在其他机器上批量执行相同的任务,属于定制化的批量执行任务。
2. ansible命令
ansible语法格式如下:
根据语法格式可知,应用ansible命令批量管理主要涉及以下6个部分
1)第一部分表示ansible批量管理命令
2)第二部分表示指定要管理的主机信息,可以是主机组名称,主机IP地址,或者是all(表示所有主机)
3)第三部分表示调用相应的ansible模块参数(-m)
4)第四部分表示指定应用ansible软件什么功能模块,即指定功能模块名称
5)第五部分表示调用相应模块功能参数(-a)
6)第六部分表示指定应用模块功能中的哪些功能,有标准参数定义。
ansible命令参数总结
3. ansible-doc命令
1)列出所有ansible支持的模块
ansible-doc -l
2)查看某个模块具体的帮助参数
ansible-doc -s command
六、Ansible模块详解
Ansible自动化服务软件实现批量管理功能必须依赖Ansible软件中众多的模块。
1. Ansible命令和脚本类型模块说明
1). command模块功能说明
功能:在远程节点上执行一个命令
官方参考链接:http://docs.ansible.com/ansible/latest/modules/command_module.html
command模块功能参数
参数:chdir---在执行某个命令前,先切换目录
参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
注:使用command模块执行远程命令时,命令中不能包括变量,类似$HOME和参数类似"<" ">" "|" 等特殊符号信息。
2). shell模块功能说明
功能说明:在远程节点上执行命令(可以是多个命令)
官方参考链接:http://docs.ansible.com/ansible/latest/modules/shell_module.html
参数:chdir---在执行莫个命令前,先切换目录
参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
注:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;
利用shell模块实现批量执行远程主机脚本时,脚本必须在远程主机上,并且授权为执行权限。
3). script---专门运行脚本模块
功能说明:把本地脚本传输到远程节点上并运行脚本
官方参考链接:http://docs.ansible.com/ansible/latest/modules/script_module.html
参数:chdir---在执行莫个命令前,先切换目录
参数:creates---判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
参数:removes---判断一个文件是否存在,如果不存在,后面的命令就不会执行
参数(必须要有的):free_form---表示执行command模块时,必须要有linux合法命令信息
注:利用script模块实现批量执行远程主机脚本时,脚本不用在远程主机上存放和授权
2. Ansible文件类型模块说明
1)copy模块功能说明
功能说明:复制文件到远程主机
官方链接:http://docs.ansible.com/ansible/latest/copy_module.html
参数:backup---对数据信息进行备份
参数:src---定义要推送数据信息
参数:dest---定义将数据推送到远程主机什么目录中
参数:owner---设置复制后的文件属主权限
参数:group---设置复制后的文件属组权限
参数:mode---设置复制后的文件权限(600 755)
批量远程复制文件
ansible web -m copy -a "src=/etc/passwd dest=/tmp/test.txt owner=test group=test mode=0755"
远程批量复制备份
ansible web -m copy -a "content='I am teacher' dest=/tmp/test1.txt backup=yes"
2)file模块功能说明
功能说明:创建及设置文件(目录)属性
官方链接:http://docs.ansible.com/ansible/latest/file_module.html
参数:backup---对数据信息进行备份
参数:src---要链接的文件路径(只能应用state=link),创建链接文件时使用
参数:path(必选参数)文件路径管理,别名方式:dest,name
参数:owner---设置复制后的文件属主权限
参数:group---设置复制后的文件属组权限
参数:mode---设置复制后的文件权限(600 755)
参数:state---如果指定参数为directory,所有不存在的子目录就会被创建
如果指定参数为file,如果文件不存在将不能被创建,如果想创建可以参考copy
如果指定参数为link,符号链接将被创建或更改
如果指定参数为hard,便会创建硬链接
如果指定参数为absent,目录将被递归删除以及文件,而链接将被取消
如果指定参数为touch,如果路径不存在将创建一个空文件,如果文件或目录存在,将接收更新文件访问和修改时间
ansible web -m file -a "dest=/tmp/dir01 state=directory"
ansible web -m file -a "dest=/tmp/file01 state=touch"
ansible web -m file -a "src=/etc/hosts dest=/tmp/link_file state=link"
3.Ansible软件类型模块说明
功能说明:yum包管理模块
官方链接:http://docs.ansible.com/ansible/latest/yum_module.html
name:执行要安装软件的名称,以及软件的版本
state:installed安装 absent(卸载)
list:指定软件名称,查看软件是否可以安装,以及是否已经安装过了
ansible 172.16.1.7 -m yum -a "list=iftop"
ansible web -m yum -a "name=iftop state=absent"
ansible web -m yum -a "name=iftop state=installed"、
4.Ansible网络服务类型模块说明
1)service/systemd模块功能说明
功能说明:Service服务管理用于CentOS6以及以前系统,而systemd命令应用于CentOS7系统
官方链接:http://docs.ansible.com/ansible/latest/modules/service_module.html
name: 指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
state:stopped started restarted reloaded
enabled:yes表示服务开机自启动 no表示服务开机不要自动启动
ansible web -m shell -a "systemctl status crond"
ansible web -m service -a "name=crond state=stopped enabled=no"
ansible web -m systemd -a "name=crond state=started enabled=yes"
2)cron模块功能说明
功能说明:管理定时任务条目信息模块
官方链接:http://docs.ansible.com/ansible/latest/modules/cron_module.html
cron模块功能参数
user参数:此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户。
job参数:此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 “echo test” 命令。
name参数:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible 会默认为计划任务加入注释,注释的内容为 #Ansible: None,假设指定计划任务的名称为 test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便以后根据名称修改或删除计划任务。
state参数:确认job或环境变量是开启或是关闭;即创建定时任务或删除定时任务。当删除计划任务时,需要将 state 的值设置为 absent。
disabled参数:如果job应该关闭(被注释掉)。只能影响状态是开启状态的定时任务条目
Ansible编写定时任务,和直接编写定时任务文件思路一样,只不过有些参数信息发生变化。系统定时任务与ansible定时任务对比如下:
设置定时任务
ansible web -m cron -a "name='test' job='/usr/sbin/ntpdate ntp3.aliyun.com >/dev/null 2 >&1' minute=*/5"
#删除定时任务
ansible web -m cron -a "name='test' state=absent"
3)mount模块功能说明
功能说明:挂载及卸载文件系统(本地或远程)
官方链接:http://docs.ansible.com/ansible/latest/modules/mount_module.html
参数src:要挂载的设备
参数path:挂载点,如/mnt
参数fstype:挂载的文件系统类型
参数opts:挂载的参数选项
参数state:present 开机挂载,仅将挂载配置写入到/etc/fstab
mounted挂载设备,并将配置写入/etc/fstab
unmounted卸载设备,不会清除/etc/fstab写入的配置
absent卸载设备,会清理/etc/fstab写入的配置
ansible web -m mount -a "src=172.16.1.31:/data path=/mnt fstype=nfs opts=defaults state=mounted"
5.Ansible用户和组类型模块说明
1)user模块功能说明
功能说明:管理系统用户
官方链接:http://docs.ansible.com/ansible/latest/modules/user_module.html
参数create_home:创建家目录,除非设置no,不创建家目录
参数group:创建用户组
参数name:创建用户的名字
参数password:创建用户密码
参数uid:创建用户uid
参数shell:创建用户的登录shell
ansible web -m user -a "name=xixi uid=8888 shell=/sbin/nologin create_home=no"
2)group模块功能说明
功能说明:管理系统用户
官方链接:http://docs.ansible.com/ansible/latest/modules/group_module.html
参数name:指定创建的组名
参数gid:指定组的gid
参数state:absent 移除远端主机的组
present创建远端主机的组
ansible web -m group -a "name=sa gid=9999"
七、Ansible最核心的组件playbook
Ansible最核心的组件playbook。Ansible主要用于进行配置管理,它在实际工作中会去编写和使用剧本,从而提升匹配管理工作的效率。
1. playbook基本语法
Ansible的playbook文件格式为YAML语法。
编写规范:http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
遵循pyyaml
①. - 用法说明,表示列表显示的内容(短横线与列表信息之间又空格)
②. : 用法说明,采用字典格式进行设置,key: value(key和value之间用冒号加空格进行分割)
③. 空格 用法说明:对内容进行分级时,需要有两个空格表示分级
补充:必须使用空格分隔ansible剧本级别,一定不要使用tab键进行分割。两个空格作为一个缩进。
2. playbook执行方式
加载执行剧本文件时,使用ansible-playbook命令
执行playbook的基本方法如下:
ansible-playbook test.yml
--verbose 参数查看剧本执行时输出的详细信息
--list-hosts参数查看剧本执行时会影响那些主机信息
-i /etc/ansible/hosts参数指定加载的主机清单文件
--syntax-check参数:检查剧本语法是否正确
-C参数只是模拟执行,不会影响主机的配置
3. playbook的输出
剧本在执行的过程中,会产生相应的输出,根据输出的信息可以掌握剧本是否完整执行,每个执行过程是否正确,以及根据输出的错误提示信息,可以排查剧本编写中的逻辑问题。
通过以上执行剧本输出的信息,可以将剧本执行过程输出的信息总结Wie三个部分,具体如下:
1)PLAY [web] :显示执行过程中加载所管理主机或者主机组信息
2)TASK [Gathering Facts]:显示对所管理主机执行的任务信息,默认最先执行的任务为收集主机信息
TASK [copy the /etc/hosts]:显示对所管理主机具体执行的任务,默认加载模块命令,可以根据name定义显示
3)PLAY RECAP:剧本执行结果汇总统计,统计对主机做了多少次改动,以及出现了多少次错误。
4. playbook扩展配置
1)playbook设置变量功能
a. 在playbook中用户自定义变量
通过vars关键字自定义变量,之后再用{{}}调用即可
也可以将变量放到单独的一个文件中,之后通过关键字“var_files”可以将变量引用到playbook中。
b. 用户无须定义,Ansible会在执行playbook之前去管理主机上搜集关于远程主机系统的信息变量
Ansible会通过模块“setup”来搜集主机的系统信息,这些搜集到的系统信息称之为Facts。每个playbook在执行前都会默认执行setup模块,所以Facts信息可以直接以变量的形式使用
可以通过在命令行中调用setup模块命令,查看所有可以调用的Facts变量信息
ansible web -m setup -u root
c. 在文件模板中,可以直接使用上述两种变量
d. 把任务的运行结果作为一个变量使用,这个叫做注册变量
把执行结果注册到一个变量中,关键字是register,待后面的任务使用。
注册变量经常和debug模块一起使用。
e. 为了使playbook更灵活,通用性更强,允许用户在执行playbook时传入变量的值,此时需要用到额外变量。
用命令行传递参数
2)playbook逻辑控制语句
参数when:条件判断语句,类似编程语言中的if
参数loop:循环语句,类似编程语言中的while
“with_items” 用于迭代的list类型变量,不仅支持简单的字符串列表,也可以支持哈希列表
嵌套循环,用[]访问内存和外层的循环
参数block:把几个任务组成一个代码块,以便针对一组操作的异常进行处理
3. playbook调试功能配置
常用的调试功能有以下功能:
ignore_errors:忽略剧本执行过程中的错误信息
tags:给剧本打标签