热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AnsibleAdHoc命令详解:官方文档中文翻译版

本文详细介绍了AnsibleAd-Hoc命令的使用方法,基于官方文档进行了中文翻译。Ad-Hoc命令允许用户通过`usr/bin/ansible`快速执行一次性任务,适用于快速部署、配置管理和故障排查等场景。文中通过多个实例演示了Ad-Hoc命令的具体应用,帮助读者更好地理解和掌握这一强大工具。
Introduction To Ad-Hoc Commands Ad-Hoc命令介绍

下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务。

什么是ad hoc命令?

一个ad hoc命令是一些我们可以非常快的打出,而不用为了后续的使用而保存。

在学习playbook语言之前,这是一个很好的位置来学习理解Ansible能做什么的基础 - ad-hoc命令也可以被用来快速做事情,这些事情没有必要写一个完整的playbook。

通常来说,Ansible真正的力量在于playbooks。为什么你使用ad-hoc任务而不是playbooks呢?

例如,在圣诞节的时候,你想要关闭实验室所有的电脑,你可以执行一行快速的命令,而无需写一个playbook。

对于配置管理和部署来说,你会使用 ‘/usr/bin/ansible-playbook’ 你在这里学习的概念也会适用playbook语言。

(关于 playbook 的更多信息,请参考 Playbooks )

如果你还没有阅读 Inventory文件 ,最好先看一看,然后我们继续往下。

Parallelism and Shell Commands 并行和shell命令

任意的例子。

让我们使用Ansible的命令行工具来重启所有的Atlanta的所有web服务器,每次启动十个。首先,让我们设置SSH-agent,以便记住我们的证书:

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

如果你不想使用ssh-agent,并且想要使用密码SSH代替keys,你可以使用--ask-pass(-k),但是最好是使用ssh-agent。

现在,在某个组中的服务器上运行命令,在这个例子中,组是atlanta,以10个并发进程执行:

$ ansible atlanta -a "/sbin/reboot" -f 10

/usr/bin/ansible将会默认使用你的帐号运行。如果你不想这个行为,传入-u

$ ansible atlanta -a "/usr/bin/foo" -u username

你通常不会仅仅使用你的用户账户执行操作。如果你想要使用特权上升运行命令时:

$ ansible atlanta -a "/usr/bin/foo" -u username --become [--ask-become-pass]

如果你不是使用无密码特权上升方法(sudo/su/pfexec/doas等),使用 --ask-become-pass(-K)。这回交互式的提示你密码的使用。使用一个无密码设置会使得事情更加容易自动化,但这不是必要的。

become 不是root的用户使用 --become-user:

$ ansible atlanta -a "/usr/bin/foo" -u username --become-user otheruser [--ask-become-pass]

注意:
  很少的情况下,一些用户有安全规则,他们限制了他们的 sudo/pbrun/doas 环境中仅运行特定的命令。这和ansible的no-bootstrapping哲学不匹配,
  同时几百个模块不会预期工作。如果这样做,使用Ansible作为一个特殊账户,该账户应该没有这个限制。
  无需分享未授权用户的一种做法是使用Ansible Tower为Ansible把关,
  其可以持有一个SSH证书并且让某一个组织的成员按照自己的办法使用它,而不需要直接访问。

好了,这就是基础。如果你还没有阅读模式和组,先回去阅读模式吧。

上面的例子中指定的 -f 10 ,是使用10个进程同时操作。你可以在配置文件 Configuration file 中设置,而无需在这里。默认是5,是指非常小和保守的。你可能想要同时操作更多主机,适当调整这个是合适的。如果你有比fork值更多的主机数量,Ansible会自行协调, 只是花得时间会更长一点。尽管将这个值设置的高一点,只要Ansible机器能处理。

你也可以选择你要使用的Ansible模块。通常命令会包含一个 -m 指定模块名,默认的模块名是 ‘command‘ ,因此我们没有必要指定。后续我们会使用-m来运行其他模块About Modules。

注意

  command 在远程主机指定一个命令模块不支持扩展shell语法,例如管道和重定向(shell变量仍然可用)。如果你的命令要求shell特有的语法,使用shell模块。阅读更多不同在 About Modules 

使用节点中shell命令执行模块,类似如下:

$ ansible raleigh -m shell -a echo $TERM

当使用Ansible ad-hoc 命令行(与playbooks相对) 运行任意命令,特别注意shell的引号规则,因此上述例子中,在传递给Ansible之前,本地shell没有将变量转化为本机变量值。例如,使用双引号代替单引号,$TERM变量将被本地shell计算,而不是远端主机的变量。

到目前为止,我们简单的举例command执行,但是大多数Ansible模块不是简单的命令脚本。相反,他们使用声明式的模型,计算和执行达到最终状态的的动作。更进一步,通过在模块开始之前检查当前的状态,如果当前状态是最终状态,不做任何事情,这样的话模块就是一个幂等的形式。但是我们也认识到,能运行任意命令也是重要的,所以Ansible对俩者都支持。

