1.1 shell
shell模块: 类似command模块升级版---万能模块
官方文档:https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
参数:
chdir 运行此命令之前先cd进入该目录
creates判断指定文件是否存在,如果存在,命令将不再运行。
removes判断指定文件是否存在,如果存在,执行后面的操作
free_form 输入一个符号规范的命令信息
实例1-1 chdir
1. [root@m01 ~]# ansible web01 -m shell -a "rm -f 1 chdir=/data/"
web01 | CHANGED | rc=0 >>
2. [root@web01 data]# ls
1
[root@web01 data]# ls
[root@web01 data]#
实例1-2 creates
[root@m01 ~]# ansible web01 -m shell -a "touch 1.txt chdir=/data/ creates=/data/1.txt"
web01 | CHANGED | rc=0 >>
[root@m01 ~]# ansible web01 -m shell -a "touch 1.txt chdir=/data/ creates=/data/1.txt"
web01 | SUCCESS | rc=0 >>
skipped, since /data/1.txt exists #文件已存在就不在执行touch命令
实例1-3 removes
[root@m01 ~]# ansible web01 -m shell -a "\rm -f /data/1.txt removes=/data/1.txt"
web01 | CHANGED | rc=0 >>
[root@m01 ~]# ansible web01 -m shell -a "\rm -f /data/1.txt removes=/data/1.txt"
web01 | SUCCESS | rc=0 >>
skipped, since /data/1.txt does not exist #文件不存在就不在执行 rm操作
1.2 template
template模块:主要用于将管理主机上的数据信息传送给多台主机
区别于copy该模块支持变量
官方文档:https://docs.ansible.com/ansible/latest/modules/template_module.html#template-module
参数:
backup(no* yes) : 默认数据复制到远程主机,会覆盖原有文件(yes复制时将源文件进行备份)
dest (required) :将数据复制到远程节点的路径信息
group : 文件数据复制到远程主机,设置文件属组用户信息
mode :文件数据复制到远程主机,设置数据的权限 #权限前加零0644 0755
owner : 文件数据复制到远程主机,设置文件属主用户信息
src :指定将本地管理主机的什么数据信息进行远程复制
实例1-1 变量说明
[root@m01 tmp]# ls
15.txt nfs01
[root@m01 tmp]# cat 15.txt
15 {{ item }}
[root@m01 tmp]# ansible nfs01 -m template --extra-vars="item=5" -a "dest=/data/ src=/tmp/15.txt "
nfs01 | CHANGED => { #定义变量为5
"changed": true,
[root@nfs01 data]# cat 15.txt #nfs01 下15.txt
15 5
1.3 copy
copy模块: 主要用于将管理主机上的数据信息传送给多台主机
copy模块在复制数据时,如果数据为软链接文件,会将链接指定源文件进行复制
官方文档:https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module
参数:
backup(no* yes) : 默认数据复制到远程主机,会覆盖原有文件(yes复制时将源文件进行备份)
content : 在文件中添加信息 #有内容的文件会被清空再写入信息
dest(required) :将数据复制到远程节点的路径信息
group : 文件数据复制到远程主机,设置文件属组用户信息
mode :文件数据复制到远程主机,设置数据的权限 #权限前加零0644 0755
owner : 文件数据复制到远程主机,设置文件属主用户信息
remote_src(no* yes): 如果设置为yes,表示将远程主机上的数据进行移动操作 #no* 默认为no
如果设置为no, 表示将管理主机上的数据进行分发操作 #不支持递归复制
src :指定将本地管理主机的什么数据信息进行远程复制
实例1-1 backup src
[root@web01 data]# ll #web01 /data下的内容
total 4
-rw-r--r-- 1 root root 7 Jan 23 16:11 11.txt
-rw-r--r-- 1 root root 0 Jan 23 15:52 1.txt
[root@m01 data]# ll #m01 /data下的内容
total 4
-rw-r--r-- 1 root root 4 Jan 23 16:12 11.txt
-rw-r--r-- 1 root root 0 Jan 23 15:50 1.txt
[root@m01 ~]# ansible web01 -m copy -a " src=/data/11.txt dest=/data/ backup=yes"
web01 | CHANGED => { #backup=yes
"backup_file": "/data/11.txt.7034.2019-01-23@16:12:52~",
"changed": true,
"checksum": "a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0",
"dest": "/data/11.txt",
"gid": 0,
"group": "root",
"md5sum": "ba1f2511fc30423bdbb183fe33f3dd0f",
"mode": "0644",
"owner": "root",
"size": 4,
"src": "/root/.ansible/tmp/ansible-tmp-1548231171.25-36281974398529/source",
"state": "file",
"uid": 0
}
[root@web01 data]# ls #web01 /data下内容
11. txt 11.txt.7034.2019-01-23@16:12:52~ 1.txt
#11.txt为m01复制过去的文件 #11.txt.7034.2019-01-23@16:12:52~为原来远程主机那个11.txt
#当远程主机上有同名文件时backup=yes 会把远程主机上的文件备份,当同名文件内容相同时不会再复制过去
实例1-2 content dest
[root@m01 ~]# ansible web01 -m copy -a "content=123456789 dest=/data/11.txt"
web01 | CHANGED => { #在目标文件中添加123456789的内容
"changed": true,
"checksum": "f7c3bc1d808e04732adf679965ccc34ca7ae3441",
"dest": "/data/11.txt",
"gid": 0,
"group": "root",
"md5sum": "25f9e794323b453885f5181f1b624d0b",
"mode": "0644",
"owner": "root",
"size": 9,
"src": "/root/.ansible/tmp/ansible-tmp-1548233198.82-218031705252404/source",
"state": "file",
"uid": 0
}X
[root@web01 data]# cat 11.txt
123456789[root@web01 data]#
实例1-3 group mode owner
[root@m01 data]# ll #测试文件原来属主,属组,权限
total 0
-rw-r--r-- 1 root root 0 Jan 23 17:31 15.txt
[root@m01 ~]# ansible web01 -m copy -a "src=/data/15.txt dest=/data/ mode=666 owner=oldboy group=oldboy" #修改测试文件属组属主权限为oldboy oldboy 666
web01 | CHANGED => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/data/15.txt",
"gid": 1000,
"group": "oldboy",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0666",
"owner": "oldboy",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1548235924.14-253659294482668/source",
"state": "file",
"uid": 1000
}
[root@web01 data]# ll ##测试文件复制到web01后的属主,属组,权限
total 0
-rw-rw-rw- 1 oldboy oldboy 0 Jan 23 17:32 15.txt
实例1-4 remote_src
[root@m01 ~]# ansible web01 -m copy -a "src=/data/1.txt dest=/data/ remote_src=no"
web01 | CHANGED => { #remote_src=no src=为m01上的路径
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/data/1.txt",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1548241564.22-144846621010863/source",
"state": "file",
"uid": 0
}
[root@web01 data]# ll
total 0
-rw-r--r-- 1 root root 0 Jan 23 17:36 14.txt
-rw-rw-rw- 1 oldboy oldboy 0 Jan 23 17:32 15.txt
-rw-r--r-- 1 root root 0 Jan 23 19:06 1.txt
[root@m01 ~]# ansible web01 -m copy -a "src=/data/17.txt dest=/tmp remote_src=yes"
web01 | CHANGED => { #remote_src=yes src为目标机路径即web01下/data/17.txt复制到/tmp下
"changed": true,
"checksum": "c4f9375f9834b4e7f0a528cc65c055702bf5f24a",
"dest": "/tmp/17.txt",
"gid": 0,
"group": "root",
"md5sum": "f447b20a7fcbf53a5d5be013ea0b15af",
"mode": "0644",
"owner": "root",
"size": 7,
"src": "/data/17.txt",
"state": "file",
"uid": 0
}
[root@web01 tmp]# ll
total 4
-rw-r--r-- 1 root root 7 Jan 23 19:34 17.txt
-rw-r--r-- 1 root root 0 Jan 23 19:36 18.txt
1.4 fetch
fetch模块:从远程主机拉取文件到管理端
官方文档:https://docs.ansible.com/ansible/latest/modules/fetch_module.html#fetch-module
参数:
dest(required): 将数据拉取到管理端的路径信息 目录后必须加/
src (required): 要获取的远程主机上的文件的路径信息;这必须是文件,而不是目录。
flat : 默认为no 假如拉取/data/15.txt 会以目标主机的hostname/data/15.txt的形式拉取过来
yes 假如拉取/data/15.txt 会将文件直接拉取到你指定的目录
实例1-1 flat说明
[root@m01 tmp]# ansible nfs01 -m fetch -a "dest=/tmp/ src=/data/15.txt" #默认flat=no
nfs01 | CHANGED => {
"changed": true, }
[root@m01 tmp]# ls
15. txt nfs01
[root@m01 tmp]# ansible nfs01 -m fetch -a "dest=/tmp/ src=/data/15.txt flat=yes" flat=yes
nfs01 | CHANGED => {
[root@m01 tmp]# ls
15.txt
1.5 file
file模块:实现创建/删除文件信息 对数据权限进行修改
官方文档:https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module
参数:
path(required) :将数据复制到远程节点的路径信息相当于dest
group : 文件数据复制到远程主机,设置文件属组用户信息
mode :文件数据复制到远程主机,设置数据的权限#权限前加零0644 0755
owner : 文件数据复制到远程主机,设置文件属主用户信息
src :指定将本地管理主机的什么数据信息进行远程复制
state : absent 将数据进行删除
directory 创建一个空目录信息可以递归创建目录
file 查看指定目录信息是否存在
touch 创建一个空文件信息
hard/link 创建链接文件
实例1-1 state
[root@m01 data]# ansible web01 -m file -a "src=/etc/hosts path=/data/hosts_link state=link"
web01 | CHANGED => { #state=link 给/etc/hosts创建一个软链接
"changed": true,
"dest": "/data/hosts_link",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 10,
"src": "/etc/hosts",
"state": "link",
"uid": 0
}
[root@m01 data]# ansible web01 -m file -a "src=/etc/hosts path=/data/hosts_hard state=hard"
web01 | CHANGED => { #state=hard 给/etc/hosts创建一个硬链接
"changed": true,
"dest": "/data/hosts_hard",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 159,
"src": "/etc/hosts",
"state": "hard",
"uid": 0
}
[root@web01 data]# ll
total 4
-rw-r--r-- 2 root root 159 Jan 13 15:50 hosts_hard
lrwxrwxrwx 1 root root 10 Jan 23 19:57 hosts_link -> /etc/hosts
[root@m01 data]# ansible web01 -m file -a "path=/data/16.txt state=touch"
web01 | CHANGED => { #state=touch 创建一个空文件
"changed": true,
"dest": "/data/16.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}
[root@web01 data]# ll
total 0
-rw-r--r-- 1 root root 0 Jan 23 20:30 16.txt
[root@m01 data]# ansible web01 -m file -a "path=/data/16 state=directory"
web01 | CHANGED => { #state=directory 创建一个空目录可以递归创建目录
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/data/16",
"size": 6,
"state": "directory",
"uid": 0
}
[root@m01 data]# ansible web01 -m file -a "path=/data/14.txt state=absent"
web01 | CHANGED => { #state=absent
"changed": true,
"path": "/data/14.txt",
"state": "absent"
}
[root@web01 data]# ls
14.txt
[root@web01 data]# ls
[root@web01 data]#
实例1-2 group owner mode
利用recurse参数可以实现递归修改目录中数据权限
但是目录如果有链接文件,无法对链接文件进行递归修改
[root@m01 data]# ansible web01 -m file -a "path=/data/15.txt group=oldboy owner=oldboy mode=666 state=touch"
web01 | CHANGED => {
"changed": true,
"dest": "/data/15.txt",
"gid": 1000,
"group": "oldboy",
"mode": "0666",
"owner": "oldboy",
"size": 0,
"state": "file",
"uid": 1000
}
[root@web01 data]# ll
total 0
-rw-rw-rw- 1 oldboy oldboy 0 Jan 23 20:53 15.txt
[root@m01 data]# ansible web01 -m file -a "path=/data/ group=oldboy owner=oldboy mode=666 recurse=yes"
web01 | CHANGED => { #利用recurse参数可以实现递归修改目录中数据权限
"changed": true,
"gid": 1000,
"group": "oldboy",
"mode": "0666",
"owner": "oldboy",
"path": "/data/",
"size": 16,
"state": "directory",
"uid": 1000
}
[root@web01 data]# ll
total 0
drwxr-xr-x 3 root root 16 Jan 23 20:55 12
[root@web01 data]# ll
total 0
drw-rw-rw- 3 oldboy oldboy 16 Jan 23 20:55 12
1.6 yum
官方文档:https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module
参数:
name 指定软件名称信息
state absent/removed 将软件进行卸载(慎用)
present/installed 将软件进行安装
latest 安装最新的软件 yum update
实例1-1
[root@m01 data]# ansible web01 -m yum -a "name=httpd-tools state=installed"
web01 | SUCCESS => { #为web01安装httpd-tools软件
"ansible_facts": {
"pkg_mgr": "yum"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"httpd-tools-2.4.6-88.el7.centos.x86_64 providing httpd-tools is already installed"
]
}
1.7 service
service模块 :用于管理服务运行状态
官方文档:https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module
参数:
enabled(no yes) 设置服务是否开机自启动如果参数不指定,原有服务开机自启动状态进行保留
name(required) 设置要启动/停止服务名称
state reloaded 平滑重启
restarted 重启
started 启动
stopped 停止
实例1-1 远程启动 cron定时任务服务
ansible web01 -m service -a "name=crond state=started enabled=yes"
1.8 mount
mount 模块:用于批量管理主机进行挂载操作
官方文档:https://docs.ansible.com/ansible/latest/modules/mount_module.html#mount-module
参数:
fstype 指定挂载的文件系统类型
opts 指定挂载的参数信息
path 定义一个挂载点信息
src 定义设备文件信息
state absent 会进行卸载,也会修改fatab文件信息
unmounted 会进行卸载,不会修改fstab文件
present 不会挂载,只会修改fstab文件
mounted 会进行挂载,会修改fstab文件
结论:
在进行挂载的时候,使用state=mounted
在进行卸载的时候,使用state=absent
实例1-1 实现远程批量挂载操作
ansible oldboy -m mount -a "src=172.16.1.31:/data/ path=/mnt fstype=nfs state=present"
以上信息只是在/etc/fstab文件中添加了配置信息,不会真正进行挂载
ansible oldboy -m mount -a "src=172.16.1.31:/data/ path=/mnt fstype=nfs state=mounted"
以上信息是在/etc/fstab文件中添加了配置信息,并且也会真正进行挂载
1.9 cron
cron 模块:定时任务模块
官方文档:https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module
参数:
minute/hour/day/month/weekday 和设置时间信息相关参数
job 和设置定时任务有关参数
name 设置定时任务注释信息
state absent 删除指定定时任务
disabled yes 将指定定时任务进行注释
no 取消注释
实例1-1 需求每隔5分钟同步一次时间
[root@m01 data]# ansible web01 -m cron -a "name='cron-01 ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null'"
web01 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"cron-01 ntpdate time"
]
}
[root@web01 data]# crontab -l
#Ansible: cron-01 ntpdate time
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
将定时任务注释掉
[root@m01 data]# ansible web01 -m cron -a "name='cron-01 ntpdate time' minute=*/5 job='/usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' disabled=yes" #disabled=yes 将定时任务注释掉
web01 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"cron-01 ntpdate time"
]
}
[root@web01 data]# crontab -l
#Ansible: cron-01 ntpdate time
#*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
1.10 group
group模块:远程批量创建用户组信息
官方文档:https://docs.ansible.com/ansible/latest/modules/group_module.html#group-module
参数:
gid 指定创建的组ID信息
name 指定创建组名称信息
state absent 删除指定的用户组
present 创建指定的用户组
实例1-1
01. 创建一个指定的用户组oldboy_55 gid=1055
ansible oldboy -m group -a "name=oldboy_56 gid=1056"
02. 删除一个指定的用户组oldboy_55 gid=1055
ansible oldboy -m group -a "name=oldboy_55 gid=1055 state=absent"
1.11 user
usr模块:远程批量创建用户信息
官方文档:https://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
参数:
name 指定用户名信息
uid 指定用户uid信息
group 指定用户主要属于哪个组
groups 指定用户属于哪个附加组信息
shell 指定是否能够登录
create_home 是否创建家目录信息
home 指定家目录创建在什么路径默认/home
password * 设置密码时不能使用明文方式,只能使用密文方式
可以给用户设置密码还可以给用户修改密码
实例1-1 生成密文密码的方式连接
方法1:ansible all -m debug -a "msg={{ '123456' | password_hash('sha512', 'abcd') }}"
[root@m01 data]# ansible web01 -m debug -a "msg={{ '123456' | password_hash('sha512', 'abcd') }}"
web01 | SUCCESS => { #查看密码123456的密文
"msg": "$6$abcd$BlbaPOqDDm3eVW.GrfRm4Vcuz4.0WgysdL5FY1CIn/4a5QwuySngbORfHwsHfXQERZejgHIflz1fJkKs82Iix."
}
方法2:pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
password: 请输入密码信息
实例1-2
01. 创建一个虚拟用户rsync -uid=777
ansible oldboy -m user -a "name=rsync uid=777 shell=/sbin/nologin create_home=no"
02. 创建一个普通用户olddog_01, 主要属于1055组(oldboy_55) 附加属于rsync 1056组
ansible oldboy -m user -a "name=olddog_01 group=1055 groups=rsync"
03. 创建一个普通用户 olddog_02 密码信息为 oldboy123
ansible oldboy -m user -a 'name=olddog_04 password=$6$oldboy$PJaUI4wpLh9bI2HiMnomGgtkVxhT/EUQLwn0dVXV6bGOzzXPlVimepElBrwh9JMSkjuna18OY8zy3OitR2peo/'
说明:创建密码时,需要注意-a后面参数使用单引号汇总为一个整体,一定不能使用双引号
1.12 debug
debug模块: 调试模块,用于在调试中输出信息
常用参数:
msg:调试输出的消息var:将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出verbosity:debug的级别(默认是0级,全部显示)
实例1-1 参数说明
[root@m01 playbook]# vim test03.yml
# var verbosity
- hosts: backup01
tasks:
- name: data
shell: date
register: result
- name: debug
debug: var=result.stdout verbosity=0 #只显示stdout输出
[root@m01 playbook]# ansible-playbook test03.yml
TASK [debug] **********************************************************************
ok: [backup01] => {
"result.stdout": "Mon Jan 28 10:39:51 CST 2019"
}
# msg
[root@m01 playbook]# cat test03.yml
- hosts: web01
tags: web01
tasks:
- name:
debug:
msg: "hello world"
[root@m01 playbook]# ansible-playbook -t web01 test03.yml
TASK [debug] **********************************************************************
ok: [web01] => {
"msg": "hello world"
}
1.13 unarchive
unarchive模块:从管理端选择文件后将其解包. 解压缩的功能
官方文档:https://docs.ansible.com/ansible/latest/modules/unarchive_module.html#unarchive-module
参数:
dest (required) :解压到远程主机的路径信息
src (required) :管理端需要解压的压缩包的路径信息
copy :默认为yes,当copy=yes,那么拷贝的文件是从ansible主机复制到远程主机上的
no,那么会在远程主机上寻找src源文件
mode :设置解压缩后的文件权限
实例1-1
[root@m01 tmp]# ansible nfs01 -m unarchive -a "dest=/data/ src=/tmp/1.tar.gz"
nfs01 | CHANGED => {
"changed": true,
[root@nfs01 data]# ls
tmp
1.14 ping
ping模块:用于确认和对象机器之间是否能够ping通,正常情况会返回pong
官方文档:https://docs.ansible.com/ansible/latest/modules/ping_module.html#ping-module
参数:
data :默认为no pong 数据返回的ping返回值。如果此参数设置为crash ,模块将导致异常。
实例1-1
[root@m01 tmp]# ansible nfs01 -m ping -a "data=crash" #设置为crash ,模块异常。
nfs01 | FAILED! => {
"changed": false,
"module_stderr": "Shared connection to 172.16.1.31 closed.\r\n",
"module_stdout": "Traceback (most recent call last):\r\n File
[root@m01 tmp]# ansible nfs01 -m ping #默认返回pong
nfs01 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@m01 tmp]# ansible nfs01 -m ping -a "data=haha" #设置返回值为haha
nfs01 | SUCCESS => {
"changed": false,
"ping": "haha"
}
1.15 selinux
selinux模块:用于配置SELinux状态,需要客户端安装libselinux-python。
官方文档:https://docs.ansible.com/ansible/latest/modules/selinux_module.html#selinux-module
参数:
conf : /etc/selinux/config SELinux配置文件的路径
policy : SELinux所使用的的策略,如targeted。若state不是disabled,该配置是必需的
state (required) : enforcing 强制模式。违反SELinux 规则的行为将被阻止并记录到日志中。permissive 宽容模式。违反SELinux 规则的行为只会记录到日志中。一般为调试用。
disabled 关闭selinux
实例1-1
[root@m01 tmp]# ansible nfs01 -m selinux -a "state=permissive policy=targeted"
[WARNING]: Reboot is required to set SELinux state to permissive
nfs01 | CHANGED => {
"changed": true,
"configfile": "/etc/selinux/config",
"msg": "Config SELinux state changed from 'enforcing' to 'permissive'", #修改selinux的配置文件
"policy": "targeted",
"reboot_required": true,
"state": "permissive"
}
[root@m01 tmp]# ansible nfs01 -m selinux -a "state=disabled"
nfs01 | CHANGED => {
"changed": true,
"configfile": "/etc/selinux/config",
"msg": "Config SELinux state changed from 'permissive' to 'disabled'",
"policy": "targeted",
"reboot_required": false,
"state": "disabled"
}
1.16 tempfile
tempfile模块:创建临时文件或目录
官方文档:https://docs.ansible.com/ansible/latest/modules/tempfile_module.html#tempfile-module
参数:
path :创建到远程主机的路径信息
prefix :默认为ansible 创建文件或目录的前缀名
suffix :创建文件或目录的后缀名
state :默认为file 创建文件
directory 创建目录
实例1-1
[root@m01 tmp]# ansible nfs01 -m tempfile -a "path=/data/ state=file suffix=.txt prefix=haha"
nfs01 | CHANGED => {
"changed": true,
"gid": 0,
[root@nfs01 data]# ls
hahafKobkG.txt