文章目录
一、ad-hoc介绍

“Ad-hoc"这个词组的全称就是"ad hoc”,它本身就是一个完整的拉丁语短语,意思是“为了这个目的”或“特别为此”。在英语中,它通常用来描述临时的、特别的或即兴的解决方案或决策。在技术领域,尤其是在Ansible这样的自动化工具中,"ad-hoc"命令指的是那些不需要预先编写完整剧本(playbook)就能执行的一次性任务。因此,"ad-hoc"并没有一个更长的全称,它本身就是一个完整的术语。
“Ad-hoc"这个词组的全称就是"ad
hoc”,它本身就是一个完整的拉丁语短语,意思是“为了这个目的”或“特别为此”。在英语中,它通常用来描述临时的、特别的或即兴的解决方案或决策。在技术领域,尤其是在Ansible这样的自动化工具中,"ad-hoc"命令指的是那些不需要预先编写完整剧本(playbook)就能执行的一次性任务。因此,"ad-hoc"并没有一个更长的全称,它本身就是一个完整的术语。
"ad-hoc"这个词的发音是 [ˌæd ˈhɒk](英式发音)或 [ˌæd ˈhɑːk](美式发音)。其中 “ad” 读作
“æd”,“hoc” 读作 “hɒk”(英式)或 “hɑːk”(美式)。这个词组通常作为一个整体来读,不分开。 Ansible 的
ad-hoc 命令是一个强大的功能,允许你在没有编写 Ansible playbook
的情况下,直接在目标主机上执行命令。它提供了一种快速且灵活的方式来执行各种任务,比如配置更改、系统检查和软件安装。
Ansible 的 ad-hoc 命令是一种即时执行单次任务的方式,无需创建和维护 playbook。它通过命令行直接指定要执行的模块和参数,并将这些指令应用于目标主机或主机组。
如何使用 Ansible Ad-Hoc 命令
1. 基本语法
ansible <主机组> -m <模块> -a "<模块参数>"
<主机组>: 目标主机或主机组的名称,在 Ansible 的 inventory 文件中定义。<模块>: 要使用的 Ansible 模块,比如ping、command、shell、yum等。<模块参数>: 传递给模块的参数,通常是以键值对的形式。
2. 示例
-
测试主机连通性
ansible all -m ping这个命令会使用
ping模块来测试所有主机的连通性。如果主机正常响应,它会返回pong。 -
执行远程命令
ansible webservers -m shell -a "uptime"这个命令会在所有
webservers主机组中的主机上执行uptime命令,显示系统的运行时间和负载信息。 -
安装软件包
ansible dbservers -m yum -a "name=httpd state=present"这个命令会在
dbservers主机组中的所有主机上使用yum模块安装httpd软件包。 -
复制文件
ansible all -m copy -a "src=/local/path/to/file dest=/remote/path/to/file"这个命令会将本地路径
/local/path/to/file复制到远程主机的路径/remote/path/to/file。
应用场景
-
快速测试和调试: Ad-hoc 命令非常适合用来快速测试某些功能或调试问题,而不需要编写完整的 playbook。
-
一次性操作: 对于一些一次性的配置更改或操作,比如安装一个软件包或重启服务,ad-hoc 命令是一个高效的选择。
-
批量管理: 使用 ad-hoc 命令可以同时对多个主机执行相同的操作,比如更新系统或执行安全检查。
注意事项
- 权限: 确保你有权限在目标主机上执行所需的操作,有些操作可能需要 root 权限。
- 安全: 使用 ad-hoc 命令时要小心,以避免对生产环境造成不必要的影响。
- 性能: 对于大规模的操作或复杂的任务,建议使用 playbook,以便更好地管理和维护配置。
通过 ad-hoc 命令,你可以快速、灵活地管理和配置你的服务器,帮助你在日常工作中提高效率。
二、Ansible模块
Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署和任务自动化。Ansible 的模块是执行任务的基本单元,每个模块都是一个 Python 脚本或插件,用于与目标系统交互。模块的通用组成包括以下几个部分:
-
模块的入口点:
- 模块通常由一个名为
main的函数或类的实例化来定义,这是模块的执行入口。
- 模块通常由一个名为
-
参数定义:
- 模块接收参数,这些参数通过 Ansible 的任务定义传递。参数可以在模块的
argument_spec中定义。它们描述了模块可以接受的选项、数据类型、是否必需等。
- 模块接收参数,这些参数通过 Ansible 的任务定义传递。参数可以在模块的
-
逻辑处理:
- 模块包含实现特定功能的核心逻辑。例如,创建文件、安装软件包、修改配置等。这部分的代码处理传递给模块的参数,执行必要的操作,并产生相应的结果。
-
返回结果:
- 模块需要以特定格式返回结果,通常是 JSON 格式。结果包含任务的成功状态、返回的消息、可能的变更等信息。Ansible 根据这些信息来报告任务的状态给用户。
-
错误处理:
- 模块应具备处理和报告错误的能力。如果模块在执行过程中遇到问题,它应能以清晰的方式报告错误,并返回相应的错误信息。
-
文档字符串:
- 模块通常包含一个文档字符串,描述模块的功能、参数及用法。这有助于用户理解如何使用该模块。
-
依赖管理:
- 某些模块可能需要依赖其他 Python 库或系统工具。在模块中,可以通过导入相关库或检查系统环境来管理这些依赖。
-
测试和调试:
- 模块应包含测试和调试功能,以确保其在不同环境下的正确性和可靠性。这可以包括内置测试用例或调试输出。
以下是一个简单的 Ansible 模块示例(用 Python 编写):
#!/usr/bin/python
from ansible.module_utils.basic import AnsibleModule
def run_module():
module_args = dict(
name=dict(type='str', required=True),
state=dict(type='str', required=True, choices=['present', 'absent'])
)
result = dict(
changed=False,
original_message='',
message=''
)
module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)
name = module.params['name']
state = module.params['state']
# Implement module logic here
if state == 'present':
result['changed'] = True
result['message'] = 'Item {} is present'.format(name)
elif state == 'absent':
result['changed'] = True
result['message'] = 'Item {} is absent'.format(name)
module.exit_json(**result)
def main():
run_module()
if __name__ == '__main__':
main()
这个示例模块接受两个参数 name 和 state,然后根据 state 的值生成响应的消息。根据具体实现的复杂性,模块的组成和功能可能会有所不同,但这些基本组成部分是大多数 Ansible 模块所共有的。
Ansible的模块列举(不全)
具体在官网上查找
Ansible 的模块非常丰富,以下是一些常用的模块分类:
系统模块
- command:执行命令
- shell:在 shell 中执行命令
- copy:复制文件
- file:管理文件和目录属性
- user:管理用户账户
网络模块
- ping:测试连接
- uri:与网络资源进行交互
- net_ping:测试网络连通性
云模块
- ec2:管理 AWS EC2 实例
- gce:管理 Google Cloud 实例
- azure_rm:管理 Azure 资源
数据库模块
- mysql_db:管理 MySQL 数据库
- postgresql_db:管理 PostgreSQL 数据库
git、template、assemble
- git:管理 Git 仓库
- template:处理 Jinja2 模板
- assemble:合并文件
Web 服务器模块
- apache2_module:管理 Apache 模块
- nginx:管理 Nginx 配置
软件包管理模块
- apt:管理 Debian/Ubuntu 软件包
- yum:管理 RHEL/CentOS 软件包
- pip:管理 Python 包
文件模块
- fetch:从远程主机获取文件
- template:使用模板生成配置文件
- unarchive:解压归档文件
安全模块
- firewalld:管理 Linux 防火墙
- seboolean:管理 SELinux 布尔值
系统监控模块
- cron:管理定时任务
- service:管理系统服务
版本控制模块
- git:克隆、拉取和管理 Git 仓库
存储模块
- mount:管理文件系统挂载
- parted:管理磁盘分区
变量和模板模块
- set_fact:设置和更新变量
- include_tasks:包含其他任务文件
调试模块
- debug:输出调试信息
- pause:暂停执行
监控和日志模块
- logrotate:管理日志轮换
- syslog:配置系统日志
备份和恢复模块
- copy:复制文件进行备份
- synchronize:使用 rsync 进行数据同步
用户和权限模块
- group:管理用户组
- sudoers:管理 sudo 权限
任务和流程控制模块
- block:将多个任务组合在一起
- wait_for:等待某个条件满足(如端口开放)
uri、get_url
- uri:与 REST API 进行交互
- get_url:从 URL 下载文件
监控和管理模块
- setup:收集目标主机的系统信息
- ansible.builtin.facts:获取主机的事实信息
服务和进程模块
- systemd:管理 systemd 服务
- service:管理系统服务(SysV init)
网络配置模块
- network_connections:管理网络连接
- ios_config:管理 Cisco IOS 设备配置
证书管理模块
- acme_certificate:管理 ACME 证书
- openssl_certificate:创建和管理 OpenSSL 证书
多平台支持模块
- win_feature:管理 Windows 功能
- win_service:管理 Windows 服务
任务重试模块
- wait_for_connection:等待连接可用
- retry:重试任务
配置管理模块
- template:处理 Jinja2 模板生成配置
- ini_file:管理 INI 配置文件
测试和验证模块
- assert:进行断言检查
- wait_for:等待特定条件满足
部署模块
- git:从 Git 仓库检出代码
- unarchive:解压归档文件
高级功能模块
- delegate_to:将任务委托给其他主机
- import_playbook:导入其他 Playbook

