ansible-doc <module_name>(如果没有网,那这个超级有用)
这个很有用,用来查单个模块的文档。
ansible-doc -l
列出所有模块
ansible-doc -s <module_name>
查看更详细的模块文档。
ansible-doc --help
使用 --help 或 -h 获取帮助信息
一,自动化运算场景与工具
场景描述
场景
假如我要为100台服务器做同一个操作,比如修改一下yum源
方案
- 手动
- 一台一台用手动或者ssh操作,效率低
- shell
- 写个脚本,到时快,但是每台机器都不太一样,占用进程,免密设置麻烦
概述
自动化运维(AIOps 或 DevOps)是指通过使用自动化工具和技术,将日常的系统运维任务、软件发布、配置管理、监控、日志分析等流程自动化,以提高运维效率、减少人工干预、降低错误率,并确保系统的高可用性和可靠性。自动化运维不仅包括基础设施的管理,还涉及软件生命周期管理、应用程序部署、监控、故障响应和性能优化等多个方面。
常见工具(很多)
- Ansible:一个基于 YAML 配置文件的自动化工具,无代理架构,易于使用,适用于服务器配置、应用部署和任务自动化。(不需要客户端)
- Puppet:一个配置管理工具,使用声明性语言来定义基础设施的状态。适用于大规模环境的自动化管理。(最完整最复杂)
- Chef:类似于 Puppet,Chef 是一个自动化平台,用于管理基础设施的配置、部署和操作。它通过 Ruby 编写自定义资源和任务。
- SaltStack:一个配置管理和自动化工具,支持并行执行任务,能够管理大量节点,特别适合大规模基础设施管理。(需要客户端)
二,ansible的概述与搭建
概述
Ansible 是一个开源的自动化工具,主要用于配置管理、应用程序部署、任务自动化和多台服务器的管理。它的设计目的是简化管理和自动化的过程,通过无代理(Agentless)的方法让运维人员能够以更高效和灵活的方式管理大量主机。Ansible 使用简单的配置语言和现有的 SSH 协议进行操作,能够非常高效地处理从单台机器到数千台机器的配置和管理任务。
1. Ansible 的特点
• 简洁性:Ansible 使用 YAML 语法编写配置文件(称为 Playbook),易于理解和维护。
• 无代理:Ansible 不需要在被管理的节点上安装任何代理软件。它通过 SSH 或 WinRM 连接到远程主机,执行命令和任务。
• 可扩展性:Ansible 提供了多种扩展机制,如自定义模块、插件和动态库存支持,可以轻松集成到现有的基础设施和工具链中。
• 跨平台支持:Ansible 可以管理 Linux、Unix、Windows 等多个平台上的主机。
• 并行执行:Ansible 支持并行执行任务,能够高效地管理大量主机。
2. Ansible 的组件
• 控制节点(Control Node):控制节点是运行 Ansible 的地方,通常是开发者或运维人员的工作站。控制节点负责执行 Playbook 和管理被控制节点。
• 被管理节点(Managed Nodes):被管理节点是由 Ansible 管理的远程主机,它们可以是任何支持 SSH 或 WinRM 的设备,如服务器、虚拟机、云实例等。
• Playbook:Playbook 是 Ansible 的核心部分,它是用 YAML 编写的配置文件,定义了一系列要在远程主机上执行的任务。Playbook 支持条件逻辑、循环、变量和包含其他 Playbook 等功能。
• 模块(Modules):Ansible 提供了大量的模块,用于执行特定的操作,如安装软件包、管理服务、文件操作等。模块是 Ansible 中执行任务的实际代码单元。
• 任务(Tasks):任务是 Playbook 中定义的具体操作,每个任务都调用一个模块来执行实际操作。
• 库存(Inventory):库存是 Ansible 用来管理远程主机的清单。库存可以是静态的(例如一个简单的 INI 文件),也可以是动态的(例如通过 API 自动生成)。
• 插件(Plugins):Ansible 提供了多种插件,可以扩展其功能,包括连接插件、回调插件、动态库存插件等。
3. Ansible 工作流程
Ansible 的工作流程通常是如下几步:
1. 控制节点发起请求:用户通过 Ansible 控制节点(通常是本地计算机)发起请求来管理远程主机。
2. 通过 SSH 或 WinRM 连接:Ansible 控制节点通过 SSH(Linux/Unix)或 WinRM(Windows)连接到远程主机。
3. 执行任务:Ansible 在远程主机上执行任务。任务是通过模块来完成的,Ansible 会依次执行 Playbook 中定义的任务。
4. 返回结果:任务执行结果返回到控制节点,供用户查看和分析。
4. Ansible 的常见使用场景
• 配置管理:自动化服务器、应用程序和服务的配置。比如安装和配置 Nginx、MySQL 等软件。
• 应用程序部署:自动化应用程序的部署过程,包括代码的推送、环境的配置等。
• 基础设施管理:自动化管理虚拟机、容器等基础设施,进行系统更新和维护。
• 云资源管理:通过与 AWS、Azure、Google Cloud 等云平台的集成,自动化云资源的创建、管理和销毁。
• 持续集成和持续部署(CI/CD):与 Jenkins 等 CI/CD 工具结合,自动化软件构建、测试和部署
搭建
环境准备
IP地址
主机名
配置要求
服务器角色
192.168.13.129/24 ansible
可用就行,大于目标主机
ansible服务器
1192.168.13.133/24
host01
可用就行
目标主机
192.168.13.134/24 host02
可用就行
目标主机
192.168.13.130/24 host03
可用就行
目标主机
ansible主机
1,设置主机名
hostnamectl set-hostname ansible
su -root
2,修改hosts文件
echo "目标主机ip1 目标主机名1" >> /etc/hosts
echo "目标主机ip2 目标主机名2" >> /etc/hosts
echo "目标主机ip3 目标主机名3" >> /etc/hosts
比如
echo "192.168.13.133 host1" >> /etc/hosts
3,关闭防火墙和SELINUX
4,设置时间同步
安装虚拟机的时候勾选,同步宿主机时间就可以了
5,配置yum源,扩展源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum install epel-release -y
6,安装ansible,只用在ansible主机安装就可以了
yum install ansible -y
ansible --version
目标主机
目标主机要打开sshd服务,并查看是否使用了22端口
systemctl restart sshd;systemctl status sshd
修改主机名
hostnamectl set-hostname host1;su
hostnamectl set-hostname host2;su
hostnamectl set-hostname host3;su
ansible命令
ansible [host-pattern] [options] [module] [arguments]
host-pattern:目标主机或主机组(如:all, webservers等)
options:命令选项(如:-i指定库存文件,-u指定远程用户等)
-i:指定库存文件路径
-u:指定远程主机的用户名
-k:在需要密码时,提示输入SSH密码(用于非免密登录的场景)
-b:使用sudo权限执行命令
-v:启用详细输出
-f:指定并发任务的数量
-o: 就是精简模式,一行显示,也可以放到最后
module:Ansible模块(如:ping, shell, yum等)
-m 【模块】的方式指定
arguments:模块的参数
-a "<arguments>":指定模块的参数。
主机清单
通过ansible的ping模块测试ansible的主机清单文件,主要验证:分组,子分组,组变量
需求1:使用ansible去ping三台主机
ansible host1 -m ping
这个警告表示Ansible无法找到你指定的目标主机或主机组,因此默认只会连接到本地主机(localhost)。出现这个问题的常见原因是库存文件为空或者没有正确指定库存文件。
解决:
rpm -qc ansible找到相关文件,有一个叫hosts的文件,和系统的hosts类似,但是ansible只能根据他操作说打开它。
将域名追加进入文件。
ansible host1 -m ping还是有问题,因为要密码和用户
ansible host1 -m ping -u 用户名 -k '密码'
需求2:给host2设置免密
先生成一个ssh的密钥
ssh-keygen [options] -t:指定密钥类型(例如 rsa, dsa, ecdsa, ed25519 等)。 -b:指定密钥的位数(适用于 RSA 密钥),例如 2048 位、4096 位等。 -f:指定密钥文件的保存路径。默认保存位置是 ~/.ssh/id_rsa ssh-keygen -t rsa -f /path/to/your_key -C:为密钥添加注释(一般用于标识密钥用途)。 -p:更改现有私钥的密码,-p '' 表示密码移除 ssh-keygen -p -f ~/.ssh/id_rsa 移除现有私钥的密码:然后在提示输入新密码时,按回车键不设置密码即可。 更改现有私钥的密码:输入密码就可以了 -q:启用安静模式,禁止显示冗余的输出信息。 -N:设置私钥的密码,如果不想设置密码,使用空字符串(""),而不是通过交互式输入。 ssh-keygen -t rsa -b 2048 -N "your_password" -P 选项用于 直接设置私钥密码,它在密钥生成时提供一个密码,而不是通过交互式输入。 ssh-keygen -t rsa -b 2048 -P "your_password" -N和-P一样,就像是-N是新版本,-P是老版本。推荐-N,但是-P也可以用。
再将密钥发送到目标主机
ssh-copy-id user@hostname 使用 ssh-copy-id 将生成的公钥复制到目标主机的 ~/.ssh/authorized_keys 文件中,以便进行免密码登录。 cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >> ~/.ssh/authorized_keys' 如果没有 ssh-copy-id 命令,可以手动将公钥内容复制到目标主机的 ~/.ssh/authorized_keys 文件中。
这样就可以免密登录了
说了这么多,还没有讲到分组之类的,前面出了命令还是牛头不搭马嘴的,其实我是想让大家先一个一个的ping,然后再说分组,让大家知道分组的好。
创建一个简单的主机清单文件
创建一个名为
hosts.ini
的清单文件,内容如下:(要说的是可以在默认的hosts文件中创建,在其他地方创建要用-i指定绝对路径才可以引用)#分组是 Ansible 中的一个概念,它帮助你将多个主机组织到一起,以便批量执行操作。你可以将主机按功能、角色、地理位置等分类到不同的组中。 [host] #这里放域名,表示主机,其它设置可以在后面空格隔开,也可以在【xx:vars】中写 host1 #host1 ansible_host=192.168.1.102表示指定ip,但是我们之前在系统的hosts做了映射,所以就没必要了,要说的时【xx:vars】中放到是大家共有的参数。 host2 host3 [host:vars] ansible_ssh_user=root #账号 ansible_ssh_pass=ly #密码 ansible_ssh_port=80 #端口 #子分组是指一个分组(父分组)下面可以包含其他分组(子分组)。子分组本质上是父分组的扩展,它能够继承父分组的所有主机和变量,并且可以定义自己的主机和变量。 #Ansible 使用 :children 关键字来定义子分组关系。父分组中通过 :children 指定哪些子分组属于它。 #【父分组:children】 #子分组1 #子分组2 #………… [all_servers:children] #父分组,简单的说就是当你有多个分组时,你可以将多个分组作为父分组的子成员,通过父分组的变量调控可以影响到其成员组。 #放组名 host [all_servers:vars] #子分组也可以设置vars
变量优先级顺序(从低到高):
- 全局变量:如
ansible.cfg
或group_vars/all
中的变量。- 组变量:如
group_vars/
目录中为特定分组(如[all_servers]
或[web_servers]
)定义的变量。- 子分组变量:子分组中的变量会覆盖父分组中的变量。
- 主机变量:
host_vars/
目录中为特定主机定义的变量,具有最高优先级。- 命令行传入的变量:通过
-e
参数传递的变量,优先级最高。ansible host -i hosts.ini -m ping
作业
三,ansible模块
概述
Ansible 模块是执行自动化任务的基本单位。模块封装了执行特定操作的逻辑,并将它们作为任务执行。通过调用模块,Ansible 能够在远程主机上执行各种操作,例如管理文件、安装软件、配置系统等。
Ansible 模块的运行方式是通过命令行工具或者 Playbook 文件调用,它们使得任务更加可复用和易于维护。每个模块通常会执行一个单独的操作,并且返回一些结果(如成功与否、返回的输出数据等)。
常见模块
模块 | 功能 | 常见参数 |
---|---|---|
ping | 用于测试目标主机的连通性。 | 无 |
command | 运行系统命令(不支持 shell 特性)。 | cmd (要执行的命令) |
shell | 在远程主机上执行 shell 命令。 | cmd (要执行的命令),creates (命令创建的文件路径,用于避免重复执行),chdir (工作目录) |
wait_for | 等待某些条件满足(如端口开启、文件出现等)。 | host (主机 IP 或域名),port (端口号),state (started 或 stopped ),timeout (超时时间) |
assert | 用于验证某些条件是否为真。如果条件不成立,任务失败。 | that (条件表达式,例如 ansible_facts['distribution'] == 'CentOS' ),msg (失败时输出的消息) |
file | 管理文件和目录的属性(如权限、所有者、符号链接等)。 | path (目标文件或目录路径),state (文件状态,如 file , directory , absent ),mode (文件权限),owner (所有者),group (用户组) |
copy | 将本地文件复制到远程主机。 | src (本地文件路径),dest (目标文件路径),mode (文件权限),owner (所有者),group (用户组) |
lineinfile | 管理文件中的单行内容(添加、修改或删除行)。 | path (文件路径),line (行内容),state (行状态,如 present 或 absent ),regexp (匹配正则) |
template | 将 Jinja2 模板文件复制到远程主机,并渲染内容。 | src (模板文件路径),dest (目标文件路径) |
cron | 管理 cron 任务,设置定时任务。 | name (任务名称),minute (分钟),hour (小时),day (日期),month (月份),weekday (星期几),job (任务命令) |
yum | 管理 CentOS/RHEL 系统上的软件包。 | name (软件包名称),state (软件包状态,如 present , absent , latest ),enablerepo (启用的仓库),disablerepo (禁用的仓库) |
apt | 用于管理基于 Debian 的系统上的软件包(如 Ubuntu)。 | name (软件包名称),state (软件包状态,如 present , absent , latest ),update_cache (是否更新缓存) |
service | 管理服务的启动、停止、重启等操作。 | name (服务名称),state (服务状态,如 started , stopped , restarted ),enabled (是否开机启动) |
user | 管理用户账户(如创建、删除用户、修改用户属性)。 | name (用户名),state (用户状态,如 present , absent ),uid (用户ID),groups (用户组),password (密码) |
group | 管理 Linux 用户组(如创建、删除用户组、修改用户组属性)。 | name (用户组名称),state (用户组状态,如 present , absent ),gid (用户组 ID) |
git | 在目标主机上操作 Git 仓库(如克隆、拉取等)。 | repo (Git 仓库 URL),dest (目标路径),version (分支或标签),clone (是否克隆仓库) |
docker_container | 用于管理 Docker 容器(启动、停止、删除等)。 | name (容器名称),state (容器状态,如 started , stopped , restarted ),image (镜像名称) |
docker_image | 用于管理 Docker 镜像(拉取、删除等)。 | name (镜像名称),state (镜像状态,如 present , absent ),tag (镜像标签) |
firewalld | 管理 firewalld 防火墙规则。 | service (服务名称),state (防火墙规则状态,如 enabled , disabled ),zone (防火墙区域) |
selinux | 管理 SELinux 状态。 | policy (SELinux 策略),state (SELinux 状态,如 enabled , disabled , permissive ) |
功能分组:
系统检查与验证:
- ping:测试主机连通性。
- wait_for:等待特定条件满足(如端口开启)。
- assert:验证条件是否为真。
文件管理与配置:
- file:管理文件和目录的权限、所有者等。
- copy:复制本地文件到远程主机。
- lineinfile:编辑文件中的单行内容。
- template:通过 Jinja2 模板渲染文件并复制。
定时任务与服务管理:
- cron:设置定时任务(cron jobs)。
- service:启动、停止或重启服务。
软件包管理:
- yum:管理 CentOS/RHEL 系统的 RPM 包。
- apt:管理 Debian/Ubuntu 系统的 APT 包。
用户与用户组管理:
- user:管理用户账户。
- group:管理用户组。
版本控制与容器管理:
- git:操作 Git 仓库(克隆、拉取等)。
- docker_container:管理 Docker 容器。
- docker_image:管理 Docker 镜像。
安全与防火墙管理:
- firewalld:管理防火墙规则。
- selinux:管理 SELinux 状态。
file模块
file
模块是 Ansible 中用于管理文件和目录的模块,可以用于设置文件或目录的属性,例如权限、所有者、符号链接等。该模块常用于配置文件的管理,比如设置文件的权限、创建目录、删除文件等。
常见用途:
- 设置文件或目录的权限、所有者和用户组
- 创建或删除文件/目录
- 管理符号链接
- 更改文件的内容状态(比如将文件删除)
模块参数:
参数 | 描述 |
---|---|
path | 目标文件或目录的路径。 |
state | 文件或目录的状态,常用值:file (文件),directory (目录),absent (文件或目录不存在)。 |
mode | 设置文件权限,格式如 0644 。 |
owner | 设置文件的所有者,通常是一个用户名。 |
group | 设置文件的用户组,通常是一个用户组名。 |
follow | 设置是否追踪符号链接。默认为 no ,如果设置为 yes ,会遵循符号链接。 |
recurse | 如果设置为 yes ,会递归操作所有子目录和文件。适用于目录操作。 |
selevel | 用于设置 SELinux 安全上下文的级别。 |
serole | 用于设置 SELinux 安全角色。 |
setype | 用于设置 SELinux 安全类型。 |
seuser | 用于设置 SELinux 安全用户。 |
常见的 state
值:
touch
:确保目标是一个文件,若目标不存在,则创建它。(有些地方可能说是file,但是这是错误的)- file:即使文件不存在也不会创建,一般用于更改(只对文件有效)
directory
:确保目标是一个目录,若目标不存在,则创建它。absent
:确保目标不存在,若目标存在则删除它(连同内部文件一起删除,如果是文件夹的话)。link
:创建符号链接,指向目标文件或目录。src=/源 dest=/目标,其它都用path不用src- hard:创建硬链接,指向目标文件或目录。src=/源 dest=/目标,其它都用path不用src
示例用法:
ansible host -m file -a "path=/root/liye state=directory mode=0644 owner=root group=root"
注意这里报错的原因是mode,通常目录的权限是0755,我的意思是要有x权限,至少要有一个x权限
ansible host -m file -a "src=/root/liye dest=/root/liye/liye.l state=link"这个是创链接的
copy模块
常见用途
- 将文件从控制节点复制到目标主机。
- 配置文件的分发。
- 复制脚本、配置文件到远程服务器。
- 设置文件权限、所有者、组等属性。
模块参数
参数 | 描述 | 示例用法 |
---|---|---|
src | 指定源文件的路径(控制节点上的文件)。 | src=/path/to/local_file |
dest | 目标文件路径(远程主机上的路径)。 | dest=/path/to/remote_file |
mode | 设置文件权限(如:0644 、0755 )。 | mode=0644 |
owner | 设置文件的所有者。 | owner=root |
group | 设置文件的所属组。 | group=root |
backup | 如果目标文件已存在,是否备份文件。备份会将文件重命名为 <filename>.<timestamp>.bak 。 | backup=yes |
force | 是否强制复制文件。如果设置为 no ,只有当文件内容发生变化时,才会复制文件;默认值是 yes 。 | force=no |
content | 将内容直接写入文件,而不是从源文件复制。此时,src 参数无效。 | content="Hello World!" |
validate | 复制文件后,验证文件内容是否符合正则表达式。 | validate='sha256sum %s' |
示例用法
示例 1:将本地文件复制到远程主机
将控制节点上的 /path/to/local_file
文件复制到远程主机的 /path/to/remote_file
。
ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file"
示例 2:复制文件并设置权限
将文件复制到目标路径,并设置文件权限为 0644
。
ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file mode=0644"
示例 3:设置文件所有者和组
将文件复制并设置文件所有者为 root
,组为 root
。
ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file owner=root group=root"
示例 4:备份目标文件
如果目标文件已存在,设置 backup=yes
会自动备份该文件。
ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file backup=yes"
备份的是目标主机上的原始文件,而不是要发送的本地文件。
备份文件会被重命名,通常是原文件名后加上一个时间戳(例如:
file.txt.1638730242.bak
)。
示例 5:强制覆盖文件
即使文件内容没有变化,也强制覆盖目标文件。
ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file force=yes"
示例 6:将内容直接写入文件
将直接内容写入文件,而不是从本地文件复制。src
参数无效。
ansible host -m copy -a "dest=/root/testfile content='This is a test file.'"(多次写覆盖)
示例 7:将目录复制到远程主机
将本地目录 /path/to/local_dir
复制到远程主机的 /path/to/remote_dir
。
ansible host -m copy -a "src=/path/to/local_dir/ dest=/path/to/remote_dir/ mode=0755"
注意:src
后面有斜杠/
,表示复制目录内容,而不是整个目录本身。不加就是复制目录,很奇怪,我的显示"changed": false,但是却移动过去了。
示例 8:验证文件内容
复制文件后,通过正则验证文件内容是否符合要求。
ansible host -m copy -a "src=/path/to/local_file dest=/path/to/remote_file validate='sha256sum %s'"