【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
/usr/bin/ansible将会默认使用你的帐号运行。如果你不想这个行为,传入-u <username。如果你想使用其他用户运行命令,如下所示:
$ 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=<crypted password here>" $ 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 -P -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 -P -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 命令介绍的更多相关文章
- 【Ansible 文档】【译文】配置文件
这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...
- 【Ansible 文档】【译文】Windows 支持
see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...
- 【Ansible 文档】【译文】入门教程
http://docs.ansible.com/ansible/latest/intro_getting_started.html Foreword 前言 到这里,你应该已经安装了Ansible,是时 ...
- 【Ansible 文档】【译文】Playbooks 变量
Variables 变量 自动化的存在使得重复的做事情变得很容易,但是我们的系统不可能完全一样. 在某些系统中,你可能想要设置一些与其他系统不一样的行为和配置. 同样地,远程系统的行为和状态也可以影响 ...
- 【Ansible 文档】【译文】常见问题
http://docs.ansible.com/ansible/latest/faq.html 如何为一个task或者整个Playbook设置PATH或者任意其他环境变量? 通过environment ...
- 【Ansible 文档】【译文】网络支持
Networking Support 网络支持 Working with Networking Devices 使用网络设备 自从Ansible 2.1开始,你现在可以使用成熟模型 - 编写 play ...
- JS文档生成工具:JSDoc 介绍
JSDoc是一个根据javascript文件中注释的信息,生成API文档的工具.生成的文档是html文件.类似JavaDoc和PHPDoc. 用法 /** 一坨注释之类的 */JSDoc会从/**开头 ...
- C# 写入XML文档三种方法详细介绍
三个类将同样的xml内容写入文档,介绍了如何使用XmlDocument类对XML进行操作,以及如何使用LINQ to XML对XML进行操作. 它们分别使用了XmlDocument类和XDocum ...
- CocoaAsyncSocket 文档1:Socket简单介绍
前言 CocoaAsyncSocket是 IOS下广泛应用的Socket三方库,网上相关样例数不胜数.这里我就不直接上代码,本文由B9班的真高兴发表于CSDN博客.另辟一条思路:翻译SocketAsy ...
随机推荐
- 几种流行的AJAX框架对比:Jquery,Mootools,Dojo,ExtJs,Dwr
1:Jquery 主页:http://jquery.com/ 设计思想:简洁的方案思想,几乎所有操作都是以选择DOM元素(有强大的Selector)开始,然后是对其的操作(Chaining等特性). ...
- ADO.NET 【攻击及防御】
sql字符串注入攻击 SQL注入攻击是黑客对数据库进行攻击的常用手段之一.SQL注入的手法相当灵活 SQL注入攻击会导致的数据库安全风险包括:刷库.拖库.撞库. 一般来说,SQL注入一般存在于形如:H ...
- 批处理REG学习
首先在批处理操作注册表之前,应该了解REG命令的使用方式,详情请参阅一下网址: https://www.jb51.net/article/30078.htm 从以上链接内容我们可以详细了解使用reg的 ...
- .net解决Xss攻击
首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ...
- SpringBoot+Mybatis+PageHelper实现分页
SpringBoot+Mybatis+PageHelper实现分页 mybatis自己没有分页功能,我们可以通过PageHelper工具来实现分页,非常简单方便 第一步:添加依赖 <depend ...
- python常用内置函数1
1,abs 求绝对值 >>> abs( -1 ) 1 >>> abs( 1 ) 1 >>> 2,max, min求序列最大值与最小值 >&g ...
- drop,truncate,delete 区别
一.SQL中的语法 1.drop table 表名称 eg: drop table dbo.Sys_Test 2.truncate table 表 ...
- python-桥接模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 有些类在功能设计上要求,自身包含两个或两个以上变化的因素,即该类在二维或者多维上 ...
- java post请求的表单提交和json提交简单小结
在java实现http请求时有分为多种参数的传递方式,以下给出通过form表单提交和json提交的参数传递方式: public String POST_FORM(String url, Map< ...
- Thinkphp5+PHPExcel实现批量上传表格数据
1.首先要下载PHPExcel放到vendor文件夹下,我的路径是:项目/vendor/PHPExcel/,把下载的PHPExcel文件放在这里 2.前端代码 <!DOCTYPE html> ...