ansible常见模块及使用方法
查看支持的模块
[root@ansible-server ~]# ansible-doc -l (小写l)
[root@ansible-server ~]# ansible-doc -l | wc -l #查看支持的模块个数
[root@ansible-server ~]# ansible --version #查看我们的ansible版本号
获取模块的帮助
ansible-doc 模块名 或者ansible-doc -s 模块名 #获取指定模块帮助信息说明
这里我们使用ansible-doc获取下command模块的使用方式。
[root@ansible-server ~]# ansible-doc command
[root@ansible-server ~]# ansible-doc -s command
3个远程命令模块的区别
command模块
command 模块可以帮助我们在远程主机上执行命令。
注意:使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”, “|”, “;” 和 “&” 这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。还有一点需要注意,执行ansible时,不加-m 默认使用command,可以在 /etc/ansible/ansible.cfg 中修改。
# default module name for /usr/bin/ansible
#module_name = command
缺点:不支持管道,没法批量执行命令;
[root@ansible-server ~]# ansible web_servers -m command -a 'ip addr show dev ens33'
shell模块:
shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理,shell模块支持管道与重定向等符号;所以,我们在终端输入的各种命令方式,都可以使用。
[root@ansible-server ~]# ansible -i /etc/ansible/hosts web_servers -m shell -a "free -m | grep 'Mem'"
注:但是我们自己定义在/etc/profile或~/.bash_profile中的环境变量,shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句
对shell模块的使用可以分成两块:
1) 如果待执行的语句少,可以直接写在一句话中:
例如:在192.168.10.5上部署java环境
[root@node01 ~]# tar zxf jdk-8u171-linux-x64.tar.gz -C /usr/local/
[root@node01 ~]# vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@node01 ~]# source /etc/profile
[root@node01 ~]# java -version
[root@ansible-server ~]# ansible 192.168.10.5 -m shell -a "java -version"
失败的原因是不能加载/etc/profile中定义的java环境变量。
[root@ansible-server ~]# ansible 192.168.10.5 -m shell -a "source /etc/profile && java -version"
2) 通过shell模块执行脚本
利用shell执行脚本,需要以下几个步骤
第一个步骤:编写一个脚本
第二个步骤:将脚本发送到远程主机
第三个步骤:将脚本权限进行修改(添加执行权限)
第四个步骤:运行ansible命令执行脚本
1、第一个步骤:编写一个脚本
例如:执行检查磁盘脚本,内容如下:
[root@ansible-server ~]# vim disk_check.sh
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
echo $basedir
diskmax=10 # 磁盘的阈值
function check_max(){
local disk_size=$1
if [ $disk_size -ge $diskmax ]
then
echo "unhealth"
else
echo "health"
fi
}
function check_disk_info(){
df -h | grep "^/dev" | grep -v "/dev/sr0" | awk '{print $1,$5}' | cut -d '%' -f 1 | while read disk_name disk_size
do
echo ""
echo "disk_name=$disk_name,disk_size=$disk_size%"
check_max $disk_size
done
}
check_disk_info
说明:
dirname命令可以取给定路径的目录部分(strip non-directory suffix from file name)。这个命令很少直接在shell命令行中使用,一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去。
Local命令一般用于shell内局部变量的定义,多使用在函数内部
2、第二个步骤:将脚本发送到远程主机
拷贝脚本之前,先在远程上创建好准备拷贝过去的文件目录 ,其中远程创建文件目录有两种方式,操作如下:
方式一:shell命令方式
[root@ansible-server ~]# ansible web_servers -m shell -a "mkdir -p /work/ansible"
方式二:file模块执行创建文件夹
[root@ansible-server ~]# ansible web_servers -m file -a 'path=/work/file state=directory mode=0700'