ansible-自动化运维工具

news/2024/12/24 9:50:01/文章来源:https://www.cnblogs.com/angzhijin/p/18626623

ansible是自动化运维平台,用于集中管理多台服务器 ,进行配置管理与应用部署。

管理前提:已在受控节点(指被ansible管理的服务器或其他网络设备)上配置了密钥登录,ansible可以无密码登录到受控节点

Ansible「2.9」 中文官方文档 — Ansible Documentation

安装与配置

安装

# RedHat/CentOS 需要先安装epel源
sudo yum install epel-release
sudo yum install ansible -y

配置

主机互信配置

# 生成SSH密钥
ssh-keygen -t rsa
# 复制密钥到远程主机
ssh-copy-id /root/.ssh/id_rsa.pub root@remote_ip
# ssh 的时候不会提示保存密钥(其实也就输个yes的事情,可配可不配)
ssh-keyscan remote_ip >> ~/.ssh/known_hosts

被管主机只需要支持ssh连接就可以。

  1. 大批量的主机互信可考虑使用expect脚本
  2. 注意如果openssh升级后,需删除~/.ssh/known_hosts下对应主机的密钥再重新连接

主机清单

官方叫Inventory,听着怪怪的,其实就是相当于hosts文件,配置受控节点清单,可以采用ini格式或yaml格式配置(官方推荐yaml)。

可以在ansible命令执行时添加-i xxx/hosts指定,也可以在ansible.cfg中配置,默认的话是使用/etc/ansible/hosts

ini格式:

# xxx/hostsmail.example.com[grou1]
a.example.com
b.example.com[group2]
one.example.com
two.example.com
three.example.com
1.2.3.4
192.168.123.[110:119][grou2:vars][fathergroup:children]   # 表示该主机组下的是子主机组
group1
group2

yaml格式:

all:hosts:mail.example.com:children:webservers:hosts:foo.example.com:bar.example.com:vars:dbservers:hosts:one.example.com:two.example.com:three.example.com:
# 查看主机组(内置all、ungrouped两个主机组)
ansible xx_group --list-hosts  

ansible.cfg

执行时优先使用当前目录下的ansible.cfg,没有则使用默认的/etc/ansible/ansible.cfg

下面是ansible.cfg中包含的几类配置项,初始状态是啥也没配的。

[defaults]
inventory=./hosts    # 默认使用当前目录下的Inventory仓库, 没有的话使用默认的[inventory][privilege_escalation]
# 提权,如果受控主机的用户非root,需要配置好sudo
become=true
become_method=sudo
become_user=root[paramiko _connection][ssh_connect][persistent_connection][accelerate][selinux][colors][diff]

命令管理

ansible server_name/group_name -m module_name          # 调用模块-a "module_parameters"  # 模块参数-f num                  # 并行数

module模块

# 查看已有模块
ansible-doc -l
# 查看模块参数及使用方法
ansible-doc module_name

shell 命令行

远端执行操作系统命令

# shell 模块
ansible xx_group -m shell -a ‘sys_cmd’

file 文件

创建、删除文件/目录,修改文件/目录属性,

# file 模块
ansile xx_group -m file -a 'arg1=V1 arg2=V2 ...'
args:path/name/dest=		# 指定文件/目录绝对路径state= 				# 指定行为touch=				# 创建文件directory=			# 创建目录file=				# 对已有文件进行修改absent=				# 删除link=				# 软链接 	src指定源文件hard=				# 硬链接ower=				# 指定所有者group=				# 指定所有组mode=				# 指定权限setype=				# 指定上下文

copy/fetch 拷贝

copy: 拷贝本地文件到受控主机上

fetch: 拷贝受控主机文件到本地

# copy模块
ansible xx_group -m copy -a "src=/local/path/file dest=remote/path"
args:content=	# 写入内容到目标文件中src=		# 源文件dest=		# 目标地址owner=		# 指定所有者group=  	# 指定所属组mode=		# 指定权限# fetch模块
ansible xx_group -m fetch -a "src=remote/path/file dest=local/path"

yum 软件包

yum_repository模块用于配置受控主机的yum源。

一个标准的yum源配置(.repo)如下

[aa]
name=   	# 该yum源的描述信息
baseurl=	# 源的具体地址
enabled=	# 是否启用,0或1
gpgcheck=	# 安装时是否进行数字签名验证,0或1
gpgkey=		# gpgkey为1时使用的公钥所在位置
# yum_repository模块
ansible xx_group -m yum_respository -a "args"
args:name=description=	# baseurl=		# yum源的位置enabled=		# 启用源,true或falsegpgcheck=		# 启用数字签名验证,true或falsegpgkey=			# 指定公钥位置# yum模块
ansible xx_group -m yum -a "args"
args:name=	# 指定软件包名称state=	# present/installed(默认)-安装软件包;absent/removed-卸载安装包;latest-更新

