ansible之ad-hoc commands

来源:互联网 发布:海洛因在淘宝的名称 编辑:程序博客网 时间:2024/06/05 14:17

前言

  • 什么是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 模块来说,即使按照前面的示例想放到 后台执行文件传输,实际上并不会如你所愿.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子长巨大脓包怎么办 微信里怎么提现怎么办 天猫账号被风控怎么办 618津贴不够用怎么办 天猫精灵不灵敏怎么办 淘宝被恶意退款怎么办 天猫红包失效怎么办 预约人数满了怎么办 淘宝签证拒签怎么办 天猫美的差评怎么办 直通车欠费三块怎么办 上海个人户口卡怎么办 网购信息泄露怎么办 单张券达到上限怎么办 未成年偷钱充q币怎么办 被香港中炎骗了怎么办 房东要收回店面怎么办 天猫字迹模糊怎么办 淘宝类目不叫上架怎么办 淘宝直播有延迟怎么办 淘宝直播间中奖怎么办 微信扫码付款后卖家不发货怎么办 淘宝打骚扰电话怎么办 淘宝卖家打骚扰电话怎么办 被商家打了怎么办 保底消费入坑怎么办 留党查看到期怎么办 遭遇淘宝控价怎么办 淘宝店没有了怎么办 淘宝店铺运费险不出单怎么办 闲鱼定金被骗怎么办 肯德基团购过期怎么办 word不可以修改怎么办 店铺预售不发货怎么办 埋件设置不符合怎么办 闲鱼付了款卖家不发货怎么办 微信里付了款卖家不发货怎么办 运动鞋穿臭了怎么办 小车陷泥土了怎么办 孩子有心事不说怎么办 网状运动鞋乱了怎么办