File Transfer 文件传输

这是 /usr/bin/ansible 的另外一种用法。Ansible能够以并行的方式同时SCP大量的文件到多台机器。命令如下:

$ ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"

若你使用playbooks,则可以利用template模块来做到更进一步的事情, (See module and playbook documentation)。

file模块允许更改文件的属主和权限。相同的选项也可以传入copy模块:

$ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
$ ansible webservers -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"

file模块也可以创建目录,类似于“mkdir -p”:

$ ansible webservers -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

递归的删除目录和文件

$ ansible webservers -m file -a "dest=/path/to/c state=absent"

Managing Packages 管理包

Ansible 提供对 yum 和 apt 的支持。这里是关于 yum 的示例。

确保一个包已经被安装,但是不更新:

$ ansible webservers -m yum -a "name=acme state=present"

确保一个包安装了并且是指定版本:

$ ansible webservers -m yum -a "name=acme-1.5 state=present"

确保一个包是最新的版本:

$ ansible webservers -m yum -a "name=acme state=latest"

确保一个包没有被安装:

$ ansible webservers -m yum -a "name=acme state=absent"

对于不同平台的软件包管理工具,Ansible都有对应的模块。如果没有,你也可以使用 command 模块去安装软件。或者最好是来为那个软件包管理工具贡献一个相应的模块。请在 mailing list 中查看相关的信息和详情。

Users and Groups 用户和组

“user” 模块可以很容易的操作已存在的用户帐号,和移除已存在的用户帐号

$ ansible all -m user -a "name=foo password="

$ ansible all -m user -a "name=foo state=absent"

查看 About Modules部分获取所有变量的详细细节,包含如何操作组和组关系。

Deploying From Source Control 从源码控制系统部署

直接从git中部署你的webapp

$ ansible webservers -m git -a "repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

因为Ansible模块可以通知change handlers,所以告知Ansible,当代码更新的时候执行指定任务,例如直接从git中部署Perl/Python/PHP/Ruby,并且重启apache。

Managing Services 管理服务

确保服务在所有的web服务器是启动的:

$ ansible webservers -m service -a "name=httpd state=started"

可选地,在所有的web服务器上重启一个服务:

$ ansible webservers -m service -a "name=httpd state=restarted"

确保一个服务是停止的:

$ ansible webservers -m service -a "name=httpd state=stopped"

Time Limited Background Operations 限制后台操作的时间

长时间运行的操作可以在后台运行,并且可以在后续检查它们的状态。例如为了在后台异步的执行long_running_operation,设置超时时间为3600秒(-B),且不需要轮询状态(-P):

$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"

如果你决定要检查job状态,你可以使用 async_status模块,传递jobid给它,这个job id当你后台运行job时会返回给你:

$ ansible web1.example.com -m async_status -a "jid=488359678239.2844"

轮询是内建的,看起来像这样:

$ ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"

其中 -B 1800 表示最多运行30分钟, -P 60 表示每隔60秒获取一次状态信息。

轮询模式是智能的,因此在任何机器上所有的job会在轮询之前启动。确保使用一个足够大的 --forks 值,如果你想要使所有的job快速的启动。在-B指定的时间用尽时,这个过程在远程节点上将会停止。

通常,你只会把后台长时间运行的shell命令或者软件升级。copy 模块后台化并不会做一个后台的文件拷贝(不像你想要的那样)。 Playbooks 同样支持轮询,并且有一个简化的语法。

Gathering Facts 收集Facts

facts在playbooks部分描述,其代表了某一个主机系统上发现的变量集。这些可以被用做任务的条件执行,也可以获取关于你系统的ad-hoc信息。你可以查看所有的facts通过如下方式:

$ ansible all -m setup

我们也可以对这个命令的输出做过滤,只输出特定的一些 facts,详情请参考 “setup” 模块的文档。

Read more about facts at Variables once you’re ready to read up on Playbooks.

【Ansible 文档】【译文】Ad-Hoc 命令介绍


