ansible - script模块执行脚本
场景
在批量管理主机的时候,希望批量执行一个脚本,这个脚本只执行一次,就不想把脚本放到远程机器上了,这时候就可以使用script模块进行操作。
用法
ansible [ip/hostname] -m script -a [args]
常用参数
chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。
creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考 command 模块中的解释。
removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考 command 模块中的解释。
例子
脚本内容(1.sh)
#!/bin/bash echo "start ..." pwd sleep 10 pwd mkdir aa echo "end ..."
直接执行
ansible 192.168.57.102 -m script -a '1.sh'
192.168.57.102 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.57.102 closed.",
"stderr_lines": [
"Shared connection to 192.168.57.102 closed."
],
"stdout": "start .../root/rootend ...",
"stdout_lines": [
"start ...",
"/root",
"/root",
"end ..."
]
}
可以看到,默认工作目录是到用户的家目录
切换目录执行
ansible 192.168.57.102 -m script -a 'chdir=/tmp/ 1.sh'
192.168.57.102 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.57.102 closed.",
"stderr_lines": [
"Shared connection to 192.168.57.102 closed."
],
"stdout": "start .../tmp/tmpend ...",
"stdout_lines": [
"start ...",
"/tmp",
"/tmp",
"end ..."
]
}
判断目录或者文件是否存在,存在就不执行,不存在就执行
ansible 192.168.57.102 -m script -a 'creates=/tmp/aa chdir=/tmp/ chdir=/tmp 1.sh'
192.168.57.102 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.57.102 closed.",
"stderr_lines": [
"Shared connection to 192.168.57.102 closed."
],
"stdout": "start .../tmp/tmpend ...",
"stdout_lines": [
"start ...",
"/tmp",
"/tmp",
"end ..."
]
}
上一个执行脚本创建了/tmp/aa的目录,存在这个目录就不执行了
ansible 192.168.57.102 -m script -a 'creates=/tmp/aa chdir=/tmp/ chdir=/tmp 1.sh'
192.168.57.102 | SKIPPED
判断目录或者文件是否存在,存在就执行,不存在就不执行
ansible 192.168.57.102 -m script -a 'removes=/tmp/aa chdir=/tmp/ chdir=/tmp 1.sh'
192.168.57.102 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.57.102 closed.",
"stderr_lines": [
"Shared connection to 192.168.57.102 closed."
],
"stdout": "start .../tmp/tmpend ...",
"stdout_lines": [
"start ...",
"/tmp",
"/tmp",
"end ..."
]
}
总结
其实ansible在执行过程中也是有文件拷贝的,只是这个执行文件是拷贝到临时目录,执行完以后就自动删除了,对于一下存放密码的脚本相对比较安全。