day1:ansible
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.repoyum clean all
yum makecache
yum install epel-release -y6,安装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_rsassh-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'"
user模块
user
模块是 Ansible 中用于管理用户账户的模块,可以用来创建、删除或修改远程主机上的用户账户。它提供了多种参数,可以灵活地管理用户的相关设置。
常用的 user
模块参数
参数 | 类型 | 描述 | 默认值 | 常用度 |
---|---|---|---|---|
name | 字符串 | 必填,指定用户的用户名。 | 无 | ★★★★★ |
state | 字符串 | 用于管理用户的状态,present 表示创建用户,absent 表示删除用户。 | present | ★★★★★ |
password | 字符串 | 设置用户的密码,通常是加密后的密码。 | 无 | ★★★★☆ |
echo "mypassword" | openssl passwd -1 -stdin
| ||||
comment | 字符串 | 设置用户的描述信息,通常是用户的全名或其他相关信息。 | 无 | ★★★★☆ |
group | 字符串 | 设置用户的主组,用户只能属于一个主组。 | 无 | ★★★★☆ |
groups | 字符串 | 设置用户的附加组,支持多个组,多个组名用逗号分隔。 | 无 | ★★★★☆ |
append | 布尔值 | 如果你希望添加附加组而不覆盖现有的组,可以使用 append=yes 参数。 | no | ★★★☆☆ |
home | 字符串 | 设置用户的主目录。如果目录不存在,可以自动创建(如果 create_home 为 yes )。默认目录在/home/下 | 无 | ★★★☆☆ |
move_home | 布尔值 | 是否在修改用户的主目录时,自动将用户现有的文件移动到新主目录。 | no | ★★★☆☆ |
shell | 字符串 | 设置用户的登录 shell,例如 /bin/bash 。 | /bin/bash | ★★★☆☆ |
create_home | 布尔值 | 是否在创建用户时自动创建主目录。如果为 yes ,则创建;如果为 no ,则不创建。 | yes | ★★★☆☆ |
uid | 整数 | 设置用户的 UID(用户标识符)。如果未指定,则系统自动分配。 | 无 | ★★★☆☆ |
remove | 布尔值 | 删除用户时是否删除用户的主目录。yes 表示删除,no 表示不删除。 | no | ★★★☆☆ |
force | 布尔值 | 如果为 yes ,强制修改用户属性,忽略任何已有的文件和目录冲突(例如,修改主目录时)。 | no | ★★★☆☆ |
system | 布尔值 | 如果为 yes ,则创建系统用户,系统用户的 UID 通常较低。 | no | ★★★☆☆ |
non_unique | 布尔值 | 如果为 yes ,允许多个用户具有相同的 UID(用户标识符)。 | no | ★★☆☆☆ |
示例使用
1. 创建一个用户 alice
,并指定主目录、shell 和描述信息:
ansible host -m user -a "name=alice state=present home=/home/alice shell=/bin/bash comment='Alice User'"
2. 创建用户并强制修改其主目录:
ansible host -m user -a "name=bob state=present home=/home/bob move_home=yes force=yes"
3. 删除用户 alice
,并删除用户的主目录:
ansible host -m user -a "name=bob state=present home=/home/bob move_home=yes force=yes"
4. 设置用户 alice
的密码(使用加密后的密码):
ansible host -m user -a "name=alice password='$6$rounds=5000$saltsalt$encryptedpassword'"
5. 创建一个系统用户 webuser
,并设置其为系统用户:
ansible host -m user -a "name=webuser state=present system=yes"
yum模块
yum
模块是 Ansible 中用于管理和操作基于 RPM 的 Linux 系统(如 CentOS、RHEL、Fedora 等)软件包的一个模块。它允许你通过 Ansible 来安装、升级、删除软件包,或管理 yum 仓库的配置。
常用参数
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
name | 字符串/列表 | 要安装、更新或删除的软件包名称,支持多个包名用逗号分隔。只有仓库操作时才不会用到name | 无 |
state | 字符串 | 软件包的状态。present 表示安装,latest 表示更新到最新版本,absent 表示删除软件包。 | present |
update_cache | 布尔值 | 是否更新缓存。yes 表示更新,no 表示不更新。 | no |
disable_gpg_check | 布尔值 | 是否禁用 GPG 检查。yes 禁用 GPG 检查,no 启用 GPG 检查。 | no |
enablerepo | 字符串/列表 | 启用指定的仓库,可以指定一个或多个仓库名,多个仓库名之间用逗号分隔。 | 无 |
disablerepo | 字符串/列表 | 禁用指定的仓库,多个仓库名用逗号分隔。 | 无 |
update_only | 布尔值 | 如果为 yes ,则仅更新已安装的软件包。 | no |
installroot | 字符串 | 指定软件包安装的根目录。默认情况下是 / 。 | / |
verify | 布尔值 | 是否在安装后验证软件包。yes 表示验证,no 表示不验证。 | no |
exclude | 字符串/列表 | exclude 是一个以逗号分隔的软件包名称列表。Ansible 在执行 yum 操作时,会排除这些包,避免它们被更新或安装。(可以用*通配) | 无 |
示例使用
1. 安装软件包
安装一个或多个软件包,例如安装 httpd
和 vim
:
ansible host -m yum -a "name=httpd,vim state=present"
2. 安装最新版本的软件包
如果你想安装软件包的最新版本,可以将 state
设置为 latest(对已安装进行更新)
:
ansible host -m yum -a "name=httpd state=latest"
3. 删除软件包
如果你要删除一个或多个软件包,可以将 state
设置为 absent
:
ansible host -m yum -a "name=httpd state=absent"
4. 更新缓存
在某些情况下,你可能希望更新软件包缓存(尤其是在添加了新的仓库后):
ansible host -m yum -a "name=httpd update_cache=yes state=present"
5. 禁用 GPG 检查
如果你遇到 GPG 错误,或者在使用不受信任的仓库时,可以选择禁用 GPG 检查:
ansible host -m yum -a "name=httpd state=present disable_gpg_check=yes"
6. 启用和禁用特定的仓库
如果你只想使用特定的仓库来安装软件包,可以使用 enablerepo
和 disablerepo
参数。
-
启用特定仓库:
-
ansible host -m yum -a "name=httpd enablerepo=epel state=present"
-
-
禁用特定仓库:
-
ansible host -m yum -a "name=httpd disablerepo=base state=present"
-
7. 仅更新已安装的软件包
如果你只想更新已安装的软件包,而不是安装新软件包,可以使用 update_only=yes
:
ansible host -m yum -a "name=httpd update_only=yes"
service模块
Ansible 的 service
模块用于管理和控制系统服务(如启动、停止、重启等)。它是一个通用模块,适用于大多数 Linux 和 Unix 系统。通过这个模块,可以在目标主机上启用、禁用、启动、停止或重启服务。
常用参数
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
name | 字符串 | 要管理的服务名称(如 httpd , sshd , nginx 等)。service 模块中,一次只能操作一个服务。每次调用 service 模块时,你只能指定一个服务名(通过 name 参数)。 | 必填 |
state | 字符串 | 服务的状态。常见值:started , stopped , restarted , reloaded 。 | started |
enabled | 布尔值 | 是否在系统启动时启用或禁用服务。yes 启用,no 禁用。 | no |
sleep | 整数 | 在执行服务操作后等待指定的秒数,通常用于等待服务完全启动。 | 无 |
runlevel | 字符串 | 在特定运行级别下启用服务,通常用于 SysV 或 Upstart 服务。 | 无 |
pattern | 字符串 | 用于匹配一个或多个服务。通常在某些系统中用来选择服务(如使用通配符匹配)。 | 无 |
常见的 state
值
started
:启动服务。stopped
:停止服务。restarted
:重启服务。reloaded
:重新加载服务(如果服务支持重载)。
示例用法
1. 启动服务
ansible host -m service -a "name=httpd state=started"
2. 停止服务
ansible host -m service -a "name=httpd state=stopped"
3. 重启服务
ansible host -m service -a "name=httpd state=restarted"
4. 重新加载服务
ansible host -m service -a "name=httpd state=reloaded"
5. 启用服务
ansible host -m service -a "name=httpd enabled=yes"
6. 禁用服务
ansible host -m service -a "name=httpd enabled=no"
7. 检查服务状态(用于调试)
如果你不确定服务的状态,可以通过 ansible
的 service_facts
来获取目标主机上所有服务的状态信息:
ansible host -m service_facts
cron模块
Ansible 的 cron
模块用于管理 cron
作业(定时任务)。你可以使用它来添加、删除或修改 cron
作业。
常用参数
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
name | 字符串 | cron 任务的名称,用于标识该任务。 | 必填 |
minute | 字符串 | 任务执行的分钟,支持值为 0 到 59,或 * (每分钟)。 | * |
hour | 字符串 | 任务执行的小时,支持值为 0 到 23,或 * (每小时)。 | * |
day | 字符串 | 任务执行的日期,支持值为 1 到 31,或 * (每天)。 | * |
month | 字符串 | 任务执行的月份,支持值为 1 到 12,或 * (每月)。 | * |
weekday | 字符串 | 任务执行的星期几,支持值为 0 到 6(0=周日,1=周一...),或 * (每天)。 | * |
user | 字符串 | 运行任务的用户(通常是 root)。 | 当前用户 |
state | 字符串 | 任务的状态。常用值:present (存在)和 absent (删除)。 | present |
job | 字符串 | 要执行的命令。 | 必填 |
special_time | 字符串 | 特殊的时间设置,如 reboot 。 | 无 |
常见 state
值
present
:确保cron
任务存在。如果任务不存在,则会添加。absent
:确保cron
任务不存在。如果任务存在,则会删除。
示例用法
添加一个简单的定时任务
例如:每小时运行一个脚本 /path/to/script.sh
:
ansible host -m cron -a "name='run script every hour' minute='0' hour='*' job='/path/to/script.sh' state=present"
添加一个每天执行的任务
例如:每天凌晨 2 点执行 backup.sh
脚本:
ansible host -m cron -a "name='daily backup' minute='0' hour='2' job='/path/to/backup.sh' state=present"
删除一个定时任务
例如:删除名称为 run script every hour
的 cron
任务:
ansible host -m cron -a "name='run script every hour' state=absent"
使用 special_time
设置特殊时间
例如:系统重启后执行某个命令:
ansible host -m cron -a "name='run on reboot' special_time='reboot' job='/path/to/reboot_script.sh' state=present"
shell模块
Ansible 的 shell
模块用于在目标主机上执行 Shell 命令。这是一个通用模块,可以用来执行任何可以在 Shell 中运行的命令,包括脚本、命令行工具等。
常用参数
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
cmd | 字符串 | 要执行的命令或脚本。{不是cmd=xx的形式} | 必填 |
executable | 字符串 | 指定要使用的 Shell 类型,例如 /bin/bash 。 | /bin/sh |
creates | 字符串 | 如果指定的文件已存在,则不会执行命令。 | 无 |
chdir | 字符串 | 在指定目录下执行命令。 | 无 |
stdin | 字符串 | 向命令传递标准输入。 | 无 |
warn | 布尔值 | 是否显示警告信息,通常是用来忽略某些潜在错误。 | yes |
示例用法
执行一个简单的命令
例如:执行 echo
命令来输出信息:
ansible host -m shell -a "echo 'Hello, World!'"
执行脚本
例如:在 /tmp
目录下执行一个脚本 /tmp/my_script.sh
:
ansible host -m shell -a "bash /tmp/my_script.sh"
在指定目录下执行命令
例如:在 /tmp
目录下执行 ls
命令:
ansible host -m shell -a "ls" chdir="/tmp"
使用 creates
参数避免重复执行
例如:如果 /tmp/my_file.txt
文件存在,则不执行命令:
ansible host -m shell -a "touch /tmp/my_file.txt" creates="/tmp/my_file.txt"
使用 executable
指定 Shell 类型
例如:使用 /bin/bash
执行命令:
ansible host -m shell -a "echo 'Hello, Bash!'" executable="/bin/bash"
执行命令并传递标准输入
例如:使用标准输入传递给命令:
ansible host -m shell -a "cat" stdin="This is a test"
四,playbook
概述
Ansible Playbook 是 Ansible 中用于自动化任务的核心文件,它是一个以 YAML 格式编写的文件,包含了一组定义自动化任务的 "plays"。每个 "play" 主要定义了哪些主机需要执行哪些任务(任务通常是模块的调用)。Playbook 可以让你描述并执行一系列任务,以实现系统配置、应用部署、任务管理等自动化操作。
Playbook 是 Ansible 中最强大的功能之一,支持复杂的工作流、条件逻辑、循环等结构。
核心元素
Playbook 的核心元素包括:
Play: 每个 Play 描述了一个特定的主机组和与这些主机进行交互的任务。一个 Playbook 由一个或多个 Play 组成。
Host: Play 定义了要操作的主机,可以是单个主机、主机组或 IP 地址。主机列表通常来自于 inventory 文件。
Tasks: Playbook 中的每个 Play 下会包含一个或多个任务(tasks),每个任务通常调用一个模块来执行某个操作(如安装软件、复制文件等)。
Variables: 变量可以用于动态控制 Playbook 的行为,如根据环境、目标主机等条件决定要执行的任务。
Handlers: Handlers 是特殊类型的任务,它们只有在某个任务被触发时才会执行(例如:当某个文件被修改时,触发服务重启)。
Roles: Roles 是 Playbook 中的一种组织方式,允许将复杂的任务分解成多个小块,以便更好地重用、维护和管理。
Loops and Conditionals: Playbook 支持循环和条件语句,可以根据条件来控制任务的执行。比如,基于特定变量的值执行不同的任务。
Tags: Playbook 支持使用标签来标识任务,这样可以选择性地执行特定任务。
Includes and Imports: Playbook 允许包含或导入其他 Playbook 或任务文件,以便分割任务并提高重用性。
格式语法(yaml)
Playbook 文件使用 YAML 格式编写,遵循以下基本语法规则:
- 缩进:YAML 使用缩进来表示层级,通常每个层级缩进 2 个空格。
- 键值对:键值对之间使用冒号分隔。
- 列表:列表项以
-
开头。
基本结构
一个简单的 Playbook 的结构通常如下所示:
# 这是一个示例的 YAML 文件,展示了 Ansible Playbook 的基本结构和语法规则# 1. YAML 基本语法规则# 键值对:键和值之间通过冒号(:)分隔,键和值之间必须有一个空格。
name: Example Playbook # 键是 name,值是 Example Playbook
version: 1.0 # 键是 version,值是 1.0# 列表:列表项以 - 开头,且每个列表项前面都有缩进。
fruits:- apple- banana- orange# 字典:键值对组合在一起形成字典,可以嵌套。
person:name: Johnage: 30city: New York# 混合结构:列表和字典结合使用。
employees:- name: Alicerole: Developerskills:- Python- Java- name: Bobrole: Managerskills:- Leadership- Communication# 注释:YAML 文件支持注释,注释以 # 开头,后面是注释内容。
# 这里的注释解释了以下字段# 2. Playbook 示例------------------------------------------------------------------
# Playbook 开始,开头和隔开必须要三条杠
- name: 安装并启动 Apache 服务 # Playbook 中的 Play 描述hosts: web_servers # 指定主机组remote_user: root #以远程root用户执行become: true # 使用 sudo 权限执行任务vars:http_port: 80 # 定义一个变量,指定 HTTP 端口tasks: # 任务列表开始- name: 安装 Apache HTTP 服务 # 任务名称yum: # 使用 yum 模块name: httpd # 安装 httpd 包state: present # 确保 httpd 包被安装- name: 启动 Apache 服务 # 任务名称service: # 使用 service 模块name: httpd # 服务名称state: started # 确保 httpd 服务已启动- name: 确保防火墙允许 HTTP 流量 # 任务名称firewalld:service: httppermanent: yesstate: enabledimmediate: yeshandlers: # Handler 列表开始- name: 重启 Apache 服务 # Handler 名称service:name: httpdstate: restarted# 3. 常见语法错误# 错误1:缩进不一致
# 错误示例:
# fruits:
# - apple # 错误:缩进不一致,`fruits` 应该使用相同数量的空格缩进
# - banana
# - orange# 错误2:缺少空格
# 错误示例:
# name:John # 错误:缺少空格,应该是 `name: John`# 错误3:缺少冒号或值
# 错误示例:
# name # 错误:缺少冒号和对应的值# 4. YAML 文件的总结# - YAML 格式简洁易懂,适合用来编写 Playbook 和配置文件。
# - 缩进:使用空格来表示层级,通常每一层缩进 2 个空格。
# - 键值对:通过冒号分隔键和值,每个键值对后面至少有一个空格。
# - 列表:使用 - 表示列表项,每个列表项前面加上缩进。
# - 注释:使用 # 来编写注释。# 理解这些基本规则后,编写 Ansible Playbook 将变得非常直观。
# YAML 的简洁性使得 Ansible Playbook 成为一种易于编写和维护的自动化配置工具。
补充声明关于yaml文档书写方式
在 Ansible Playbook 中,模块的参数可以用简化的 key=value
形式进行声明。这样书写方式的目的是让 Playbook 更简洁,容易理解和书写。也可以向使用命令一样的使用
比如简化写法:
---
- name: 安装 httpd 包yum:name: httpdstate: present通过键值对的形式书写任务的模块和参数。这种方式更简洁,也更符合 YAML 的结构。它通常是针对 Ansible 中一些常见的模块(如 yum、service、copy 等)来书写参数的,而无需完全展开模块的详细语法。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
比如完整写法:
---
- name: 安装 httpd 包yum: name=httpd state=present disable_gpg_check=no enablerepo=epel简洁性:这种写法可以显著简化 Playbook 的结构,尤其是在任务比较简单时,参数不多时使用这种方式非常方便。
易读性:对于参数较少、简单的任务来说,这种写法有助于提高 Playbook 的紧凑性,但如果参数较多,还是推荐使用多行书写。当参数较多时,单行的写法可能会导致可读性差,因为参数过长时可能会变得难以辨认。这时推荐采用多行书写(即每个参数一行),以提高可读性和维护性。
相关命令
ansible-playbook
是用来执行 Playbook 文件的命令。
命令/选项 | 描述 | 示例 |
---|---|---|
ansible-playbook playbook.yml | 执行指定的 Playbook 文件。 | ansible-playbook playbook.yml |
-i <inventory_file> | 指定使用的库存文件,默认是 /etc/ansible/hosts 。 | ansible-playbook -i my_inventory playbook.yml |
-v / -vv / -vvv | 设置输出的详细级别,-v 是普通输出,-vv 是更详细的输出,-vvv 是最详细的输出。 | ansible-playbook -v playbook.yml |
--tags <tag1,tag2,...> | 只运行带有指定标签的任务。 | ansible-playbook playbook.yml --tags "install,configure" |
--skip-tags <tag1,tag2,...> | 跳过带有指定标签的任务。 | ansible-playbook playbook.yml --skip-tags "install" |
--check | 执行 Playbook 的干运行(dry-run),仅检查会发生的更改而不实际执行。 | ansible-playbook playbook.yml --check |
--limit <host> | 限制运行指定的主机,可以是单个主机名、主机组或主机模式(例如 web_servers[1] )。 | ansible-playbook playbook.yml --limit web_server1 |
--list-vars | 列出所有可以使用的变量和相关信息。 | ansible-playbook playbook.yml --list-vars |
--syntax-check | 检查 Playbook 文件的语法是否正确。 | ansible-playbook playbook.yml --syntax-check |
--start-at-task <task_name> | 从指定任务开始执行 Playbook,而不是从头开始执行。 | ansible-playbook playbook.yml --start-at-task "Install nginx" |
--extra-vars <key=value> | 传递额外的变量值,可以在命令行中动态覆盖 Playbook 中的变量。 | ansible-playbook playbook.yml --extra-vars "my_var=value" |
--private-key <path_to_key> | 使用指定的私钥文件进行 SSH 连接,通常用于免密登录。 | ansible-playbook playbook.yml --private-key /path/to/key |
--ask-vault-pass | 在执行时提示输入 Ansible Vault 密码。 | ansible-playbook playbook.yml --ask-vault-pass |
--vault-password-file <file> | 指定包含 Vault 密码的文件,用于解密敏感数据。 | ansible-playbook playbook.yml --vault-password-file ~/.ansible-vault-password |