yum可以用其他模块替代,如apt,用于其他版本的Linux系统。

service 服务

对服务的管理,systemctl

ansible xx_group -m service -a "args"
args:name=		# 指定服务enabled=	# 设置服务开机自启,yes或no,默认为空state=		# 启动/关闭服务,started/stopped/restarted

group/user 组、用户

group对组进行管理,user对用户进行管理

# group模块
ansible xx_group -m group -a "args"
args:name=		# 指定组名state=		# present-创建组,absent-删除组# user模块
ansible xx_group -m user -a "args"
args:name=		# 指定用户名comment=	# 指定注释信息group=		# 指定用户组groups=		# 指定用户附属组password=	# 指定密码   password={{‘pwd001’ | password_hash('sha512')}}  # 使用SHA512哈希算法进行加密state=		# present-创建用户,absent-删除用户shell=      # 指定shell程序

firewalld 防火墙

防火墙管理

# firewalld模块
ansible xx_group -m firewalld -a "args"
args:service=		# 指定开放服务port=			# 指定开放端口,80/tcppermanent=yes	# 设置永久生效,无默认值immediate=yes	# 设置当前生效,默认不生效state=			# enabled-创建规则,disabled-删除规则rich_rule=		# 富规则

parted/filesystem/mount/lvg/lvol

  • parted:对分区进行管理

  • filesystem:文件系统格式化

  • mount:挂载分区

  • lvg:卷组管理

  • lvol:逻辑卷管理

# parted 模块
ansible xx_group -m parted -a "args"
args:device=			# 指定哪块磁盘number=			# 指定第几个分区part_start=		# 指定磁盘划分的起始位置,不写默认为0%part_end=		# 指定磁盘划分的结束位置state=			# 指定操作,present-创建,absent-删除# filesystem 模块
ansible xx_group -m filesystem -a "args"
args:dev=		# 指定设备	fstype=		# 指定文件系统类型force=		# 是否强制格式化,默认0# mount 模块
ansible xx_group -m mount -a "args"
args:src=		# 指定挂载的设备path=		# 指定挂载点fstype=		# 指定挂载的文件系统,必填opts=		# 指定挂载选项,不指定默认为defaultstate=		# mounted-挂载并写入etc/fstab,present-写入/etc/fstab,unmounted-仅卸载,absent-卸载并从/etc/fstab移除# lvg模块
ansible xx_group -m lvg -a "args"
args:pvs=		# 指定物理卷,此命令会自动创建pv,多个pv使用','隔开vg=			# 指定卷组名称pesize=		# 指定PE大小,默认为4state=		# present(默认)-创建卷组,absent-删除卷组# lvol模块
ansible xx_group -m lvg -a "args"
args:vg=			# 指定在哪个卷组划分逻辑卷lv=			# 指定逻辑卷名称size=		# 指定逻辑卷大小state=		# present-创建逻辑卷,absent-删除逻辑卷

replace/lineinfile替换

  • replace:字符级替换
  • linefile:行级替换
# replace
ansible xx_group -m replace -a "args"
args:path=		# 指定待编辑的文件regexp=		# 指定待编辑的内容,正则表达式replace=	# 替换后的字符# linefile
ansible xx_group -m replace -a "args"
args:path=		# 指定待编辑的文件regexp=		# 指定待编辑的内容,正则表达式line=		# 替换后的行# 追加到目标文件末尾
ansible xx_group -m lineinfile -a "dest=/path/to/remote/file line='newline'"
# 删除(切记正则表达式要写合适)
ansible xx_group -m lineinfile -a "dest=/path/to/remote/file regexp='正则' state=absent"
# 替换
ansible xx_group -m lineinfile -a "dest=/path/to/remote/file regexp='正则' line='newline' state=persent"
# 插入(某一行前)
ansible xx_group -m lineinfile -a "dest=/path/to/remote/file insertbefore='正则' line='newline'"
# 插入(某一行后)
ansible xx_group -m lineinfile -a "dest=/path/to/remote/file insertafter='正则' line='newline'"

setup

用于获取被管理主机的配置信息

ansible xx_group -m setup -a 'args'
argvs:filter= 	# 筛选输出的信息,可写可不写

脚本管理playbook

ansible的playbook采用yaml格式。参数可采用K=V格式或yaml字典格式(一行一参数)。

