命令行使用
类比SHELL
在一个组中的所有服务器上运行命令,例如,对亚特兰大组,使用10个并行线程:
$ ansible atlanta -a "/sbin/reboot" -f 10
命令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 / etc),请添加–ask-become-pass(-K)。 这将交互式地提示您输入密码。 使用无密码设置使事情更容易自动化,但不是必需的。
上面的-f 10指定了10个同时使用的进程的用法。 您也可以在配置Ansible中进行设置,以避免再次设置。 默认值是5,这是个小而保守的值。 您可能想要与更多的同步主机进行通话,所以请根据情况增加。 如果您的主机数量超过设置的线程数量,Ansible会与他们交谈,但会花费更长的时间。 随意将这个值推高到你的系统可以处理的水平!
您还可以选择要运行的Ansible“模块”。 通常,命令使用-m指定使用的模块,默认的模块名称是’command’,所以我们不需要一直指定。 我们将在后面的示例中使用-m来运行其他一些使用模块。
注意:command模块不支持像管道和重定向这样的扩展shell语法(尽管shell变量将始终工作)。 如果您的命令需要特定于shell的语法,请改用shell模块。 详细了解“使用模块”页面上的差异。
使用shell模块像这样:
$ ansible raleigh -m shell -a 'echo $TERM'
文件传输
ansible命令行的另一个用例,Ansible可以 SCP 大量文件并行传输到多台机器上。
要将文件直接传输到多台服务器:
$ ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts"
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"
包管理
有可用于包管理的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"
用户管理
‘user’模块允许轻松创建和操作现有用户帐户,以及删除可能存在的用户帐户:
$ ansible all -m user -a "name=foo password=<crypted password here>" $ ansible all -m user -a "name=foo state=absent"
控制部署源
直接从git部署webapp:
$ ansible webservers -m git -a "repo=https://foo.example.org/repo.git dest=/srv/myapp version=HEAD"
由于Ansible模块可以通知更改处理程序,因此可以告诉Ansible在代码更新时运行特定任务,例如直接从git部署Perl / Python / PHP / Ruby,然后重新启动apache。
服务管理
确保在所有webservers上启动服务:
$ ansible webservers -m service -a "name=httpd state=started"
或者,在所有webservers上重启服务:
$ ansible webservers -m service -a "name=httpd state=restarted"
确保服务已停止:
$ ansible webservers -m service -a "name=httpd state=stopped"
操作时限
长时间运行的操作可以放入后台,并可以稍后检查其状态。 例如,要在后台异步执行long_running_operation,设置超时时间为3600秒(-B),并且没有轮询(-P):
$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"
如果您确定稍后要检查作业状态,则可以使用async_status模块,并向它传递给在后台运行原始作业时返回的作业ID:
$ 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"
上面的例子说“最长运行30分钟(-B 30 * 60 = 1800),轮询状态(-P)每60秒”。
信息收集
有关系统的已发现变量。 这些可以用来实现任务的条件执行,也可以用来获得有关系统的临时信息。 您可以通过以下方式查看所有信息:
$ ansible all -m setup