1.1、查看支持的模块
ansible-doc -l #查看模块
ansible-doc | grep wc -l #查看支持的模块个数
ansible --version #查看我们的ansible版本号
1.2、获取模块的帮助
ansible-doc 模块名 或者 ansible-doc -s 模块名 #获取指定模块帮助信息说明这里我们使用ansible-doc获取下command模块的使用
ansible-doc command
ansible-doc -s command
1.3、三个远程命令模块的帮助
1.3.1、command模块
command 模块可以帮助我i们在远程主机上执行命令
注:使用command 模块在远程主机中执行操作时,是不会经过shell处理的,在使用command时,如果需要执行“<”、">"、"|"、“;”、和 “&” 这些符号,可以参考后面的shell模块。还有一点需要注意在执行ansible 时,不加 -m 默认使用command,可以在/etc/ansible/ansible.cfg中修改。
缺点:不支持管道,没法批量执行命令
ansible web_server -m command -a "ip a"
1.3.2、shell模块
shell模块可以帮助我们在远程主机上执行命令。他与command 模块不同的时他是经过shell'解释器处理执行,所以他支持管道符号和重定向等符号。
ansible -m shell -a "free -m | grep Mem" web_server
注:但是我们自己定义在/etc/profile或~/.bash_profile中的环境变量,shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句
对shell模块的使用可以分为两块
1、如果待执行的语句少,可以直接写在一句话中
比如:在192.168.1.4上部署java环境
tar zxf jdk-8u171-linux-x64.tar.gz -C /usr/local/ #解压
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
source /etc/profile #重载profile
java -version #查看java版本
ansible -m shell -a "java -version" 192.168.1.4 #在管理端查看1.4的Java版本
失败的原因就是不能加载/etc/profile中定义的java环境变量
ansible -m shell -a "source /etc/profile && java -version" 192.168.1.4
2、通过shell模块执行脚本
利用shell执行脚本需要以下几个步骤
第一步:编写一个脚本
第二部:将脚本发送到被管理的远程主机
第三部:将脚本全年进行修改
第四步:运行ansible命令执行脚本
1、第一步:编写一个脚本
例如:执行检查磁盘脚本,内容如下
#!/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 命令可以取给定目录的目录部分
Local 命令一般用于shell内局部变量的定义,多用于函数内部
2、第二步:将脚本发送到远程主机
将脚本文件拷贝到指定的远程主机上其中远程建目录和文件有两种方式
方法一:shell命令方式
ansible -m shell -a "mkdir -p /work/ansible" web_server
方法二:file模块执行创建目录
3、第三步:将脚本发送到远程主机并将脚本权限进行修改
批量拷贝shell脚本到各个服务器
格式: ansible 主机组 -m copy -a "src=拷贝文件路径 dest=拷贝目前文件路径 mode=0755"
ansible -m copy -a "src=/root/check.sh dest=/woek/ansible mode=0755" web_server
说明:
copy模块:实现主控端向目标主机copy文件。
#src 主控端文件位置
#dest 被控端目标位置
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#mode 文件的权限设定(例如:755或0755都可以)
4、第四步:运行ansible命令执行脚本
总结:
1、command 模块和 shell 模块的区别时:shell 模块支持管道符等及脚本
2、shell模块在远程执行脚本,先在ansible管理端写一个脚本,再通过copy模块传到远端,然后再执行。但这样就涉及到两次ansible调用,对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的
1.3.3、script模块
script模块只能执行脚本,不能调用其他指令。但是script执行的是放在ansible管理端的脚本
script模块执行脚本只需要两步
第一步:编写脚本
第二步:运行ansible命令执行脚本
将刚才的脚本删除
ansible -m shell -a "rm -rf /woek/ansible/check.sh" web_server
总结:script和shell的区别就是一个是执行控制端的脚本,一个执行远程端的脚本
1.4、copy模块
主要是实现控制端项目标端拷贝文件或目录,类似与scp功能
copy常用的选项
backup:在覆盖之前将源文件备份,备份文件包括时间信息。有两个选项:yes|no
content:用于代替src。可以直接设定指定文件的值
dest:必须选。将源文件复制到远程主机的绝对路径
directory_mode:递归的设置目录的权限,默认为系统默认的权限
force:如果目标主机有该文件但是内容不一样,如果设置yes将直接覆盖源文件,如果设置no则不覆盖源文件,只有在目标主机没有该文件的时候才复制。默认是yes
src:要复制到远程主机的文件在本地的地址,可以是绝对路径也可以是相对路径,如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync
1.4.1、copy模块应用案例
1、使用src,吧ansible主机上的/etc/hosts文件复制到主机组中的机器的/tmp目录下
ansible-m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=640 bakeup=yes" web_server
#src 主控端文件位置
#dest 被控端目标位置
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#mode 文件的权限设定
#backup=yes 如果目标位置存在同名的文件,在覆盖之前将原文件备份
查看主机是否复制成功
2、使用content
anisble -m copy -a "content='hoell ansible\nyou are clever!\n" dest=/tmp/ansible.txt" web_server
查看是否成功
1.5、file模块
file模块主要用于远程主机上的文件操作,如修改文件属性和创建文件、目录、符号链接等,file模块包含如下选项
force:需要在两种情况下强制创建软连接,一种源文件不存在但是之后会创建的情况下,另一种是目标软连接已经存在,需要先取消之前的软连接,然后创建新的连接,有两个选项:yes|no
group:定义文件/目录属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:不是用于创建文件,而是检查文件是否存在,主要用于检查文件是否存在的应用场景。
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
1.5.1、file模块应用案例
1、修改4、5上/tmp/hosts文件权限为777
查看文件权限
2、将4、5上的/tmp/hosts文件创建软连接到/opt下
查看软连接
删除软连接
3、创建文件或目录
创建目录如果它不存在
ansible -m file -a "path=/tmp/file1 state=directiry" web_server
创建空文件
1.6、ping模块
测试连通性,没有参数。通过显示pong
1.7、yum 模块
yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。
常用参数:
name参数:必须参数,用于指定需要管理的软件包,比如 nginx。
state参数:用于指定软件包的状态 ,默认值为present,表示确保软件包已经安装,除了present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。
disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。
update_cache参数:是否更新缓存,默认值时no
enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。
enablerepo 参数和 disablerepo 参数可以同时使用。
1.6.1、yum模块应用案例
4,5两台主机安装httpd软件(4,5主机需要配置repo文件,指向yum源)
1.7、service模块
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等。
service模块详解:
name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
runlevel参数:服务启动级别
arguments参数:服务命令行参数传递
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
1.7.1、service模块案例
开启httpd服务并设置为开机自启
ansible -m service -a "enabled=yes name=httpd state=started" web_server
重启httpd服务
ansible -m serice -a "name=httpd state=restarted" wed_server
查看 httpd状态
1.8、user模块
user模块可以帮助我们管理远程主机上的用户,比如创建用户,修改用户、删除用户、为用户创建密钥等操作
常见参数
name参数:必须参数,用于指定要操作的用户名称。
group参数:此参数用于指定用户所在的基本组。
gourps参数:此参数用于指定用户所在的附加组。注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖。
append参数:如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将 append 设置为 yes,表示追加附加组到现有的附加组设置,append 默认值为 no。
shell参数:此参数用于指定用户的默认 shell。
uid参数:此参数用于指定用户的 uid 号。
expires参数:此参数用于指定用户的过期时间,相当于设置 /etc/shadow 文件中的的第8列,比如,你想要设置用户的过期日期为2020年12月31日,那么你首先要获取到2020年12月31日的 unix 时间戳,使用命令 “date -d 2020-12-31 +%s” 获取到的时间戳为1609344000,所以,当设置 expires= 1609344000 时,表示用户的过期时间为2020年12月31日0点0分,设置成功后,查看远程主机的 /etc/shadow 文件,对应用户的第8八列的值将变成18627(表示1970年1月1日到2020年12月31日的天数,unix 时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在 Linux 和 FreeBSD 系统中使用。
comment参数:此参数用于指定用户的注释信息。
state参数:此参数用于指定用户是否存在于远程主机中,可选值有 present、absent,默认值为 present,表示用户需要存在,当设置为 absent 时表示删除用户。
remove参数:当 state 的值设置为 absent 时,表示要删除远程主机中的用户。但是在删除用户时,不会删除用户的家目录等信息,这是因为 remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录。当 state=absent 并且 remove=yes 时,相当于执行 “userdel -r” 命令。
password参数:此参数用于指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于 /etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串
输入上述命令后,即可得到明文密码123456对应的加密字符串
update_password参数:此参数有两个值可选,always 和 on_create,当此参数的值设置为always 时表示,如果 password 参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为 always,但是当此参数设置为 on_create 时,on_create只为新用户设置密码。
generate_ssh_key参数:此参数默认值为 no,如果设置为 yes,表示为对应的用户生成 ssh 密钥对,默认在用户家目录的 ./ssh 目录中生成名为 id_rsa 的私钥和名为 id_rsa.pub 的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作)
1.8.1、user模块案例
1、创建用户berry,登录shell为/sbin/onlogin
ansible -m shell -a "grep '\<berry>\" /etc/passwd'
3、创建一个用户,指定用户 密码
1.9、group模块
group模块可以帮助我们管理远程主机上的组
常用参数
name参数:必须参数,用于指定要操作的组名称。
state参数:用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组。
gid参数:用于指定组的gid
1.9.1、group模块案例
在4、5、主机中创建名为testgroup的组
删除testgroup组
ansible -m group -a "name=testgroup state=sbsent" web_server
删除成功的前提是不能有用户吧被删除的组当成基本组。
1.10、fetch模块
从远程主机拉文件到本地
实例:从1.4、主机上拉取文件/etc/hosts到ansible本地的/tmp目录
说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径