主要包含两个元素:

  • 主机清单user/host
  • 任务列表task

此外,还有变量、文件、善后任务等其他可选内容

- name: play1描述hosts: server1remote-user: user_namegather_facts: yes/no    # 执行此play时是否需要通过setup获取主机组的信息(fact变量)vars:变量1: 值1变量2: 值2tasks:- name: 任务一模块1: argx1=vx1 argx2=vx2- name: 任务二模块x: argx1=vx1 argx2=vx2handlers:- name: ...- name: paly2描述hosts: server2tasks:...
ansible-playbook playbook.yml -i <hosts_file>  # 配置host,默认为/etc/ansible/hosts-C # 仅测试,不执行

受控主机host/user

在哪一台受控主机上以什么角色执行

key 说明
hosts 主机IP或IP组
user 使用哪个账户执行
become 切换成其他用户执行
become_method 切换方式 [sudo, su, pbrun, pfexec, doas]
become_user 切换的用户名 [root或其他用户]

当脚本里包含了become时,ansible-playbook执行时需要带上--ask-become-pass,会在执行后提示输入sudo密码

任务task

  1. task是在受控主机上执行的任务,自上而下执行。
  2. 每个task都是对模块的一次调用
  3. 建议每个task配置好name属性,相当于注释,在执行时会输出,用于提示执行情况

变量vars

变量作用域越小,优先级越高

变量定义

...vars_files:  # 定义变量文件- vars.yamlvars:			# 定义变量变量1: 值1变量2: 值2

使用{{ 变量名 }}进行引用,{{}}中两边的空格无影响

字典变量

...vars:字典1:var1: value1var2: value2

使用{{ 字典名.变量名 }}进行引用

列表变量

类似于json的yaml表示

...vars:列表名:- 变量1: 值1变量2: 值2- 变量1: 值3变量2: 值4

使用{{ 列表名[下标] }}{{ 列表名[下标].变量名 }}进行引用,下标从0开始

数字变量

{{ a + b }}		# 加
{{ a - b }}		# 减
{{ a * b }}		# 乘
{{ a / b }}		# 除
{{ a ** b }}	# 次方

注册变量

将task执行后的shell输出注册为一个变量

...tasks:- name: 执行shell命令shell: 'hostname'register: aa- name: 打印注册变量debug: msg={{aa}}

aa相当于一个字典,包含cmd(执行的命令)、rc(执行的返回值)、stdout(执行的输出结果),如通过{{aa.stdout}}只输出执行结果

fact变量

fact指被管理主机的信息,可通过setup模块获取到,包含大量键值,如:

  • ansible_default_ipv4:Ipv4信息
  • ansible_default_ipv4.address:IP地址
  • ansible_fqdn:主机名
  • ansible_bios_version:BIOS版本

内置变量

  • {{groups}}列出清单文件中定义的所有主机组及主机
  • {{groups['主机组名']}}{{groups.主机组名}}列出指定主机组
  • {{hostvars['主机名'].变量}}显示指定主机的fact变量
  • {{inventory_hostname}}显示受控主机在清单文件中的名称

变量过滤器

对变量进行操作,如类型转化、截取、加密等

{{变量名 | 函数}}

  • 字符串类型
    • 转换:数字转字符{{'3'}}{{3|string}}
    • 大小写 转换:{{aaa | upper}}{{aaa | lower}}
  • 数字类型
    • 转换:转整型{{'3'|int}};转浮点数{{'3'|float}}
    • 绝对值:{{-3 | abs}}
  • 列表
    • 长度:length
    • 最大值:max
    • 最小值:min
    • 求和:sum
    • 排序:sort
    • 打乱顺序显示:shuffle
  • 变量默认值:{{aa | default('bb')}}未定义时显示默认值,不含已定义但空值
  • 加密{{passwd | hash('加密算法')}}{{passwd | password_hash('加密算法')}}
    • 加密算法有md5sha1sha512

role

可以理解为playbook的脚手架,ansible-galaxy则是脚手架程序

通过分享和重用一个包含多个文件的文件夹(类似于include),实现一个完整的play

# 创建role
ansible-galaxy init role_name# 执行role
ansible-playbook role_name.yaml

结构

role遵循特定的文件目录结果

├─ role_name.yml
└─ roles└─ role_name├─ tasks 			# 执行的任务│  └─ main.yml├─ files			# 需要拷贝的文件├─ template			# 需要拷贝的jinja2模板├─ handlers			# Handler操作│  └─ main.yml├─ vars				# 定义变量│  └─ main.yml├─ defaults			# 默认变量│  └─ main.yml├─ meta				# 注释信息│  └─ main.yml...