Ansible模块的参数与其搭配的指令
Ansible 的模块可以用于自动化系统配置和管理,模块通常有一些通用的参数,虽然具体的参数取决于模块的类型和功能。以下是一些常用的 Ansible 模块的通用参数及其说明:
1. name:
- 描述: 指定资源的名称或目标。
- 示例: 在
package模块中,name用于指定要安装或删除的软件包的名称。
2. state:
- 描述: 定义资源的目标状态。
- 选项:
present或installed:资源应存在(如安装包、文件等)。absent或removed:资源应不存在。started:服务应启动。stopped:服务应停止。restarted:服务应重新启动。latest:例如软件包应更新到最新版本。
- 示例: 在
service模块中,state可以设置为started或stopped。
3. src:
- 描述: 指定源文件或目录路径。
- 示例: 在
copy模块中,src用于指定本地文件路径,准备复制到目标主机。
4. dest:
- 描述: 指定目标路径。
- 示例: 在
copy模块中,dest用于指定文件应该复制到的路径。
5. user:
- 描述: 指定执行操作的用户。
- 示例: 在
file模块中,user用于设置文件或目录的所有者。
6. group:
- 描述: 指定文件或目录所属的组。
- 示例: 在
file模块中,group用于设置文件或目录的组。
7. mode:
- 描述: 设置文件或目录的权限模式。
- 示例: 在
file模块中,mode用于设置权限,例如0755。
为什么是“0755”而不是“755” :
在这种情况下,mode参数通常用于指定文件的访问权限。数字0755是一个八进制数,用于Unix和类Unix系统中设置文件权限。这里的0755表示:
0:表示这是一个八进制数。7:代表文件所有者(owner)具有读(4)、写(2)和执行(1)权限,总和为7。- 第二个
5:代表与文件所有者同组的用户(group)具有读(4)和执行(1)权限,总和为5。 - 第三个
5:代表其他用户(others)也具有读(4)和执行(1)权限,总和为5。
因此,0755意味着文件所有者可以完全控制文件,而同组用户和其他用户可以读取和执行文件,但不能写入。
在Unix和类Unix系统中,权限数字通常以八进制形式表示,所以0755中的前导0是必要的,它告诉系统这是一个八进制数。如果你只写755,系统会将其解释为十进制数,这将导致不同的权限设置。
十进制数755转换为八进制是0b111 101 101,这在八进制中表示为0755。但是,如果你在设置权限时使用755而不是0755,系统会将其解释为十进制数755,这在八进制中实际上是0b544,这会导致不同的权限设置,通常不是你想要的。
因此,为了确保权限正确设置为所有者全部权限,组和其他用户读/执行权限,你应该使用0755。
在编程中,特别是在Python语言中,0b是一个二进制数的前缀。当你在数字前面加上0b,它告诉解释器这个数字是一个二进制数。例如,0b1011是一个二进制数,它等价于十进制数11。
然而,在你提到的上下文中,0755是一个八进制数,不是二进制数。在Unix和类Unix系统中,文件权限通常以八进制数的形式表示。八进制数的前缀是0,而不是0b。所以,0755是一个八进制数,它表示文件的权限设置。
总结一下:
0b前缀用于表示二进制数。0前缀用于表示八进制数。- 没有前缀的数字默认是十进制数。
8. delegate_to:
- 描述: 指定将任务委托到其他主机执行。
- 示例: 用于在 Ansible Playbook 中将特定任务委托到不同的主机。
9. args:
- 描述: 用于传递其他参数,模块通常会接受以字典形式提供的额外参数。
- 示例: 在一些模块中,如
command,args可以用于指定额外的命令行参数。
10. 指令with_items:
- 描述: 用于循环处理列表中的每一项。
- 示例: 在
yum模块中,可以使用with_items来逐个安装列表中的软件包。
11. 指令register:
- 描述: 将任务的结果存储在变量中,以便后续使用。
- 示例: 在 Playbook 中,可以用
register将任务结果保存为变量以便进一步操作。
在Ansible中,
register关键字用于将任务的输出结果保存到一个变量中,以便在剧本(playbook)的其他部分进行引用。这个变量通常被称为“fact变量”或“注册变量”。以下是register关键字的具体使用方法:
-----基本语法
- name: Task name
shell: your_command
register: variable_name
name:任务的名称,用于日志记录和调试。shell:要执行的命令。你也可以使用其他模块,如command、copy、file等。register:将任务的输出保存到变量中,变量名由你指定。
-----使用注册变量
一旦你使用
register关键字注册了一个变量,你就可以在后续的任务中使用这个变量。注册变量通常包含几个属性,如stdout、stderr、changed、failed等。
stdout:命令的标准输出。stderr:命令的标准错误输出。changed:如果任务改变了系统状态(例如,文件被创建或修改),这个值会是True。failed:如果任务执行失败,这个值会是True。在 Ansible 中,注册变量的基本结构是使用
register关键字。注册的变量本身是一个字典,包含多个子元素,通常包括:
changed:布尔值,指示任务是否更改了系统状态。
failed:布尔值,指示任务是否失败。
invocation:包含任务的调用信息,包括参数和任务名称。
msg:任务输出的消息,通常是来自命令或模块的标准输出。
rc:返回码,通常用于表示命令执行的状态,0 表示成功。
stdout:标准输出,包含命令执行时的输出内容。
stderr:标准错误,包含命令执行时的错误信息。这些子元素可以帮助你详细了解任务的执行结果,并在后续的任务中进行逻辑判断和条件控制。使用注册变量时,通常会以
register: var_name的方式创建变量,例如:
- command: /path/to/command
register: command_output
然后你可以通过
command_output.changed、command_output.stdout等方式访问相应的子元素。
stdout_lines:将标准输出按行拆分的列表,便于逐行处理。
stderr_lines:将标准错误按行拆分的列表。
results:在使用某些模块时,如with_items,包含所有循环项的结果。
item:在循环任务中,当前处理的项。
warnings:任何与任务相关的警告信息。这些子元素能够提供更详细的任务执行信息,帮助你在剧本中进行调试和条件判断。
示例
- name: Get the current date
shell: date
register: current_date

最低0.47元/天 解锁文章
330

被折叠的 条评论
为什么被折叠?