推荐阅读
  • 在Android应用程序中,可以包含多个Activity,这些Activity彼此之间处于同一层级。当应用程序启动时,系统需要确定首先启动哪一个Activity。此外,某些应用程序可能需要在应用列表中显示,而另一些则不需要。本文将深入解析Manifest文件中的启动关联机制,探讨如何通过配置实现不同的启动行为和显示需求。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 本章深入探讨了Java中的多态特性,这是面向对象编程的核心概念之一。多态指的是同一操作作用于不同的对象时,可以有不同的解释和执行方式。在Java中,多态通过父类引用变量引用子类对象来实现,即 `父类类型 引用变量名 = new 子类类型();`。这种方式允许程序在运行时根据实际对象的类型动态地选择合适的方法执行,从而提高代码的灵活性和可扩展性。此外,本章还详细介绍了多态的应用场景和注意事项,帮助读者更好地理解和运用这一重要概念。 ... [详细]
  • 本文详细解析了 `DirectoryInfo.GetFiles` 方法的使用方法及其应用场景。通过示例代码展示了如何在 C# 程序中利用该方法获取指定目录下的所有文件列表,同时探讨了其参数选项和返回值类型,为开发者提供了实用的操作指南。 ... [详细]
  • 下面的代码旨在输出其类文件的完整名称。对于不熟悉类字面量的读者,`Me.class.getName()` 方法会返回类的全称,例如 “com.javapuzzlers.Me”。通过这一机制,可以深入了解 Java 类加载和反射机制的内部工作原理。 ... [详细]
  • 问题背景:在使用Struts2注解实现ZIP文件下载功能时,由于InputStream未正确关闭,导致Tomcat服务器异常终止。重启后,系统抛出`java.io.EOFException`错误。具体表现为,在文件下载过程中,如果请求未正常完成或客户端提前中断连接,未关闭的InputStream会占用资源,最终导致服务器资源耗尽,触发异常。为解决此问题,建议在代码中确保InputStream在使用完毕后能够及时且正确地关闭,以避免资源泄露和服务器崩溃。 ... [详细]
  • Oracle程序包基础入门:了解核心概念与基本结构
    本文旨在为初学者介绍 Oracle 程序包的基础知识,涵盖其核心概念和基本结构。通过详细解析程序包的组成元素,如过程、函数和变量,帮助读者理解如何在实际应用中有效使用 Oracle 程序包。此外,文章还提供了实例代码,以便读者更好地掌握这些关键概念。 ... [详细]
  • 教程:使用Source Monitor进行代码质量分析
    Source Monitor 是一款强大的代码分析工具,能够对 Java、C++、C、C# 和 Delphi 等多种编程语言进行复杂度分析,帮助开发者有效评估和提升代码质量。通过详细的指标和报告,该工具可辅助团队识别潜在问题并优化代码结构。 ... [详细]
  • WinForms应用程序中的高效双缓冲技术优化方法
    在探讨WinForms应用程序中高效的双缓冲技术优化方法时,网络上的资料往往杂乱无章,缺乏清晰的解释。本文总结了多种优化方案,包括但不限于:第一种方案,通过设置控件的DoubleBuffered属性来减少屏幕闪烁;第二种方案,自定义绘图方法以提高性能;第三种方案,利用重载WndProc方法拦截绘制消息。此外,还结合实际代码示例,详细解析了每种方案的实现原理和应用场景,帮助开发者更好地理解和应用双缓冲技术。 ... [详细]
  • 本文深入探讨了Windows操作系统中线程同步机制的关键技术,重点分析了`WaitForSingleObject`和`Event`的使用方法及其应用场景。通过详细介绍`CreateEvent`函数的创建过程及其在判断线程退出和实现线程间同步中的重要作用,结合具体实例,展示了如何高效地利用这些工具来解决多线程编程中的常见问题。此外,文章还讨论了这些机制在实际开发中的最佳实践和注意事项,为开发者提供了宝贵的参考。 ... [详细]
  • 题目要求在给定的数组中找到一个连续子数组,使其乘积最大。本文详细介绍了使用动态规划算法解决这一问题的方法,包括状态定义、状态转移方程和初始化步骤。通过具体的例子和代码实现,帮助读者深入理解该算法的核心思想和实现细节。 ... [详细]
  • Dapper:一款高效轻量的ORM框架
    Dapper 是一个高效且轻量级的 ORM(对象关系映射)框架,由 StackExchange 开发并维护。它旨在提供快速的数据访问性能,同时保持代码的简洁性和易用性。Dapper 可以显著提高开发效率,特别适用于需要高性能数据操作的应用场景。更多详细信息可参考其官方文档和 GitHub 仓库。 ... [详细]
  • 本文深入探讨了 AdoDataSet RecordSet 的序列化与反序列化技术,详细解析了将 RecordSet 转换为 XML 格式的方法。通过使用 Variant 类型变量和 TStringStream 流对象,实现数据集的高效转换与存储。该方法不仅提高了数据传输的灵活性,还增强了数据处理的兼容性和可扩展性。 ... [详细]
  • 触发器是数据库中一种特殊类型的存储过程,其执行依赖于预定义的事件,而非直接调用。在数据库管理中,触发器主要用于实现数据完整性、自动化日志记录及复杂业务规则的执行。当对数据库中的表、视图等对象进行插入、更新或删除操作时,系统将自动激活相关的触发器,以确保数据的一致性和安全性。此外,通过合理设计和优化触发器,还可以显著提升数据库性能和响应速度。 ... [详细]
  • 兰州大学科研团队在项目实践中进行了深入的反思与总结。尽管项目已正式完成,但后续可能仍需持续优化和调整。团队成员对项目的顺利推进表示欣慰,同时也对未来的改进充满期待。目前,项目维护费用尚未到位,但这并未影响团队的积极性和对未来工作的热情。 ... [详细]
author-avatar
手机用户2602919091
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有