80.学习Ansible[3]:在远端机器临时执行命令,ansible远端


文章目录

  • ad-hoc command
    • 执行shell命令
    • 传输文件与远端文件属性管理
    • 包管理
    • 用户管理
    • 检出代码
    • 服务进程管理
    • 限制后台进程的运行时间
    • 收集参数(gather facts)

ad-hoc command

例行化的工作,像复杂的配置管理、机械化的环境部署,可以用Ansible的playbook(剧本)功能。临时需要在远端机器执行命令时,可以使用Ansible的ad-hoc command(临时执行命令)功能。执行临时命令前,需要先配置Ansible管理的远端机器列表,我们先不深入机器管理的细节,以前一篇博文中定义的机器列表为例:

[example]
a.example.com
b.example.com

执行shell命令

example组的机器上打印hello,Ansible主机以10并发处理任务:

$ ansible example -a "/bin/echo hello" -f 10
a.example.com | CHANGED | rc=0 >>
hello

b.example.com | CHANGED | rc=0 >>
hello

-f表示Ansible主机与远端机器连接的并发数,默认是5,修改ansible.cfgforks项的配置可以修改并发数。
默认的command模块不支持Shell的管道、重定向、变量替换、;&等特性,shell模块支持这些特性,例如:

$ ansible example -m shell -a 'echo $TERM'
a.example.com  | CHANGED | rc=0 >>
xterm-256color

b.example.com | CHANGED | rc=0 >>
xterm-256color

使用ad-hoc command,要注意Shell中单、双引号的使用,双引号相当于参数传递给ansible命令行前先在主机的Shell中替换了变量的值。
特别地,shell模块的creates参数指向一个文件,当文件已经存在时,shell模块参数中命令不会被执行。
ad-hoc command其实是对Ansible各种模块的调用,下面介绍一些常用的模块,这些模块在playbook中也会经常用到。

传输文件与远端文件属性管理

copy模块可以scp文件到远端机器:ansible example -m copy -a 'src=hosts dest=$HOME/mars/',如果目标目录dest不存在,Ansible会自动创建这个目录。ansible example -m copy -a 'src=hosts dest=$HOME/mars'会把执行ansible命令时当前目录的hosts文件拷贝到远端机器的$HOME目录,并重命名为mars(注意mars后面/的不同)。
file模块可以修改远端机器上的文件的权限和所有者属性,修改文件权限、所属者、所属组:ansible example -m file -a 'dest=/home/map/mars/hosts mode=611 owner=mars group=mars'
创建目录(类似mkdir -p):ansible example -m file -a 'dest=$HOME/mars/test mode=744 owner=mars group=mars state=directory'
递归地删除目录和文件:ansible example -m file -a 'dest=$HOME/mars/test state=absent'

包管理

yumapt模块分别支持远端机器yum和apt包管理器的操作。以yum为例:
安装软件:ansible example -m yum -a 'name=openssh state=present'
安装软件的指定版本:ansible example -m yum -a 'name=openssh-5.3p1 state=present'
安装软件的最新版本:ansible example -m yum -a 'name=openssh state=latest'
卸载软件:ansible example -m yum -a 'name=acme state=absent'
如果使用的包管理器没有对应的Ansible模块,可以使用shell模块或者开发自己的模块。

用户管理

user模块支持远端机器的用户管理。例如,创建用户:ansible example -m user -a 'name=mars3 group=mars create_home=yes home=/home/mars3 shell=/bin/bash password=saO3weE80EO9k state=present system=yes' -u mars --become --ask-become-pass,其中password是由如下Python程序生成的加密后的字符串:

import crypt
crypt.crypt('123123', 'salt') #第一个参数是密码,第二个参数是加的盐

删除用户:ansible example -m user -a 'name=mars3 state=absent' -u mars --become --ask-become-pass

检出代码

git模块支持检出Git代码库,要求远端机器安装Git,版本>=1.7.1。需要提前在远端机器配置ssh公私钥,例如:ansible example -m git -a 'repo=ssh://mars@example.com:8000/test-project dest=$HOME/temp/ version=HEAD' -u mars
git模块适用于Python、PHP等脚本语言应用的部署。

服务进程管理

service模块支持管理服务状态。例如,启动服务:ansible example -m service -a 'name=crond state=started',重启服务:ansible example -m service -a 'name=sshd state=restarted',停止服务:ansible example -m service -a 'name=httpd state=stopped'

限制后台进程的运行时间

长期运行的服务一般在后台运行,然后可以定期检查服务的运行状态。进程启动后,可以设置进程的超时时间(-B,单位为秒)和进程状态检查的轮询时间(-P,单位为秒,设置为0表示不轮询状态),如果进程在-B规定的时间内未正常对出,Ansible会报错并杀死进程:

$ ansible a.example.com -a 'watch ls' -B 3600 -P 0 -vvv
ansible 2.7.0
…
{"started": 1, "_ansible_suppress_tmpdir_delete": true, "finished": 0, "results_file": "/home/map/.ansible_async/70171713335.893", "ansible_job_id": "70171713335.893"}\r\n
…

我在ansible命令中加了-vvv参数查看ansible_job_id,由于实际显示太多所以用….代替了部分真实输出。
也可以用async_status主动同步服务状态,例如:

$ ansible a.example.com -m async_status -a 'jid=70171713335.893'
a.example.com  | SUCCESS => {
    "ansible_job_id": "70171713335.893",
    "changed": false,
    "finished": 0,
    "started": 1
}

收集参数(gather facts)

Ansible的参数(fact)指动态发现的远端系统的变量值,通常用来做不同机器的不同任务用。可以通过setup模块获取:ansible example -m setup

至此,你已经可以使用Ansible完成简单的运维任务了,不过合格的运维还要掌握Ansible最强大的功能:playbook。在学习playbook前,我们先回过头来补充一下Ansible的机器资源列表的配置知识。

相关内容

    暂无相关文章