@ansible自动化运维详解(总述)
ansible
1|0[自动化运维应用场景]
“运维的未来是,让研发人员能够借助工具、自动化和流程,并且让他们能够在运维干预极少的情况下部署和运营服务,从而实现自助服务。每个角色都应该努力使工作实现自动化。” ——《运维的未来》
1|1[企业实际应用场景分析]
- Dev开发环境
- Test测试环境
- Pre预发布环境
- Master生成环境
1|2[自动化运维应用场景]
- 文件传输
- 应用部署
- 配置管理
- 任务流编排
1|3[常用自动化运维工具]
- Ansible:python,Agentless,中小型应用环境
- Saltstack:python,一般需部署agent,执行效率更高
- Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
- Fabric:python,agentless
- Chef:ruby,国内应用少
2|0[Ansible]
Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/
源代码仓库:https://github.com/ansible/ansible
2|1[Ansible发展史]
作者:Michael DeHaan( Cobbler 与 Func 作者)
2|2[同类型软件对比]
2|3[Ansible特性]
2|4[Ansible架构]
3|0[Ansible安装与入门]
ansible的安装方法有多种,官方文档:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
3|1Ansible安装
Ansible安装有多种方式,常用的方式有yum、源码包编译安装等
yum安装
编译安装
[PIP安装]
检验(版本)
3|2[Ansible相关文件]
[配置文件]
- /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
- /etc/ansible/hosts 主机清单
- /etc/ansible/roles/ 存放角色的目录
[ansible主配置文件]
Ansible 的配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
[inventory 主机清单]
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名,默认的inventory file为 /etc/ansible/hosts,inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
[主机清单文件格式]
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明,如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机。
3|3[Ansible相关工具]
命令 | 解释 |
---|---|
/usr/bin/ansible | 主程序,临时命令执行工具 |
/usr/bin/ansible-doc | 查看配置文档,模块功能查看工具,相当于man |
/usr/bin/ansible-playbook | 定制自动化任务,编排剧本工具,相当于脚本/usr/bin/ansible-pull 远程执行命令的工具 |
/usr/bin/ansible-vault | 文件加密工具 |
/usr/bin/ansible-console | 基于Console界面与用户交互的执行工具 |
/usr/bin/ansible-galaxy | 下载/上传优秀代码或Roles模块的官网平台 |
利用ansible实现管理的主要方式:
- Ad-Hoc即利用ansible命令,主要用于临时命令使用场景
-> Ansible-playbook主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
4|0[ansible-doc]
此工具用来显示模块帮助,相当于man
格式:
5|0[ansible]
此工具通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能。
建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点
- 范例:利用sshpass批量实现基于key验证脚本
- 范例:实现基于key验证的脚本
[Ansible格式]
[ansible的Host-pattern]
用于匹配被控制的主机的列表。
- 范例:
[通配符]
[或关系]
[逻辑与]
[逻辑非]
[正则表达式]
[显示具体的IP]
[ansible命令执行过程]
[ansible的执行状态]
- 绿色:执行成功并且不需要做改变的操作
- 黄色:执行成功并且对目标主机做变更
- 红色:执行失败
[ansible使用范例]
6|0[Ansible-playbook]
此工具用于执行编写好的 playbook 任务
7|0[ansible-vault]
此工具可以用于加密解密yml文件。
格式
范例
8|0[ansible-console]
此工具可交互执行命令,支持tab,ansible 2.0+新增
提示符格式
常用子命令
- 设置并发数: forks n 例如: forks 10
- 切换组: cd 主机组 例如: cd web
- 列出当前组主机列表: list
- 列出所有的内置命令: ?或help
范例:
9|0[ansible-galaxy]
此工具会连接 https://galaxy.ansible.com 下载相应的roles
10|0[Ansible模块(一)]
2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块。虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块。
常用模块帮助文档参考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
10|1[Command 模块]
Ansible中的默认模块,
功能:在远程主机执行命令,此为默认模块,可忽略-m选项
注意:此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
10|2[Shell模块]
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
范例:
10|3[Script 模块]
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
10|4[Copy模块]
功能:从ansible服务器主控端复制文件到远程主机
- 参数
参数 | 解释 |
---|---|
src | 用于指定需要copy的文件或目录。 |
dest | 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。 |
content | 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。 |
force | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。 |
backup | 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。 |
owner | 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。 |
group | 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。 |
mode | 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r–r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。 |
- 范例1:将本机的push_ssh_key.sh复制到远程的/tmp目录,用户为shanhe,权限为600
- 范例2:将本机test.sh复制到远程,并备份。
10|5[Fetch 模块]
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
- 参数
参数 | 解释 |
---|---|
src | (必需)要获取的远程系统上的文件。 |
dest | (必需)要将文件保存到的目录。 |
fail_on_missing | 当设置为 True 或 yes ,如果由于不明因素导致从远程主机中不能读取到该文件,则会显示 fail |
validate_checksum | 当文件fetch之后进行md5检查 |
Flat | 允许覆盖默认行为从hostname/path到/file的,如果dest以/结尾,它将使用源文件的基础名称 |
- 范例1
- 范例2
10|6[File模块]
功能:设置文件属性,创建软链接等。
- 参数
参数 | 解释 |
---|---|
path | 必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。 |
recurse | 当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。 |
state | 此参数非常灵活,其对应的值需要根据情况设定。 directory:在远端创建目录 touch:在远端创建文件 link:创建链接文件 absent:表示删除文件或目录 mode:设置文件或目录权限 owner:设置文件或目录属主 group:设置文件或目录属组 |
src | 当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。 |
force | 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况。情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。 |
owner | 用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。 |
group | 用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。 |
mode | 用于指定被操作文件的权限,比如,如果想要将文件权限设置为”rw-r-x--- “,则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的。如果想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700。 |
- 范例1
- 范例2
- 范例3
10|7[unarchive模块]
功能:解压缩。
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
- 参数
参数 | 解释 |
---|---|
copy | 默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为 |
remote_src | 和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上 |
src | 源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设copy=no |
dest | 远程主机上的目标路径 |
mode | 设置解压缩后的文件权限 |
- 范例
- 范例2
10|8[Archive模块]
功能:打包压缩保存在被管理节点。
- 参数
参数 | 解释 |
---|---|
path | 要压缩的文件或目录 |
dest | 压缩后的文件 |
format | 指定打包的类型 |
mode | 权限 |
group | 属组 |
owner | 属主 |
- 范例
10|9[Hostname模块]
功能:管理主机名。
- 参数
参数 | 解释 |
---|---|
name | 主机名 |
- 范例
11|0[Ansible模块(二)]
Ansible常用模块二。
11|1[Cron模块]
功能:计划任务
支持时间:minute,hour,day,month,weekday
- 参数
参数 | 解释 |
---|---|
minute | 分钟 |
hour | 小时 |
day | 天 |
month | 月 |
weekday | 星期 |
job | 脚本路径 |
name | 定时任务名称 |
disabled | 是否启用 |
state | 状态:absent删除 |
- 范例1
- 范例2
11|2[Yum和Apt模块]
yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本。
apt 模块管理 Debian 相关版本的软件包。
- 参数
参数 | 解释 |
---|---|
name | 安装的服务的名字 |
state | 执行命令 present installed removed latest absent 其中installed and present等效 latest标志安装yum中最新版本,absent and removed 等效 表示删除安装包 |
disable_gpg_check | 用于禁用rmp包的公钥gpg验证,默认值no 表示不做验证 |
enablerepo | 用于指定安装软件包是临时启用的yum元 |
disablerepo | 用于指定安装软件包是临时禁止用的yum元 |
- 范例1
11|3[Service模块]
功能:管理服务。
- 参数
参数 | 解释 |
---|---|
name | 定义要启动服务的名称 |
state | started #启动服务 stopped #停止服务 restarted #重启服务 reloaded #重载服务 |
enabled | 开机自启 |
- 范例
11|4[User模块]
功能:管理用户。
- 参数
参数 | 解释 |
---|---|
uid | 指定用户的uid |
group | 指定用户组名称 |
groups | 指定附加组名称 |
password | 给用户添加密码(记得单引号) |
shell | 指定用户登录shell |
create_home | 是否创建家目录 |
state | 用户状态:absent(删除) |
home | 家目录路径 |
system | 是否是系统用户 |
remove | 是否删除家目录数据:yes(删除) |
- 范例
11|5[Group模块]
功能:管理组。
11|6[get_url模块]
功能:下载模块(类似于wget)。
- 参数
参数 | 解释 |
---|---|
url | 下载的URL |
mode | 权限 |
dest | 下载的路径 |
checksum | md5值 |
timeout | 下载文件的超时时间 |
url_password | URL密码 |
url_username | URL用户 |
- 范例
11|7[mount模块]
功能:挂载目录。
- 参数
参数 | 解释 |
---|---|
src | 挂载IP及目录 |
path | 挂载的路径 |
fstype | 挂载的类型 |
opts | |
state | 挂载的状态 |
- state参数
参数 | 解释 |
---|---|
present | 开机挂载,仅将挂载配置写入/etc/fstab |
mounted | 挂载设备,并将配置写入/etc/fstab |
unmounted | 卸载设备,不会清除/etc/fstab写入的配置 |
absent | 卸载设备,会清理/etc/fstab写入的配置 |
- 范例
11|8[Setup模块]
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息。
- 范例
12|0[playbook-剧本(一)]
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
12|1[YAML语法结构]
playbook使用yml标记语言,这是一种标记语言,这种标记语言在文件的最开始需要使用三个“-”来说明文件开始,然后使用缩进来说明代码块的范围。下面通过一个简易的实例,来说明playbook的语法。
YAML 官方网站:http://www.yaml.org
[YAML语言特性]
[支持的数据类型]
YAML 支持以下常用几种数据类型:
[标量]
不可在分的量。包括字符串,布尔值,整数,浮点数,Null,时间,日期。
key对应value
[字典]
字典由多个key与value构成,key和value之间用 :分隔, 并且 : 后面有一个空格,所有k/v可以放在一行,或者每个 k/v 分别放在不同行。
[列表]
列表由多个元素组成,每个元素放在不同行,且元素前均使用"-"打头,并且 - 后有一个空格, 或者将所有元素用 [ ] 括起来放在同一行。
[三种常见的数据格式](
- XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
- JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释
- YAML:YAML Ain’t Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab
可以用工具互相转换,参考网站:
https://www.json2yaml.com/
http://www.bejson.com/json/json2yaml/
12|2[Playbook核心组件]
[host组件]
Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。
- 案例
[remote_user组件]
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户。
[task列表]
playbook的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。
如果未提供name,则action的结果将用于输出
12|3[playbook命令]
格式
常见选项
- 案例1
- 案例2
12|4[Playbook 初步]
[利用playbook创建mysql用户]
[利用playbook安装NGINX]
[利用 playbook 安装和卸载 httpd]
12|5[Playbook中使用handlers和notify]
Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
12|6[Playbook中使用tags组件]
在playbook文件中,可以利用tags组件,为特定 task 指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件。
12|7[Playbook中使用变量]
变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
[在playbook的开头通过vars进行定义]
[playbook中使用vars_files指定文件作为变量文件]
[在inventory中定义变量,主机变量优先级高于主机组变量(不推荐,容易将环境弄的特别乱)]
[更好的方式是在ansible的项目目录中创建额外的两个变量目录]
[通过命令行覆盖变量]
[变量优先级]
命令行变量—>play中的vars_files—>play中的vars变量–>host_vars中定义的变量—>group_vars/组—>group_vars/all
13|0[Playbook(二)]
13|1[template模板]
模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法。
[jinja2语言]
官方网站:
http://jinja.pocoo.org/
https://jinja.palletsprojects.com/en/2.11.x/
[数据类型]
jinja2 语言支持多种数据类型和操作:
范例:利用template 同步nginx配置文件
[template变更替换]
[常用的系统参数]
[template算术运算]
[template中使用流程控制for和if]
template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能
[playbook使用when]
when语句,可以实现条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过在task后添加when子句即可使用条件测试,jinja2的语法格式。
[playbook使用迭代with_items(loop)]
迭代:当有需要重复性执行的任务时,可以使用迭代机制对迭代项的引用,固定内置变量名为"item",要在task中使用with_items给定要迭代的元素列表
注意: ansible2.5版本后,可以用loop代替with_items
**迭代嵌套子变量:**在迭代中,还可以嵌套子变量,关联多个变量在一起使用
[管理节点过多导致的超时问题解决方法]
默认情况下,Ansible将尝试并行管理playbook中所有的机器。对于滚动更新用例,可以使用serial关键字定义Ansible一次应管理多少主机,还可以将serial关键字指定为百分比,表示每次并行执行的主机数占总数的比例
14|0[Role]
角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
默认roles存放路径
14|1[Ansible Roles目录编排]
14|2[Roles各目录作用]
14|3[创建role]
创建role的步骤
[针对大型项目使用Roles进行编排]
14|4[playbook调用角色]
- 调用角色方法1
- 调用角色方法2
- 调用角色方法3
- 调用角色方法4
14|5[案例]
[httpd角色]
[NGINX角色]
__EOF__
本文链接:https://www.cnblogs.com/zeny/p/15121538.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:ଲ小何才露煎煎饺,转载请注明原文链接:https://www.cnblogs.com/zeny/p/15121538.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)