目录
1.支持的模块
2.获取模块的帮助
3. 三个远程命令模块的区别
1)command
2)shell 模块
3)script 模块
4.copy 模块
copy模块应用案例
5.file模块
file 模块用于例子
6.ping模块
7.yum模块
yum模块应用例子
8.service 模块
Service 模块例子
9.user模块
user模块案例
10.group 模块
group 模块案例
11. fetch 模块
1.查看支持的模块
ansible-doc -l (小写 l) ansible-doc -l | wc -l #查看支持的模块个数 ansible --version #查看 ansible 版本号
2.获取模块的帮助
格式: ansible-doc 模块名 或者ansible-doc -s 模块名 #获取指定模块帮助信息说明
格式: ansible-doc 模块名 或者ansible-doc -s 模块名 #获取指定模块帮助信息说明
这里我使用ansible-doc获取下command模块的使用方式
ansible-doc command ansible-doc -s command
按q退出
3. 三个远程命令模块的区别
1)command
command模块可以帮助我们在远程主机执行命令
注意:使用 command模块在远程主机执行命令时,不会经过被连接端的 shell 解释器处理 ,
使用 command 模块执行命令时,执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>” “|” “;” 和 “&”,如想使用特殊符号可使用 shell 模块 。
在执行 ansible 时,不加 -m 默认使用 command,可以在/etc/ansible/ansible.cfg 中修改。
#module_name = command
缺点:不支持管道等特殊号,没法批量执行命令;
例:查看 web_server 组里主机里网卡信息
ansible web_server -m command -a 'ip addr show dev ens33' #缩写就是 ip a 命令
2)shell 模块
shell 模块也可以帮助我们在远程主机执行命令,与 command模块不同的是,shell模块在执行命令时,会经过远程主机上的/bin/sh程序处理,shell模块支持管道与重定向等符号,在终端输入的各种命令方式,都可以使用
使用shell模块查看 web_server组内存
ansible -i /etc/ansible/hosts web_server -m shell -a 'free -m | grep "Mem"'
注:我们自己定义在/etc/profile或~/.bash_profile中的环境变量,shell 模块由于没有加载,无法识别,如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句
对 shell 模块的使用可以分为两块:
1) 如果待执行的语句少,可以直接写在一句话中:
例如:在 192.168.1.12上部署 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
在 ansible 查看 jdk 的版本:
ansible nginx01 -m shell -a "java -version"
失败的原因是不能加载 /etc/profile中定义的java环境变量
ansible nginx01 -m shell -a "source /etc/profile && java -version"
2)通过shell脚本执行脚本
利用shell 执行脚本,需一下几个步骤:
一:编写一个脚本
二:将脚本发送到远程主机
三:将脚本权限进行修改(添加执行权限)
四:运行ansible命令执行脚本
第一个步骤编写一个脚本:
例如:执行检查磁盘脚本,内容如下:
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命令可以取给定路径的目录部分,把最后的要查询的文件部分前的路径取出,这个命令很少直接在shell命令行中使用,一般把它用在shell脚本中,用于取得脚本文件所在目录,然后将当前目录切换过去
例如: dirname /etc/ansible/hosts
第二个步骤:将脚本发送到远程主机:
拷贝脚本之前,先在远程上创建好准备拷贝过去的文件目录 ,其中远程创建文件目录有两种方式
方式一:shell命令方式
ansible nginx01 -m shell -a "mkdir -p /work/ansible"
方式二:file 模块执行创建文件夹
ansible nginx01 -m file -a "path=/work/file state=directory mode=700"
本环境采用方式一
第三个步骤: 将脚本发送到远程主机并将脚本权限进行修改(添加执行权限),批量拷贝 shell脚本到各台服务器
ansible 主机组 -m copy -a "src=拷贝的文件路径 dest=拷贝目标文件路径 mode=0755
ansible web_server -m copy -a "src=/root/disk_check.sh dest=/work/ansible mode=755"
说明:
copy模块:实现主控制端向目标主机 copy文件
#src 主控端文件位置
#dest 被控端目标位置
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#mode 文件的权限设定(例如:755或0755都可以)
第四个步骤: 运行ansible命令执行脚本
ansible web_server -m shell -a "/work/ansible/disk_check.sh"
ansible web_server -m shell -a "/work/ansible/disk_check.sh"
总结:
1.command模块和shell模块的区别时: shell模块支持“管道符”等及脚本。
2.shell模块在远程执行脚本,在 ansible 管理端写一个脚本,在通过 copy模块传到远端,在执行
但这样就涉及到两次ansible调用,我们可以使用 scipt模块
3)script 模块
script 模块只能执行脚本,不能调用其他指令,但是script执行的是存放在ansbile管理端上的脚本
只需两步:
1.编写脚本
2. 在 ansible 命令执行脚本
在被管理节点上将之前 copy过来的脚本删除,方便测试 script 模块执行脚本
ansible web_server -a "rm -rf /work/ansible/*"
测试script模块执行脚本:
ansible -i /etc/ansible/hosts web_server -m script -a "/root/disk_check.sh"
总结:script和shell的区别是一个执行控制端的脚本,一个执行远程端的脚本。
4.copy 模块
实现主控制端向目标主机拷贝文件或目录,类似 scp 功能
copy模块常用选项:
backup:在覆盖之前将原文件备份,备份文件包含时间信息,有两个选项:yes | no
content:用于替代 ”src“,可以直接设定指定文件的值
dest:必选项,要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode: 递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
src:要复制到远程主机的文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制,路径使用 "/"来结尾,则只复制目录里的内容,没有使用"/"来结尾,则包含目录在内的整个内容全部复制
copy模块应用案例
例1:使用 src,把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
ansible web_server -m copy -a 'src=/etc/hosts dest=/tmp/ owner=root group=root mode=640 backup=yes'
说明:
src 控制端文件位置
dest 被控制端目标位置
owner 文件复制过去的所有者
group 文件复制过去的属组
mode 文件的权限设定
backup=yes 如目标位置存在同名的文件,在覆盖前将原文件备份
192.168.1.13 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true, #是否对目标主机信息进行改变
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts", #显示目标路径信息
"gid": 0, #复制后的文件gid信息
"group": "root", #显示复制后文件属组信息
"md5sum": "54fb6627dbaa37721048e4549db3224d", #hosts文件的md5值
"mode": "0640", #显示复制后文件的权限信息
"owner": "root", #显示复制后文件的属主信息
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 158, #显示复制后文件的大小信息
"src": "/root/.ansible/tmp/ansible-tmp-1571668045.65-135407232805638/source",
"state": "file", #显示当前操作的是一个文件
"uid": 0 #显示复制后文件uid信息
}
查看主机是否复制成功
ansible web_server -m shell -a "ls -l /tmp/hosts"
例2:使用 content:
ansible web_server -m copy -a 'content="Hello ansiblenyou are clever!n" dest=/tmp/ansible.txt'
查看目标主机结果:
5.file模块
file模块主要用于远程主机上的文件操作,如修改文件属性(权限、属主、属组)和创建文件、目录、符号连接等,file 模块包含以下选项:
force:强制创建软连接,一种是源文件不存在但之后会建立的情况下,另一种是目标软连接已存在,有两个选项:yes|no
group:定义文件或目录的属组
mode:定义文件或目录的权限
owner:定义文件或目录的属主
recurse:递归的设置文件属性,只对目录有效
path:必选项,定义文件或目录的路径
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
state模块里的值
directory:如果目录不存在,创建目录
file: 不是用于创建文件,而是检查文件是否存在
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
file 模块用于例子
例1:修改 ngixn01,nginx02 上/tmp/hosts文件权限为777
查看文件权限
例2:将 nginx01,nginx02上的/tmp/hosts文件创建符号链接到/opt目录下
查看创建的符号连接
删除链接文件
ansible web_server -m file -a "path=/opt/hosts state=absent"
例3:创建文件或目录
创建目录。如果它不存在
ansible web_server -m file -a "path=/tmp/dir1 state=directory"
touch 创建空文件
ansible web_server -m file -a "path=/tmp/dir1/xaiolu state=touch"
6.ping模块
测试连接可通性,没有参数。 连接存活返回 pong 值
ansible web_server -m ping
7.yum模块
yum模块可以帮助我们在远程主机上通过yum源管理软件包
常用参数:
name参数:必须参数,用于指定需要管理的软件包,比如 nginx
state 参数:用于指定软件包状态,默认值为present,表示确保软件包已经安装,其他可用值有
installed、latest、absent、removed,其中installd与present等效,latest表示安装yum 最新版本,
absent 和 removed 等效,表示删除对应的软件包
disable_cache 参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置yes 表示禁用验证,即不验证包,直接安装
update_cache 参数:是否更新缓存,默认值为 no
eanblerepo 参数:用于指定安装软件包时临时启用 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源
disablerepo 参数:用于指定安装软件包时临时禁用的yum源。比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包
enablerepo 参数和 disablerepo 参数可以同时使用
yum模块应用例子
nginx01,nginx02 两台主机安装 httpd 软件(两台主机需要配置 repo 文件,指向yum源):
ansible web_server -m yum -a "name=httpd state=latest"
目标主机验证
8.service 模块
Ansible service 模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等
service模块详解:
name参数:此参数用于指定需要操作的服务名称,比如 ngixn,httpd
state 参数:此参数用于指定服务的状态,启动远程主机中的httpd,可以将 state的值设置为 started;如果想要停止远程主机中的服务,则可以将 state的值设置为 stopped;还有其他值:started、stopped、restarted(重启)、reloaded
enabled 参数:此参数用于指定是否将服务设置为开机自启,设置为 yes 表示将对应的服务设置为开机自启动,设置为 no 表示不会开机启动
runlevel 参数:服务启动级别
arguments 参数:服务命令行参数传递
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
Service 模块例子
启动 httpd 服务并设置为开机自启
ansible web_server -m server -m service -a "enabled=yes name=httpd state=started"
重启 httpd 服务器
ansible web_server -m service -a "name=httpd state=restarted"
查看httpd 状态
ansible web_server -m shell -a "ps -ef | grep httpd"
或者
#centOS7.x
ansible web_servers -a "systemctl status httpd"
ansible web_servers -a "systemctl is-enabled httpd"
#centOS7.x之前
ansible web_servers -a "service httpd status "
ansible web_servers -a "chkconfig --list httpd"
9.user模块
user模块可以帮助我们管理远程主机上的用户,如创建用户、修改用户、删除用户、为用户创建密钥对等操作
常用参数:
name 参数:必须参数,用于指定要操作的用户名称
group 参数: 此参数用于指定用户所在的基本组
groups 参数:此参数用于指定用户所在附加组,注意:如果用户已经存在并且已经拥有多个附加组,如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖
append 参数:如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,默认会覆盖原来的附加组设置,如不想覆盖,结合 append 参数, 将 append 设置为 yes,表示追加到现有的附加组设置,append 默认值为 no
shell 参数:用于指定用户的默认shell
uid 参数:此参数用于指定用户的 uid 号
expires 参数:此参数用于指定用户的过期时间,存在/etc/shadow 文件中的第8列
comment参数 :用于指定用户的注释信息
state 参数: 用于指定用户是否存在于远程主机中,可选值有 present 、absent,默认值为 present,表示用户需要存在,当设置为 absent 时表示删除用户
remove 参数:当state 的值设置为 absent时,表示要删除远程主机中的用户,不会删除用户的家目录等信息,remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录
password 参数:指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于 /etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串
输入上述命令后,即可得到明文密码123456对应的加密字符串。CTRL+D退出 python
update_password参数:当此参数的值设置为always 时表示,直接更新用户的密码,默认值即为 always,但是当此参数设置为 on_create 时,on_create只为新用户设置密码
generate_ssh_key参数:参数默认值为 no,如果设置为 yes,表示为对应的用户生成 ssh 密钥对,默认在用户家目录的 ./ssh 目录中生成名为 id_rsa 的私钥和名为 id_rsa.pub 的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作)
user模块案例
例1:创建用户 berry,登录 shell 为/sbin/nologin
ansible web_server -m user -a "name=berry shell=/sbin/nologin state=present"
ansible web_server -m shell -a 'grep "berry" /etc/passwd'
例2:删除刚才创建的用户 berry 及其宿主目录
ansible web_server -m user -a "name=berry remove=yes state=absent"
查看 berry 用户是否删除
注:注意该用户下不能有任何进程,否则会报错如下红色部分
例3:创建一个用户,指定用户密码
ansible web_server -m user -a 'name=testops password=$6$7Z1vkI4fbXUTWAqg$9sLsjuEF2PlBve1J95lOE/D06IbAzTOvs6bQH4/yeMcdd2IrNIDgJMP5J2PWN2wCmQg3dq7yJ.Le7A/i2lSTF/'
passwd使用之前生成的密文
查看测试:
我们可以看到被管理主机已创建用户"testops",并且密码为密文已写入"/etc/shadow"用户文件中,尝试用ssh命令使用testops用户登录被管理主机,登录成功
ansible web_server -m shell -a 'grep "testops" /etc/passwd'
ssh testops@192.168.1.12
10.group 模块
group 模块帮助我们管理远程主机的组
常用参数
name参数: 必须参数,用于指定要操作的组名称
state 参数: 用于指定组的状态,两个值可选,present,absent,默认为 present设置为absent 表示删除组
gid 参数: 用于指定组的 gid
group 模块案例
例1:在 nginx01 nginx02 主机中创建名为testgroup的组
ansible web_server -m group -a "name=testgroup"
例2:删除 nginx01 nginx02 主机名存在名为 testgroup的组
ansible web_server -m group -a "name=testgroup state=absent"
删除成功的前提是不能有用户把被删除的组当成基本组。会报如下错误:
11. fetch 模块
从远程主机拉取文件到本地
示例:从 nginx01 主机拉取文件 /etc/hosts 到ansible本地的/tmp目录
ansible nginx01 -m fetch -a "src=/etc/hosts dest=/tmp"
说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径.
以上是常用模块,至于其他模块的使用可通过官方模块列表获得:
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html



