网站升级维护,自己做网站去哪买服务器,晋城推广型网站建设,网站推荐你了解我意思吧ansible-doc module_name#xff08;如果没有网#xff0c;那这个超级有用#xff09;
这个很有用#xff0c;用来查单个模块的文档。
ansible-doc -l
列出所有模块
ansible-doc -s module_name
查看更详细的模块文档。
ansible-doc --help
使用 --help …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类似于 PuppetChef 是一个自动化平台用于管理基础设施的配置、部署和操作。它通过 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 的设备如服务器、虚拟机、云实例等。• PlaybookPlaybook 是 Ansible 的核心部分它是用 YAML 编写的配置文件定义了一系列要在远程主机上执行的任务。Playbook 支持条件逻辑、循环、变量和包含其他 Playbook 等功能。• 模块ModulesAnsible 提供了大量的模块用于执行特定的操作如安装软件包、管理服务、文件操作等。模块是 Ansible 中执行任务的实际代码单元。• 任务Tasks任务是 Playbook 中定义的具体操作每个任务都调用一个模块来执行实际操作。• 库存Inventory库存是 Ansible 用来管理远程主机的清单。库存可以是静态的例如一个简单的 INI 文件也可以是动态的例如通过 API 自动生成。• 插件PluginsAnsible 提供了多种插件可以扩展其功能包括连接插件、回调插件、动态库存插件等。
3. Ansible 工作流程
Ansible 的工作流程通常是如下几步1. 控制节点发起请求用户通过 Ansible 控制节点通常是本地计算机发起请求来管理远程主机。2. 通过 SSH 或 WinRM 连接Ansible 控制节点通过 SSHLinux/Unix或 WinRMWindows连接到远程主机。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: 就是精简模式一行显示也可以放到最后moduleAnsible模块如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 userhostname
使用 ssh-copy-id 将生成的公钥复制到目标主机的 ~/.ssh/authorized_keys 文件中以便进行免密码登录。
cat ~/.ssh/id_rsa.pub | ssh userhostname cat ~/.ssh/authorized_keys
如果没有 ssh-copy-id 命令可以手动将公钥内容复制到目标主机的 ~/.ssh/authorized_keys 文件中。 这样就可以免密登录了 说了这么多还没有讲到分组之类的前面出了命令还是牛头不搭马嘴的其实我是想让大家先一个一个的ping然后再说分组让大家知道分组的好。 创建一个简单的主机清单文件 创建一个名为 hosts.ini 的清单文件内容如下要说的是可以在默认的hosts文件中创建在其他地方创建要用-i指定绝对路径才可以引用 #分组是 Ansible 中的一个概念它帮助你将多个主机组织到一起以便批量执行操作。你可以将主机按功能、角色、地理位置等分类到不同的组中。[host]
#这里放域名表示主机其它设置可以在后面空格隔开也可以在【xx:vars】中写
host1
#host1 ansible_host192.168.1.102表示指定ip但是我们之前在系统的hosts做了映射所以就没必要了要说的时【xx:vars】中放到是大家共有的参数。
host2
host3[host:vars]
ansible_ssh_userroot
#账号
ansible_ssh_passly
#密码
ansible_ssh_port80
#端口#子分组是指一个分组父分组下面可以包含其他分组子分组。子分组本质上是父分组的扩展它能够继承父分组的所有主机和变量并且可以定义自己的主机和变量。#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端口号statestarted 或 stoppedtimeout超时时间assert用于验证某些条件是否为真。如果条件不成立任务失败。that条件表达式例如 ansible_facts[distribution] CentOSmsg失败时输出的消息file管理文件和目录的属性如权限、所有者、符号链接等。path目标文件或目录路径state文件状态如 file, directory, absentmode文件权限owner所有者group用户组copy将本地文件复制到远程主机。src本地文件路径dest目标文件路径mode文件权限owner所有者group用户组lineinfile管理文件中的单行内容添加、修改或删除行。path文件路径line行内容state行状态如 present 或 absentregexp匹配正则template将 Jinja2 模板文件复制到远程主机并渲染内容。src模板文件路径dest目标文件路径cron管理 cron 任务设置定时任务。name任务名称minute分钟hour小时day日期month月份weekday星期几job任务命令yum管理 CentOS/RHEL 系统上的软件包。name软件包名称state软件包状态如 present, absent, latestenablerepo启用的仓库disablerepo禁用的仓库apt用于管理基于 Debian 的系统上的软件包如 Ubuntu。name软件包名称state软件包状态如 present, absent, latestupdate_cache是否更新缓存service管理服务的启动、停止、重启等操作。name服务名称state服务状态如 started, stopped, restartedenabled是否开机启动user管理用户账户如创建、删除用户、修改用户属性。name用户名state用户状态如 present, absentuid用户IDgroups用户组password密码group管理 Linux 用户组如创建、删除用户组、修改用户组属性。name用户组名称state用户组状态如 present, absentgid用户组 IDgit在目标主机上操作 Git 仓库如克隆、拉取等。repoGit 仓库 URLdest目标路径version分支或标签clone是否克隆仓库docker_container用于管理 Docker 容器启动、停止、删除等。name容器名称state容器状态如 started, stopped, restartedimage镜像名称docker_image用于管理 Docker 镜像拉取、删除等。name镜像名称state镜像状态如 present, absenttag镜像标签firewalld管理 firewalld 防火墙规则。service服务名称state防火墙规则状态如 enabled, disabledzone防火墙区域selinux管理 SELinux 状态。policySELinux 策略stateSELinux 状态如 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不用srchard创建硬链接指向目标文件或目录。src/源 dest/目标其它都用path不用src
示例用法 ansible host -m file -a path/root/liye statedirectory mode0644 ownerroot grouproot 注意这里报错的原因是mode通常目录的权限是0755我的意思是要有x权限至少要有一个x权限 ansible host -m file -a src/root/liye dest/root/liye/liye.l statelink这个是创链接的 copy模块
常见用途
将文件从控制节点复制到目标主机。配置文件的分发。复制脚本、配置文件到远程服务器。设置文件权限、所有者、组等属性。
模块参数
参数描述示例用法src指定源文件的路径控制节点上的文件。src/path/to/local_filedest目标文件路径远程主机上的路径。dest/path/to/remote_filemode设置文件权限如0644、0755。mode0644owner设置文件的所有者。ownerrootgroup设置文件的所属组。grouprootbackup如果目标文件已存在是否备份文件。备份会将文件重命名为 filename.timestamp.bak。backupyesforce是否强制复制文件。如果设置为 no只有当文件内容发生变化时才会复制文件默认值是 yes。forcenocontent将内容直接写入文件而不是从源文件复制。此时src 参数无效。contentHello World!validate复制文件后验证文件内容是否符合正则表达式。validatesha256sum %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 mode0644 示例 3设置文件所有者和组
将文件复制并设置文件所有者为 root组为 root。 ansible host -m copy -a src/path/to/local_file dest/path/to/remote_file ownerroot grouproot 示例 4备份目标文件
如果目标文件已存在设置 backupyes 会自动备份该文件。 ansible host -m copy -a src/path/to/local_file dest/path/to/remote_file backupyes 备份的是目标主机上的原始文件而不是要发送的本地文件。 备份文件会被重命名通常是原文件名后加上一个时间戳例如file.txt.1638730242.bak。 示例 5强制覆盖文件
即使文件内容没有变化也强制覆盖目标文件。 ansible host -m copy -a src/path/to/local_file dest/path/to/remote_file forceyes 示例 6将内容直接写入文件
将直接内容写入文件而不是从本地文件复制。src 参数无效。 ansible host -m copy -a dest/root/testfile contentThis 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/ mode0755注意src 后面有斜杠 /表示复制目录内容而不是整个目录本身。不加就是复制目录很奇怪我的显示changed: false但是却移动过去了。 示例 8验证文件内容
复制文件后通过正则验证文件内容是否符合要求。 ansible host -m copy -a src/path/to/local_file dest/path/to/remote_file validatesha256sum %s user模块
user 模块是 Ansible 中用于管理用户账户的模块可以用来创建、删除或修改远程主机上的用户账户。它提供了多种参数可以灵活地管理用户的相关设置。
常用的 user 模块参数
参数类型描述默认值常用度name字符串必填指定用户的用户名。无★★★★★state字符串用于管理用户的状态present 表示创建用户absent 表示删除用户。present★★★★★password字符串设置用户的密码通常是加密后的密码。无★★★★☆echo mypassword | openssl passwd -1 -stdin -1选择 MD5 算法。这是较老的加密算法在现代系统中已经被认为不够安全因此推荐使用 SHA-512即 -6 参数更安全或者 SHA-256即 -5 参数。-stdin表示从标准输入读取密码。在这里echo 命令的输出通过管道传递给 openssl而无需手动输入密码。comment字符串设置用户的描述信息通常是用户的全名或其他相关信息。无★★★★☆group字符串设置用户的主组用户只能属于一个主组。无★★★★☆groups字符串设置用户的附加组支持多个组多个组名用逗号分隔。无★★★★☆append布尔值如果你希望添加附加组而不覆盖现有的组可以使用 appendyes 参数。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 namealice statepresent home/home/alice shell/bin/bash commentAlice User 2. 创建用户并强制修改其主目录 ansible host -m user -a namebob statepresent home/home/bob move_homeyes forceyes 3. 删除用户 alice并删除用户的主目录 ansible host -m user -a namebob statepresent home/home/bob move_homeyes forceyes 4. 设置用户 alice 的密码使用加密后的密码 ansible host -m user -a namealice password$6$rounds5000$saltsalt$encryptedpassword 5. 创建一个系统用户 webuser并设置其为系统用户 ansible host -m user -a namewebuser statepresent systemyes yum模块
yum 模块是 Ansible 中用于管理和操作基于 RPM 的 Linux 系统如 CentOS、RHEL、Fedora 等软件包的一个模块。它允许你通过 Ansible 来安装、升级、删除软件包或管理 yum 仓库的配置。
常用参数
参数类型描述默认值name字符串/列表要安装、更新或删除的软件包名称支持多个包名用逗号分隔。只有仓库操作时才不会用到name无state字符串软件包的状态。present 表示安装latest 表示更新到最新版本absent 表示删除软件包。presentupdate_cache布尔值是否更新缓存。yes 表示更新no 表示不更新。nodisable_gpg_check布尔值是否禁用 GPG 检查。yes 禁用 GPG 检查no 启用 GPG 检查。noenablerepo字符串/列表启用指定的仓库可以指定一个或多个仓库名多个仓库名之间用逗号分隔。无disablerepo字符串/列表禁用指定的仓库多个仓库名用逗号分隔。无update_only布尔值如果为 yes则仅更新已安装的软件包。noinstallroot字符串指定软件包安装的根目录。默认情况下是 /。/verify布尔值是否在安装后验证软件包。yes 表示验证no 表示不验证。noexclude字符串/列表exclude 是一个以逗号分隔的软件包名称列表。Ansible 在执行 yum 操作时会排除这些包避免它们被更新或安装。可以用*通配无
示例使用
1. 安装软件包
安装一个或多个软件包例如安装 httpd 和 vim ansible host -m yum -a namehttpd,vim statepresent 2. 安装最新版本的软件包
如果你想安装软件包的最新版本可以将 state 设置为 latest对已安装进行更新 ansible host -m yum -a namehttpd statelatest 3. 删除软件包
如果你要删除一个或多个软件包可以将 state 设置为 absent ansible host -m yum -a namehttpd stateabsent 4. 更新缓存
在某些情况下你可能希望更新软件包缓存尤其是在添加了新的仓库后 ansible host -m yum -a namehttpd update_cacheyes statepresent 5. 禁用 GPG 检查
如果你遇到 GPG 错误或者在使用不受信任的仓库时可以选择禁用 GPG 检查 ansible host -m yum -a namehttpd statepresent disable_gpg_checkyes 6. 启用和禁用特定的仓库
如果你只想使用特定的仓库来安装软件包可以使用 enablerepo 和 disablerepo 参数。 启用特定仓库 ansible host -m yum -a namehttpd enablerepoepel statepresent 禁用特定仓库 ansible host -m yum -a namehttpd disablerepobase statepresent
7. 仅更新已安装的软件包
如果你只想更新已安装的软件包而不是安装新软件包可以使用 update_onlyyes ansible host -m yum -a namehttpd update_onlyyes service模块
Ansible 的 service 模块用于管理和控制系统服务如启动、停止、重启等。它是一个通用模块适用于大多数 Linux 和 Unix 系统。通过这个模块可以在目标主机上启用、禁用、启动、停止或重启服务。
常用参数
参数类型描述默认值name字符串要管理的服务名称如 httpd, sshd, nginx 等。service 模块中一次只能操作一个服务。每次调用 service 模块时你只能指定一个服务名通过 name 参数。必填state字符串服务的状态。常见值started, stopped, restarted, reloaded。startedenabled布尔值是否在系统启动时启用或禁用服务。yes 启用no 禁用。nosleep整数在执行服务操作后等待指定的秒数通常用于等待服务完全启动。无runlevel字符串在特定运行级别下启用服务通常用于 SysV 或 Upstart 服务。无pattern字符串用于匹配一个或多个服务。通常在某些系统中用来选择服务如使用通配符匹配。无
常见的 state 值
started启动服务。stopped停止服务。restarted重启服务。reloaded重新加载服务如果服务支持重载。
示例用法
1. 启动服务 ansible host -m service -a namehttpd statestarted 2. 停止服务 ansible host -m service -a namehttpd statestopped 3. 重启服务 ansible host -m service -a namehttpd staterestarted 4. 重新加载服务 ansible host -m service -a namehttpd statereloaded 5. 启用服务 ansible host -m service -a namehttpd enabledyes 6. 禁用服务 ansible host -m service -a namehttpd enabledno 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 到 60周日1周一...或 *每天。*user字符串运行任务的用户通常是 root。当前用户state字符串任务的状态。常用值present存在和 absent删除。presentjob字符串要执行的命令。必填special_time字符串特殊的时间设置如 reboot。无
常见 state 值
present确保 cron 任务存在。如果任务不存在则会添加。absent确保 cron 任务不存在。如果任务存在则会删除。
示例用法
添加一个简单的定时任务
例如每小时运行一个脚本 /path/to/script.sh ansible host -m cron -a namerun script every hour minute0 hour* job/path/to/script.sh statepresent 添加一个每天执行的任务
例如每天凌晨 2 点执行 backup.sh 脚本 ansible host -m cron -a namedaily backup minute0 hour2 job/path/to/backup.sh statepresent 删除一个定时任务
例如删除名称为 run script every hour 的 cron 任务 ansible host -m cron -a namerun script every hour stateabsent 使用 special_time 设置特殊时间
例如系统重启后执行某个命令 ansible host -m cron -a namerun on reboot special_timereboot job/path/to/reboot_script.sh statepresent shell模块
Ansible 的 shell 模块用于在目标主机上执行 Shell 命令。这是一个通用模块可以用来执行任何可以在 Shell 中运行的命令包括脚本、命令行工具等。
常用参数
参数类型描述默认值cmd字符串要执行的命令或脚本。{不是cmdxx的形式}必填executable字符串指定要使用的 Shell 类型例如 /bin/bash。/bin/shcreates字符串如果指定的文件已存在则不会执行命令。无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 stdinThis is a test template模块多和playbook一起
Ansible 的 template 模块用于从模板文件中生成配置文件或其他文本文件。它基于 Jinja2 模板引擎将变量和表达式嵌入到文本中生成最终的文件内容。
使用 template 模块时通常会在源文件中使用 Jinja2 的语法来替换变量和执行条件判断、循环等操作。
常见选项
选项描述示例src模板文件的路径通常是 .j2 后缀。srcnginx.conf.j2dest目标文件的路径生成的文件将保存到此位置。dest/etc/nginx/nginx.confowner设置目标文件的所有者。ownerrootgroup设置目标文件的组。grouprootmode设置目标文件的权限。mode0644backup如果设置为 yes会创建目标文件的备份。backupyes
示例命令 ansible host -m template -a src/path/to/template.j2 dest/path/to/destination ownerroot grouproot mode0644 backupyes 注意这里的xx.j2其实就是你写好的配置文件他会去找同名的替换。和copy不一样的是可以接收playbook中的变量直接在文中就这种方式引入{{playbook中的binlog}} 四playbook
Ansible自动化运维三Playbook 模式详解_ansible-playbook -e-CSDN博客
概述
Ansible Playbook 是 Ansible 中用于自动化任务的核心文件它是一个以 YAML 格式编写的文件包含了一组定义自动化任务的 plays。每个 play 主要定义了哪些主机需要执行哪些任务任务通常是模块的调用。Playbook 可以让你描述并执行一系列任务以实现系统配置、应用部署、任务管理等自动化操作。
Playbook 是 Ansible 中最强大的功能之一支持复杂的工作流、条件逻辑、循环等结构。
核心元素
Playbook 的核心元素包括 play 每个 Play 描述了一个特定的主机组和与这些主机进行交互的任务。一个 Playbook 由一个或多个 Play 组成。 host Play 定义了要操作的主机可以是单个主机、主机组或 IP 地址。主机列表通常来自于 inventory 文件。 tasks Playbook 中的每个 Play 下会包含一个或多个任务tasks每个任务通常调用一个模块来执行某个操作如安装软件、复制文件等。 vars 变量可以用于动态控制 Playbook 的行为如根据环境、目标主机等条件决定要执行的任务。 handlers Handlers 是特殊类型的任务它们只有在某个任务被触发时才会执行例如当某个文件被修改时触发服务重启。 roles Roles 是 Playbook 中的一种组织方式允许将复杂的任务分解成多个小块以便更好地重用、维护和管理。 Loops and Conditionals Playbook 支持循环和条件语句可以根据条件来控制任务的执行。比如基于特定变量的值执行不同的任务。 tags Playbook 支持使用标签来标识任务这样可以选择性地执行特定任务。 Includes and Imports Playbook 允许包含或导入其他 Playbook 或任务文件以便分割任务并提高重用性。 格式语法yaml
Playbook 文件使用 YAML 格式编写遵循以下基本语法规则
缩进YAML 使用缩进来表示层级通常每个层级缩进 2 个空格。键值对键值对之间使用冒号分隔。列表列表项以 - 开头。
基本结构
一个简单的 Playbook 的结构通常如下所示
---
# Playbook 开始
- name: Playbook 的描述hosts: web_servers # 指定目标主机组执行任务的主机是 web_servers 组中的主机become: yes # 提升权限以 root 用户执行任务# 定义 Playbook 使用的变量vars:nginx_version: 1.20.1 # 定义 nginx 版本号custom_html: | # 定义一个自定义 HTML 内容用作网页htmlheadtitleWelcome to Nginx!/title/headbodyh1This is a custom Nginx page!/h1/body/html# 任务部分Playbook 中的主要操作tasks:- name: 安装 nginxyum: # 使用 yum 模块进行包管理name: nginx-{{ nginx_version }} # 安装指定版本的 nginxstate: present # 确保 nginx 包已经安装- name: 复制自定义的 index.html 到目标主机copy: # 使用 copy 模块复制文件content: {{ custom_html }} # 使用自定义 HTML 内容dest: /usr/share/nginx/html/index.html # 复制到 nginx 的默认网页路径- name: 启动 nginx 服务service: # 使用 service 模块管理服务name: nginx # 服务名称state: started # 确保 nginx 服务已启动- name: 设置 nginx 服务为开机自启service: # 使用 service 模块设置开机自启name: nginx # 服务名称enabled: yes # 启用开机启动- name: 修改配置文件template:src: 模版文件.j2里面可以用到playbook的变量dest /etc/xx/要替换的文件notify: #如果任务成功了而且changed为true就触发对应的hander- 在路上hander的名字# 处理程序部分处理需要触发的操作如服务重启handlers:# 定义一个 handler用于重启 nginx 服务- name: Restart nginx serviceservice: # 使用 service 模块重启 nginx 服务name: nginx # 服务名称state: restarted # 重启服务
补充声明关于yaml文档书写方式
在 Ansible Playbook 中模块的参数可以用简化的 keyvalue 形式进行声明。这样书写方式的目的是让 Playbook 更简洁容易理解和书写。也可以向使用命令一样的使用
比如简化写法
---
- name: 安装 httpd 包yum:name: httpdstate: present通过键值对的形式书写任务的模块和参数。这种方式更简洁也更符合 YAML 的结构。它通常是针对 Ansible 中一些常见的模块如 yum、service、copy 等来书写参数的而无需完全展开模块的详细语法。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
比如完整写法
---
- name: 安装 httpd 包yum: namehttpd statepresent disable_gpg_checkno enablerepoepel简洁性这种写法可以显著简化 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 keyvalue传递额外的变量值可以在命令行中动态覆盖 Playbook 中的变量。ansible-playbook playbook.yml --extra-vars my_varvalue--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
五roles
概述
Ansible 的 Roles 是一种用于组织 Playbook 和任务的结构化方法。通过使用 Roles可以将一个复杂的自动化过程分解为多个独立的部分每个部分处理不同的任务。这样有助于提高任务复用性和模块化。
Roles 使得 Ansible 配置管理更加清晰、可维护并可以方便地共享和重用。每个 Role 包含了一组与某个特定功能相关的任务、变量、模板和文件等。
目录结构 defaults/main.yml 存放该角色的默认变量这些变量的优先级最低用户可以通过覆盖文件来改变变量值。 files/ 存放静态文件这些文件可以被传送到目标主机上如配置文件、脚本等。 handlers/main.yml 存放处理程序handlers处理程序通常在任务运行完成后根据条件触发比如重新启动服务。 meta/main.yml 存放该角色的元数据如依赖关系、作者、版本等信息。 tasks/main.yml 存放角色执行的具体任务。一个角色的任务列表会在这个文件中定义任务的执行顺序由此文件确定。 templates/ 存放 Jinja2 模板文件这些文件可以通过变量动态生成配置文件等。 tests/test.yml 用于测试角色是否正确执行的 Playbook 文件。通过执行测试 Playbook 可以验证角色的功能是否正常。 vars/main.yml 存放该角色的变量优先级高于 defaults/main.yml。这些变量用于控制角色的行为。 编写步骤
步骤 1: 创建 Role 目录注意目录结构建议在/etc/ansible/roles执行命令 使用 ansible-galaxy 命令来创建一个新的 Role 结构
ansible-galaxy init myrole
#ansible-galaxy init 【角色名】
这将自动生成上面提到的标准目录结构。
步骤 2: 编写角色任务Tasks
在 myrole/tasks/main.yml 中定义角色的任务。例如
---
- name: Install nginxyum:name: nginxstate: present- name: Start nginx serviceservice:name: nginxstate: startedenabled: yes步骤 3: 设置默认变量Defaults
在 myrole/defaults/main.yml 中定义默认变量。例如
---
nginx_port: 80
nginx_user: nginx这些变量可以在其他地方被覆盖。
步骤 4: 编写模板Templates
在 myrole/templates 目录下创建 Jinja2 模板文件。例如 nginx.conf.j2
server {listen {{ nginx_port }};server_name localhost;root /usr/share/nginx/html;
}步骤 5: 使用文件Files
如果需要在角色中使用静态文件添加到 files/ 目录下例如上传的配置文件。
步骤 6: 编写处理程序Handlers
在 handlers/main.yml 中定义处理程序通常用于在任务变更时进行额外的操作如重启服务
---
- name: Restart nginxservice:name: nginxstate: restarted步骤 7: 编写元数据Meta
在 meta/main.yml 中定义角色的元数据可以指定角色的依赖关系、版本等信息
---
dependencies:- { role: common, version: 1.0 }步骤 8: 编写测试 Playbook
在 tests/test.yml 中编写测试 Playbook确保角色按预期工作
- hosts: localhostroles:- myrole步骤 9: 使用 Role
在 Playbook 中使用创建的 Role例如
- hosts: web_serversroles:- myrole六ansible面试题
ansible的执行模式 执行模式:Ansible 系统由控制主机对被管节点的操作方式可分为两类即adhoc和playbook ad-hoc模式(点对点模式): 使用单个模块支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令而且不需要保存起来的命令。就相当于bash中的一句话shell playbook模式(剧本模式): 是Ansible 主要管理方式 也是Ansib1e功能强大的关健所在。playbook通过多个task集合完成一类功能如web服务的安装部署、数据库服务器的批量备份等。可以简单地把p1aybook理解为通过组合多条ad-hoc操作的配置文件 ansible的执行流程 执行流程: 简单理解就是ansible在运行时首先读取ansible.cfg中的配置根据规则获取Inventory中的管理主机列表并行的在这些主机中执行配置的任务 最后等待执行返回的结果 具体流程: 加载自己的配置文件默认/etc/ansible/ansible.cfg查找对应的主机配置文件找到要执行的主机或者组加载自己对应的模块文件如command通过ansible将模块或命令生成对应的临时py文件(python脚本)并将读文件传输至远程服务器对应执行用户的家目录的.ansible/tmp/x00/x0.PY文件给文件 x 执行权限执行并返回结果删除临时py文件sleep 0退出 ansible的常用模块如何使用 Ansible 模块是 Ansible 提供的可用于执行特定任务的代码单元 常用的模块有:copy文件拷贝 yum软件安装与卸载 file文件管理 shell执行she11命令 user用户管理 service服务管理等 你用ansible实现了什么功能 通过ansible批量jdknginx等软件的安装根据指定内容查找文件统一处理。比如Fast]son反序列化漏洞通过Fast]son关键字查找有无对应文件如果有则进行整改 简单的说一下ansible在一百台机器上安装nginx的过程 收集被管主机的信息(IP账号密码)编写主机清单文件工准备相关配置文件(yum源文件nginx配置文件)编写playbook剧本主要是以下几个方面(定义变量yum配置软件安装基于模板的配置文件服务管理等)修改nginx配置文件通过变量获取数据检查剧本格式执行找其中一台主机确认结果