目录
1、查看支持的模块
2、获取模块的帮助
3、3个远程命令模块的区别
3.1、command模块
3.2、shell模块
3.3、script模块
4、copy模块
4.1、 copy模块应用案例
5、file模块
5.1、file模块应用案例
6、ping模块
7、yum模块
7.1、yum模块应用案例
8、service模块
8.1、service模块案例
8.2、查看httpd状态
9、user模块
9.1、user模块案例
10、fetch模块
11、group模块
11.1、group模块案例
[root@cong11 ~]# ansible-doc -l
[root@cong11 ~]# ansible-doc -l | wc -l #查看支持的模块个数
[root@cong11 ~]# ansible --version #查看我们的ansible版本号
ansible-doc 模块名 或者ansible-doc -s 模块名 #获取指定模块帮助信息说明
这里我们使用ansible-doc获取下command模块的使用方式。
[root@cong11 ~]# ansible-doc command
[root@cong11 ~]# ansible-doc -s command
command 模块可以帮助我们在远程主机上执行命令。
注意:使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”, “|”, “;” 和 “&” 这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。
shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理,shell模块支持管道与重定向等符号;所以,我们在终端输入的各种命令方式,都可以使用。
注:但是我们自己定义在/etc/profile或~/.bash_profile中的环境变量,shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句
script只能执行脚本,不能调用其他指令,但是script执行的是存放在ansbile管理端上的脚本。script模块跟上面类似,但执行脚本只要两步
第一个步骤:编写一个脚本
第二个步骤:运行ansible命令执行脚本
使用script模块可以在本地写一个脚本,在远程服务器上执行:
在ansible管理端编写一个脚本,这里还是使用上面的test.sh脚本为例:
总结:script和shell的区别是一个执行控制端的脚本,一个执行远程端的脚本。
实现主控端向目标主机拷贝文件或目录,类似scp功能
copy模块常用选项:
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代"src",可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归的设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
例1:使用src,把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
[root@cong11 ~]# ansible web_servers -m copy -a 'src=/etc/hosts dest=/tmp/ owner=root group=root mode=640 backup=yes'
说明:
#src 主控端文件位置(源文件地址)
#dest 被控端目标位置(目标地址)
#owner 文件复制过去后的所有者
#group 文件复制过去后的所属组
#content 将指定内容覆盖写入到目标主机文件中
#force=no 当主控端拷贝的文件名和目标名一致,但是内容不一致,放弃拷贝
#force=yes 当主控端拷贝的文件名和目标名一致,但是内容不一致,则进行覆盖
#mode 文件的权限设定
#backup=yes 如果目标位置存在同名的文件,在覆盖之前将原文件备份
192.168.121.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信息
}
192.168.121.12 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts",
"gid": 0,
"group": "root",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"mode": "0640",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 158,
"src": "/root/.ansible/tmp/ansible-tmp-1571668045.63-176379773679750/source",
"state": "file",
"uid": 0
}
查看目标主机是否复制成功
[root@cong11 ~]# ansible web_servers -m shell -a "ls -l /tmp/hosts"
例2:使用content将内容写入文件
[root@cong11 ~]# ansible web_servers -m copy -a 'content="Hello ansible\nyou are clever!\n" dest=/tmp/ansible.txt'
目标主机结果如下图:
注:如果目标主机没有该文件则会新建
file模块主要用于远程主机上的文件操作,如修改文件属性(权限、属主、属组)和创建文件、目录、符号链接等,file模块包含如下选项:
force:需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归的设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,创建目录
file:不是用于创建文件,而是检查文件是否存在,主要用于检查文件是否存在的应用场景。
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
例1:修改12,13上/tmp/hosts文件权限为777
[root@cong11 ~]# ansible web_servers -m file -a "path=/tmp/hosts mode=777"
查看文件权限
[root@cong12 ~]# ll /tmp/hosts
例2:将12,13上的/tmp/hosts文件创建符号链接到/opt目录下
[root@cong11 ~]# ansible web_servers -m file -a "src=/tmp/hosts dest=/opt/hosts state=link"
查看创建的符号链接
[root@cong12 ~]# ll /opt/hosts
删除链接文件
[root@cong11 ~]# ansible web_servers -m file -a "path=/opt/hosts state=absent"
例3:创建文件或目录
创建目录,如果它不存在
[root@cong11 ~]# ansible web_servers -m file -a "path=/tmp/dir1 state=directory"
touch创建空文件
[root@cong11 ~]# ansible web_servers -m file -a "path=/tmp/testfile1 state=touch"
测试连接可通性,没有参数。通的话返回pong。
[root@cong11 ~]# ansible web_servers -m ping
yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。
常用参数:
12,13两台主机安装httpd软件(12,13主机需要配置repo文件,指向yum源):
[root@cong11 ~]# ansible web_servers -m yum -a "name=httpd state=latest"
前往目标主机验证
[root@cong12 ~]# rpm -q httpd
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等。
service模块详解:
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
启动httpd服务并设置为开机自启
[root@cong11 ~]# ansible web_servers -m service -a "enabled=yes name=httpd state=started"
重启httpd服务
[root@cong11 ~]# ansible web_servers -m service -a "name=httpd state=restarted"
[root@cong11 ~]# ansible web_servers -m shell -a "ps -ef | grep httpd | grep -v 'grep'"
user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
常用参数
输入上述命令后,即可得到明文密码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:创建用户berry,登录shell为/sbin/nologin
[root@cong11 ~]# ansible web_servers -m user -a "name=berry shell=/sbin/nologin state=present"
[root@cong11 ~]# ansible web_servers -m shell -a 'grep "\" /etc/passwd'
例2:删除刚才创建的用户berry及其宿主目录
[root@cong11 ~]# ansible web_servers -m user -a "name=berry remove=yes state=absent"
[root@cong11 ~]# ansible web_servers -m shell -a 'grep "\" /etc/passwd'
注:注意该用户下不能有任何进程,否则会报错如下红色部分
例3:创建一个用户,指定用户密码
使用python命令行生成密码的加密字符串
复制生成的加密字符串作为password的值
ansible web_servers -m user -a 'name=testops password="$6$Uwz.LOIcCbgZipq0$.P7EFqXKFvBdr.Rky4qOsRjTl1uMKZSVfYChLzL2kM5i78TpozD7jxwjyMhaInDxQ7iEOUL1lwfD0tiec6FDN/"'
从远程主机拉取文件到本地
示例:从192.168.121.12主机上拉取文件/etc/hosts到ansible本地的/tmp目录
[root@cong11 ~]# ansible 192.168.121.12 -m fetch -a 'src=/etc/hosts dest=/tmp'
说明:fetch使用很简单,src和dest,dest只要指定一个接收目录,默认会在后面加上远程主机及src的路径。
group 模块可以帮助我们管理远程主机上的组。
常用参数
例1:.在12,13主机中创建名为testgroup的组
[root@cong11 ~]# ansible web_servers -m group -a "name=testgroup"
例2:删除 12,13主机中存在名为 testgroup的组
[root@cong11 ~]# ansible web_servers -m group -a 'name=testgroup state=absent'
删除成功的前提是不能有用户把被删除的组当成基本组。会报如下错误: