80.学习Ansible[3]:在远端机器临时执行命令,ansible远端
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.cfg
中forks
项的配置可以修改并发数。
默认的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'
。
包管理
yum
和apt
模块分别支持远端机器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的机器资源列表的配置知识。
评论暂时关闭