| 英文 | 中文 | 备注 |
|---|---|---|
| host | 主机 | |
| group | (主机)组 | |
| pattern | 模式 | |
| ad hoc | 特别命令 | |
| playbook | 剧本 | Ansible 专有名词,一段复杂的编排 |
| inventory | 库存 | Ansible 专有名词 |
| flag | 标志 | |
| alias | 别名 |
当您通过一个特别命令(ad hoc)或运行一个剧本(playbook)执行 Ansible 时,您必须选择要针对哪个受管节点或组执行。模式允许您针对库存(inventory)中的特定主机和/或组运行命令和剧本。Ansible 模式可以引用单个主机、IP地址、库存组、一组 组或库存中的所有主机。模式非常灵活——您可以排除或要求主机子集,使用通配符或正则表达式,等等。Ansible 在模式中包含的所有库存主机上执行。
几乎在执行特别命令或剧本时都要使用模式。模式是特别命令(ad hoc command )中唯一没有标志的元素。其通常是第二个元素:
ansible <pattern> -m <module_name> -a "<module options>"
例如:
ansible webservers -m service -a "name=httpd state=restarted"
⚠️ 注意:
如果 shell 是 zsh,
<pattern>需要用双引号括起来,如下:
- ✅ ansible "component*" -m ping
- ❌ ansible component* -m ping ,这个会报错:「zsh: no matches found: component*」
在剧本中,模式是每个剧本的 hosts: 行内容:
- name: <play_name>
hosts: <pattern>
例如:
- name: restart webservers
hosts: webservers
由于您经常希望一次针对多个主机运行命令或剧本,因此模式通常引用库存组。特别命令和上面的剧本都将对 webservers 组中的所有机器执行。
该表列出了针对库存主机和组的常见模式。
| 描述 | 模式 | 目标 |
|---|---|---|
| 所有主机 | all (或 *) | |
| 一台主机 | host1 | |
| 多台主机 | host1:host2 (或 host1,host2) | |
| 一个(主机)组 | webservers | |
| 多个(主机)组 | webservers:dbservers | webservers 组中的所有主机加上 dbservers 中的所有主机 |
| 排除(主机)组 | webservers:!atlanta | 在 webservers 且不在 atlanta 组中的所有主机 |
| 组的交集 | webservers:&staging | 既在 webservers 又在 staging 中的所有主机 |
✍️ 笔记:
可以使用逗号(
,)或冒号(:)分隔主机列表。在处理范围和 IPv6 地址时,首选逗号。
一旦你知道了基本的模式,你就可以把它们组合起来。举个例子:
webservers:dbservers:&staging:!phoenix
针对 “webservers” 组和 “dbservers” 组中所有也在 “staging” 组中的机器,除了 “phoenix” 组中的机器。
您可以对 FQDN 或 IP 地址使用通配符模式,只要目录中的主机是通过 FQDN 或 IP 地址命名的:
192.0.\*
\*.example.com
\*.com
你可以同时混合通配符模式和组:
one*.com:dbservers
模式取决于库存。如果一个主机或组没有列在你的目录中,你不能使用模式来锁定它。如果你的模式包含一个 IP 地址或主机名,但没有出现在库存中,你会看到这样的错误:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com
您的模式必须与库存语法匹配。如果将主机定义为别名:
atlanta:
host1:
http_port: 80
maxRequestsPerChild: 808
host: 127.0.0.2
您必须在模式中使用别名。在上面的示例中,必须在模式中使用 host1。如果你使用 IP 地址,你将再次报错:
[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2
上面描述的通用模式将满足您的大多数需求,但是 Ansible 提供了其他几种方法来定义您想要目标的主机和组。
你可以通过 -e 参数使用变量来向 ansible-playbook 传递组说明符:
webservers:!{{ excluded }}:&{{ required }}
可以根据主机在组中的位置定义主机或主机子集。例如,给定下列组:
[webservers]
cobweb
webbing
weber
您可以使用下标来选择单独的主机或范围内的 webservers 组:
webservers[0] # == cobweb
webservers[-1] # == weber
webservers[0:2] # == webservers[0],webservers[1]
# == cobweb,webbing
webservers[1:] # == webbing,weber
webservers[:3] # == cobweb,webbing,weber
你可以以 ~ 开头,指定一个模式作为一个正则表达式:
~(web|db).*\.example\.com
您可以使用命令行选项更改剧本中定义的模式的行为。例如,可以通过指定 -i 127.0.0.2, (注意末尾的逗号),在单个主机上运行一个定义了所有主机的剧本。即使你的目标主机没有在你的库存中定义,这也可以工作。你也可以使用 --limit 标志来限制你的目标主机:
ansible-playbook site.yml --limit datacenter2
最后,您可以使用 --limit 从文件中读取主机列表,方法是在文件名前加上 @ 前缀:
ansible-playbook site.yml --limit @retry_hosts.txt
如果 RETRY_FILES_ENABLED 设置为 True, ansible-playbook 运行后将创建一个 .retry 文件,其中包含所有剧本中失败的主机列表。每次 ansible-playbook 运行结束时,该文件都会被覆盖。
ansible-playbook site.yml –limit @site.retry
要使用 Ansible 命令和脚本应用您的模式知识,请阅读特别命令介绍和脚本介绍。
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal