Ansible详解
## Ansible详解
On-Premises | 本地部署 |
IaaS = 硬件 Infrastructure as a service |
基础设施即服务 |
PaaS = 操作系统 Platform as a service |
平台即服务 |
SaaS = 硬件+操作系统+服务 Software as a service |
软件即服务 |
0|1常用自动化编排工具
Ansible:python,Agentless,中小型应用环境
Saltstack:python 一般需要部署agent代理,执行效率更高
Puppet:ruby,功能强大,配置复杂,重型,适合大型环境
fabric:python,agentless
Chef:ruby,国内应用少
Cfengine
func
0|2特性
模块化:调用特定的模块,完成特定的任务
有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
支持自定义模块
基于python语言实现
部署简单,基于python和ssh,agentless支持
安全,基于Openssh
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
变量优先级:ansible -e --> playbook --> hosts(普通组 --> 公共组)
0|3相关文件
Ansible配置文件
Ansible系列命令
工具用法
ansible的Host-pattern
ansible命令执行过程
0|4Ansible常用模块
模块文档:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
Command:
在远程主机执行命令,默认模块,可忽略-m选项
-m=module name 跟模块名,默认是command模块
-a=module arguments 跟模块参数
此命令不支持 $VARNAME < > | ; & 等用shell模块实现
chdir: 进入到被管理主机目录
creates: 如果有一个目录是存在的,步骤将不会运行Command命令
ansible websrvs -a 'chdir=/data/ ls'Shell: 和command相似,用shell执行命令
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt
这些复杂命令,即使使用shell也可能会失败,
解决办法:写到脚本时,copy到远程执行,再把需要的结果拉回执行命令的机器修改配置文件,使shell作为默认模块
vim /etc/ansible/ansible.cfg
module_name = shellScript: 在远程主机上运行ansible服务器上的脚本
Copy: 从主控端复制文件到远程主机
src : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)
dest: 指定目标路径
mode: 设置权限
owner: 设置文件所属者
backup: 备份源文件
content: 代替src 指定本机文件内容,生成目标主机文件
Fetch: 应用场景:抓取目标机器日志 从远程主机提取文件至主控端,copy相反,目前不支持目录,可以先打包,再提取文件
会生成每个被管理主机不同编号的目录,不会发生文件名冲突
File: 设置文件属性
path: 要管理的文件路径 (强制添加)
recurse: 递归,文件夹要用递归
src: 创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接,硬链接
state: 状态
absent 缺席,删除
directory 创目录
touch 创文件
owner 所有者
mode 权限
link 创软链接
unarchive: 解包解压缩,有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes.
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,
如果设置为copy=no,会在远程主机上寻找src源文件
src: 源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,
如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
Archive: 打包压缩
将远程主机目录打包
path: 指定路径
dest: 指定目标文件
format: 指定打包格式
owner: 指定所属者
mode: 设置权限Hostname: 管理主机名
Cron: 计划任务
支持时间:minute,hour,day,month,weekday创建任务
删除任务
注释任务,不在生效
Yum: 管理包
可以同时安装多个程序包
Service: 管理服务
ansible srv -m service -a 'name=httpd state=stopped' 停止服务
ansible srv -m service -a 'name=httpd state=started enabled=yes' 启动服务,并设为开机自启
ansible srv -m service -a 'name=httpd state=reloaded' 重新加载
ansible srv -m service -a 'name=httpd state=restarted' 重启服务User: 管理用户
home 指定家目录路径
system 指定系统账号
group 指定组
remove 清除账户
shell 指定shell类型
安装mkpasswd
yum insatll expect
mkpasswd 生成口令
openssl passwd -1 生成加密口令删除用户及家目录等数据
Group: 管理组
ansible系列命令
0|5playbook
playbook是由一个或多个"play"组成的列表
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。
Task实际是调用ansible的一个module,将多个play组织在一个playbook中,
即可以让它们联合起来,按事先编排的机制执行预定义的动作 Playbook采用YAML语言编写用户通过ansible命令直接调用yml语言写好的playbook,playbook由多条play组成
每条play都有一个任务(task)相对应的操作,然后调用模块modules,应用在主机清单上,通过ssh远程连接,从而控制远程主机或者网络设备
playbook图解
YAML介绍
YAML是一个可读性高的用来表达资料序列的格式。
YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者
YAML Ain't Markup Language,即YAML不是XML。 不过,在开发的这种语言时,YAML的意思其实是:"Yet
Another Markup Language"(仍是一种标记语言)
特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好更多的内容及规范参见:http://www.yaml.org
YAML语法简介
在单一档案中,可用连续三个连字号(——)区分多个档案。 另外,还有选择性的连续三个点号( ... )用来表示档案结尾
次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
使用#号注释代码
缩进必须是统一的,不能空格和tab混用
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
YAML文件内容是区别大小写的,k/v的值均需大小写敏感
多个k/v可同行写也可换行写,同行使用:分隔
v可是个字符串,也可是另一个列表[]
一个完整的代码块功能需最少元素需包括 name 和 task
一个name只能包括一个task
YAML文件扩展名通常为yml或yaml
YAML语法简介
YAML语法
种常见的数据交换格式
Playbook核心元素
Hosts 执行的远程主机列表(应用在哪些主机上)
Tasks 任务集
Variables 内置变量或自定义变量在playbook中调用
Templates模板 可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags标签 指定某条任务执行,用于选择运行playbook中的部分代码。
ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
playbook基础组件
运行playbook
Playbook VS ShellScripts
安装httpd
示例:Playbook 创建用户
Playbook示例 安装httpd服务
Playbook示例 安装nginx服务
handlers和notify结合使用触发条件
Playbook中handlers使用
Playbook中tags使用
Playbook中tags使用
Playbook中变量的使用
变量名:仅能由字母、数字和下划线组成,且只能以字母开头 变量来源:
ansible setup facts 远程主机的所有变量都可直接调用 (系统自带变量)
setup模块可以实现系统中很多系统信息的显示
可以返回每个主机的系统信息包括:版本、主机名、cpu、内存
在/etc/ansible/hosts(主机清单)中定义变量
普通变量:主机组中主机单独定义,优先级高于公共变量(单个主机 )
公共(组)变量:针对主机组中所有主机定义统一变量(一组主机的同一类别)
通过命令行指定变量,优先级最高
ansible-playbook –e varname=value
在playbook中定义
vars:
- var1: value1
- var2: value2
在独立的变量YAML文件中定义
在role中定义
变量命名:
变量名仅能由字母、数字和下划线组成,且只能以字母开头
变量定义:key=value
示例:http_port=80
变量调用方式:
1> 通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用“{{ variable_name }}”才生效2> ansible-playbook –e 选项指定
ansible-playbook test.yml -e "hosts=www user=magedu"
在主机清单中定义变量,在ansible中使用变量 vim /etc/ansible/hosts [appsrvs]
192.168.38.17 http_port=817 name=www
192.168.38.27 http_port=827 name=web
调用变量 ansible appsrvs -m hostname -a'name={{name}}' 更改主机名为各自被定义的变量
针对一组设置变量 [appsrvs:vars] make="-"
ansible调用变量
将变量写进单独的配置文件中引用 vim vars.yml pack: vsftpd service: vsftpd引用变量文件 vars_files:
0|6Ansible基础元素
0|7变量
invertory参数
invertory参数
0|8模板templates
文本文件,嵌套有脚本(使用模板编程语言编写) 借助模板生成真正的文件 Jinja2语言,使用字面量,有下面形式
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false 算术运算:+, -, *, /, //, %, ** 比较操作:==, !=, >, >=, <, <= 逻辑运算:and,or,not 流表达式:For,If,When
template 的使用
template功能:根据模块文件动态生成对应的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
Template示例
Template算数运算
0|9Jinja2相关
字面量
- 表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的 Python对象。如“Hello World”
+ 双引号或单引号中间的一切都是字符串。
- 无论何时你需要在模板中使用一个字符串(比如函数调用、过滤器或只是包含或继承一个模板的参数),如4242.23
- 数值可以为整数和浮点数。如果有小数点,则为浮点数,否则为整数。在Python 里, 42 和 42.0 是不一样的
Jinja2:算术运算
Jinja2
Playbook中template变更替换
when 实现条件判断
示例:when条件判断
示例:when条件判断
Playbook中when条件判断
0|10迭代:with_items
迭代:当有需要重复性执行的任务时,可以使用迭代机制
对迭代项的引用,固定变量名为"item"
要在task中使用with_items给定要迭代的元素列表
列表格式:
字符串
字典
示例
示例:迭代
示例:迭代
示例:迭代
示例:迭代嵌套子变量
with_itmes 嵌套子变量
Playbook字典 with_items
Playbook中template for if when循环
示例
示例
0|11Roles
roles
ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。
角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
复杂场景:建议使用roles,代码复用度高
变更指定主机或主机组
如命名不规范维护和传承成本大
某些功能需多个Playbook,通过includes即可实现
Roles
roles目录结构
Roles各目录作用
创建role
创建role的步骤
(1) 创建以roles命名的目录
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
(4) 在playbook文件中,调用各角色
0|12实验: 创建httpd角色
针对大型项目使用Roles进行编排
示例
0|13实验: 创建一个nginx角色
0|14Roles案例
0|15playbook调用角色
0|16通过roles传递变量
0|17向roles传递参数
0|18条件式地使用roles
0|19Roles条件及变量等案例
0|20完整的roles架构
0|21roles playbook tags使用
0|22实验: 创建角色memcached
0|23其它功能
0|24Ansible Roles
0|25推荐资料
http://galaxy.ansible.com https://galaxy.ansible.com/explore#/
http://github.com/ http://ansible.com.cn/
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples
0|26实验: 实现二进制安装mysql的卸载
1|0安装
配置主机清单
[root@localhost ~]# cat /etc/ansible/hosts [test]
10.4.7.61 [db]
10.4.7.62
基于key认证主机
[root@ansible ~]# ssh-keygen Generating public/private
rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase
(empty for no passphrase): Enter same passphrase again: Your
identification has been saved in /root/.ssh/id_rsa. Your public key
has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is:
38:7a:74:dc:d7:71:20:86:6b:ff:19:01:34:a6:fb:fd root@ansible The key's
randomart image is:
+--[ RSA 2048]----+ | o* . | | .+.o . | | .. .. .| | o .o. ..o | | + S.o.. .. | | o o o... | |
. . ...o | | . o. | | E|
+-----------------+
将key发送到主机清单
__EOF__

本文链接:https://www.cnblogs.com/msfyang/p/15168502.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?