ansible之ad-hoc commands

前言

  • 什么是ad-hoc命令?
    如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook.前者可以解决一些简单的任务, 后者解决较复杂的任务。

这其实是一个概念性的名字,是相对于写 Ansible playbook 来说的.类似于在命令行敲入shell命令和 写shell scripts两者之间的关系

  • 那我们会在什么情境下去使用ad-hoc 命令呢
    比如说因为圣诞节要来了,想要把所有实验室的电源关闭,我们只需要执行一行命令 就可以达成这个任务,而不需要写 playbook 来做这个任务。

至于说做配置管理或部署这种事,还是要借助 playbook 来完成,即使用 ‘/usr/bin/ansible-playbook’ 这个命令。

在下面的例子中,我们将演示如何使用 /usr/bin/ansible 运行 ad hoc 任务。

举栗子

这里我们要使用 Ansible 的命令行工具来重启 Atlanta 组中所有的 web 服务器,每次重启10个。

  • 我们先设置 SSH-agent,将私钥纳入其管理:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

如果不想使用 ssh-agent, 想通过密码验证的方式使用 SSH,可以在执行ansible命令时使用 –ask-pass (-k)选项, 但这里建议使用 ssh-agent,避免密码明文。

  • 开始执行命令
$ ansible atlanta -a "/sbin/reboot" -f 10

这个命令中,atlanta是一个组,这个组里面有很多服务器,”/sbin/reboot”命令会在atlanta组下 的所有机器上执行.这里ssh-agent会fork出10个子进程(bash),以并行的方式执行reboot命令.如前所说“每次重启10个” 即是以这种方式实现。

这个选项也可以在 Ansible的配置文件 中设置, 在配置文件中指定的话,就不用在命令行中写出了.这个选项的默认值是 5,是比较小的.如果同时操作的主机数比较多的话, 可以调整到一个更大的值,只要不超出你系统的承受范围就没问题.如果主机数大于设置的并发进程数,Ansible会自行协调, 花得时间会更长一点.

  • 在执行 /usr/bin/ansible 时,默认是以当前用户的身份去执行这个命令.如果想以指定的用户执行 /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]

如果没有使用passwordless模式,使用--ask-become-pass (-K),以交互模式输入密码来提升权限。然鹅,使用passwordless模式会让运维更自动化,但不是必须要求的。

  • 切换root以外的方法也可以如下:
$ ansible atlanta -a "/usr/bin/foo" -u username --become-user otheruser [--ask-become-pass]

推荐使用有一定权限而不至于被某些规则束缚的账号来使用ansible

一些信息

ansible默认的模块时command,上面的reboot命令就不用指出模块,如果需要其他模块,加上-m参数。

command 模块不支持 shell 变量,也不支持管道等 shell 相关的东西.如果你想使用 shell相关的这些东西, 请使用’shell’ 模块。

  • 使用shell的例子:
$ ansible raleigh -m shell -a 'echo $TERM'

使用 Ansible ad hoc 命令行接口时(与使用 Playbooks 的情况相反),尤其注意 shell 引号的规则. 比如在上面的例子中,如果使用双引号”echo $TERM”,会求出TERM变量在当前系统的值,而我们实际希望的是把这个命令传递 到其它机器执行。

file transfer

  • 这是 /usr/bin/ansible 的另一种用法.Ansible 能够以并行的方式同时 SCP 大量的文件到多台机器. 命令如下:
$ ansible atlanta -m copy -a "src=/etc/hosts dest=/etc/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=/temp/text/dic mode=755 owner=mdehaan group=mdehaan state=directory"
  • 删除目录(递归的删除)和删除文件:
$ ansible webservers -m file -a "dest=/path/to/c state=absent"

file模块的state有以下几种:absent(删除),directory(目录),link(软连接),hard(硬链接),file(暂时不知道有什么用),touch(同bash的touch)。

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=absent"

yum 的state有以下几种:absent(未安装),present(已安装的),installed(安装),removed(删除),latest(更新)

Users and Groups

  • 使用 ‘user’ 模块可以方便的创建账户,删除账户,或是管理现有的账户:
$ ansible all -m user -a "name=foo password=<crypted password here>"

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

Managing Services

  • 确认某个服务在所有的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"

Time Limited Background Operations

  • 需要长时间运行的命令可以放到后台去,在命令开始运行后我们也可以检查运行的状态.如果运行命令后,不想获取返回的信息, 可执行如下命令:
$ ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff"
  • 如果你确定要在命令运行后检查运行的状态,可以使用 async_status 模块.前面执行后台命令后会返回一个 job id, 将这个 id 传给 async_status 模块:
$ 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秒获取一次状态信息.

Polling 获取状态信息的操作会在后台工作任务启动之后开始.若你希望所有的工作任务快速启动, –forks 这个选项的值 要设置得足够大,这是前面讲过的并发进程的个数.在运行指定的时间(由-B选项所指定)后,远程节点上的任务进程便会被终止.

一般你只能在把需要长时间运行的命令或是软件升级这样的任务放到后台去执行.对于 copy 模块来说,即使按照前面的示例想放到 后台执行文件传输,实际上并不会如你所愿.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值