role_name.yml

role的主入口

- hostsroles:- role: xxx

tasks/main.yml

-name: ...
...
-name: ...

其余部分就不再一一举例,每个文件夹下的main.yml内容实际上就是把playbook中对应部分的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858003.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yum源一键安装脚本

一、本地yum源镜像挂载到本地mkdir /mnt/cdrom mount /dev/sr0 /mnt/cdrom/ [root@test yum.repos.d]# df -h ...... /dev/sr0 4.4G 4.4G 0 100% /mnt/centos7将原有源进行备份(处理方式自行决定)cd /etc/yum.repos.d && mkdir bak && …

创建响应式数据

创建响应式数据 Vue2中 ​ 在vue2中数据写在对应的data中就是响应式的。 Vue3 ref :可以定义基本类型的响应式数据 先要导入对应的ref,然后才能使用 import {ref} from vue​ 作用:定义响应式变量。 ​ 语法:let xxx = ref(初始值)。 ​ 返回值:一个RefImpl的实例对象…

【深度剖析】自主可控的全国产方案,基于龙芯LS2K1000LA-i!

龙芯LS2K1000LA-i产品简介 LS2K1000LA-i是龙芯双核LoongArch LA264自主架构处理器。创龙科技基于LS2K1000LA-i设计的工业核心板(SOM-TL2K1000)板载的CPU、ROM、RAM、电源、晶振、连接器等所有元器件均采用国产工业级方案,国产化率100%。 此外,创龙科技基于LS2K1000LA-i设计的…

协作文档让销售工作事半功倍的秘密

在现代医疗销售行业中,高效协同是成功的关键。无论是销售方案的制定,客户拜访记录的共享,还是跨部门的合作,在线协作文档正在成为推动团队效率和精准度的核心工具。特别是在医疗销售这种信息密集型领域,在线协作文档不仅改变了团队的沟通方式,更重塑了销售流程,助力企业…

这款跨网文件安全交换系统 凭什么受到各行业的欢迎?

跨隔离网的文件传输交换,这是各个行业都会面临的场景,能解决传输问题的工具也不少,可为什么说有一款跨网文件安全交换系统,在各行业中应用都很广泛,受到各行业的欢迎呢?首先我们来看看跨网文件传输有哪些需求。一、跨网文件传输的普遍需求 跨网文件传输的普遍需求与挑战可…

模型上下文协议MCP

MCP(Model Context Protocol) Anthropic推出的一种开放协议,旨在统一LLM应用于外部数据源之间的通讯协议使之无缝集成,MCP提供了标准化协议使得LLM与所需要的上下文无缝衔接。使用MCP可以插件式为LLM的集成各种外部数据源。MCP概念上图为MCP官方所描述的MCP架构图,MCP Hosts…

TB级大文件如何安全又轻松地发送?FMail文件邮能实现

许多行业的企业存在着发送GB级、TB级大文件的业务场景,如半导体企业、汽车制造企业、跨境电商、地图测绘、生物科研等,都涉及大量大文件的内部及内外部流转需求。 在进行大文件传输时,企业常用的方式主要包括传统邮件、移动U盘拷贝、FTP传输,以及硬盘刻录通过车辆物理运输等…

客户不回消息?试试这些超实用沟通技巧

在销售与客户沟通过程中,我们时常会面临客户未回复消息的情境,这时应该如何妥善处理呢?以下提供了一些实用的沟通话术,旨在帮助你在各种情境下都能更有效地与客户取得联系。 初次接触后客户未回应 客户或许对初次接收的信息不感兴趣,又或是信息众多而被忽略。 推荐话术:“…

Spring事务管理深度解析-从实践到原理

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种。 编程式事务 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: try {//TODO somethingtransactionManager.commit(status); } c…

创建用于预测序列的人工智能模型,设计模型架构。

上一篇:《创建用于预测序列的人工智能模型,设计数据集》 序言:在前一篇中,我们创建了用于训练人工智能模型的数据集。接下来,就要设计模型的架构了。其实,人工智能模型的开发关键并不在于代码量,而在于其中的数学原理和数据集(即人类经验)的深度与质量。 创建模型的架…

原来Flutter背后的布局原理是这样的

文章首发博客网站,由于格式解析问题,你可以前往阅读原文如果你是一名web开发者应该对于元素的布局不陌生,直接给目标元素定义尺寸就可以了,如css的width/height 、android的layout_width等等,但在flutter中同样的尺寸定义可能并不会呈现出自己想要的效果 扫码关注公众号,…