Ansible常用模块
环境
环境:配置两台dbservers,都已配置了ssh免密登录
[dbservers]
192.168.31.16
192.168.31.18
[root@mysql-01 data]
[root@mysql-01 data]
命令模式
ansible <host-pattern> [-f forks] [-m module_name][-a args]
root@mysql-01 data]
hosts (2):
192.168.31.16
192.168.31.18
基本模块module_name
command、shell、doc、file、copy、add、script、doc
```
```shell
#doc模块
[root@mysql-01 data]# ansible-doc yum -s
```
```shell
[root@mysql-01 ansible]# ansible dbservers -m ping
[root@mysql-01 ansible]# ansible dbservers -m shell -a 'ls /etc/hosts'
#command模块是默认模式。如下removes=表示如果不存在该文件,则不执行。如果为creates=则表示如果存在该文件则执行。
[root@mysql-01 ansible]# ansible all -a 'removes=/etc/fs cat /etc/hosts'
192.168.31.16 | SUCCESS | rc=0 >>
skipped, since /etc/fs does not exist
192.168.31.18 | SUCCESS | rc=0 >>
skipped, since /etc/fs does not exist
#使用chdir参数,进入etc目录后查看hosts文件
[root@mysql-01 ansible]# ansible all -a 'chdir=/etc/ cat hosts'
192.168.31.18 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.16 mysql-01
192.168.31.17 jenkins-git
192.168.31.18 mysql-02
192.168.31.16 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.16 mysql-01
192.168.31.17 jenkins-git
192.168.31.18 mysql-02
```
###### file模块
```shell
#file模块
##通过state参数指定对文件的操作,如创建
[root@mysql-01 ansible]# ansible all -m file -a 'name=/data/ansible/f3 state=touch'
[root@mysql-01 ansible]# ansible all -m shell -a 'ls /data/ansible/f3'
192.168.31.16 | CHANGED | rc=0 >>
/data/ansible/f3
192.168.31.18 | CHANGED | rc=0 >>
/data/ansible/f3
##通过absent参数删除文件
[root@mysql-01 ansible]# ansible all -m file -a 'name=/data/ansible/f3 state=absent'
##通过directory参数创建文件夹
[root@mysql-01 ansible]# ansible all -m file -a 'name=/data/dir1 state=directory'
##通过link参数创建软链接
[root@mysql-01 data]# ansible all -m file -a 'src=/data/ansible dest=/data/ansible.link state=link'
```
###### hostname模块
```shell
#hostname模块
##通过name参数配置目标主机主机名,会立即生效且永久修改
[root@mysql-01 data]# ansible 192.168.31.18 -m hostname -a 'name=mysql-02'
```
###### cron模块
```shell
#cron模块
##启用cron
[root@mysql-01 data]# ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall warning" name=warncron'
[root@mysql-01 data]# crontab -l
#Ansible: warncron
* * * * 1,3,5 /usr/bin/wall warning
#停用cron,需要带job、name参数,通过disabled=true控制,要再次启用,使用disabled=false即可。也可通过state=absent参数完全删除该cron
[root@mysql-01 data]# ansible all -m cron -a 'disabled=true job="/usr/bin/wall warning" name=warncron'
```
###### copy、fetch模块
```shell
#copy模块,将本地文件复制到远端且设置备份。另外可以设置mode=644 owner=wang等参数。复制文件来源可为本地文件或者content="hello world!"此类由content参数指定的内容。
[root@mysql-01 ansible]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts backup=yes'
#fetch模块,从远端抓取文件到本地,会针对每个主机在本地创建相关目录。
[root@mysql-01 ansible]# ansible db* -m fetch -a 'src=/var/log/messages dest=/data/ansible'
192.168.31.16 | CHANGED => {
"changed": true,
"checksum": "748f4307920e2eb194e5dde46a45f40b9e76c00a",
"dest": "/data/ansible/192.168.31.16/var/log/messages",
"md5sum": "1c94a98fc8065919c44e1f0a2f0e43ce",
"remote_checksum": "748f4307920e2eb194e5dde46a45f40b9e76c00a",
"remote_md5sum": null
}
192.168.31.18 | CHANGED => {
"changed": true,
"checksum": "87e4095e5f908fa96f0b482dcba57a63a0539021",
"dest": "/data/ansible/192.168.31.18/var/log/messages",
"md5sum": "31cb39af78c640b6290f1f3e826f0dc4",
"remote_checksum": "87e4095e5f908fa96f0b482dcba57a63a0539021",
"remote_md5sum": null
}
[root@mysql-01 ansible]# ls
192.168.31.16 192.168.31.18
[root@mysql-01 ansible]# tree
.
├── 192.168.31.16
│ └── var
│ └── log
│ └── messages
└── 192.168.31.18
└── var
└── log
└── messages
```
###### shell模块
```shell
#command模块无法处理管道等命令,一般用shell模式
[root@mysql-01 ansible]# ansible all -m shell -a "echo $HOSTNAME"
```
###### script模块
```shell
#script模块在远端运行本地脚本
[root@mysql-01 ansible]# ansible all -m script -a './hostname.sh'
192.168.31.16 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.31.16 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.31.16 closed."
],
"stdout": "mysql-01\r\n",
"stdout_lines": [
"mysql-01"
]
}
192.168.31.18 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.31.18 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.31.18 closed."
],
"stdout": "mysql-02\r\n",
"stdout_lines": [
"mysql-02"
]
}
```
###### yum模块
```shell
#yum模块,通过name参数指定安装包,安装多个包在name参数后用“,”隔开即可。
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'name=vsftpd'
##查看已安装的
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'list=installed'
##卸载
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'name=vsftpd state=absent'
##使用本地已有的包,挂载了光盘。
[root@mysql-01 data]# mkdir -p /mnt/cdrom
[root@mysql-01 data]# mount /dev/cdrom /mnt/cdrom/
[root@mysql-01 data]# ll /mnt/cdrom/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm
-rw-rw-r-- 3 root root 175944 10月 15 2020 /mnt/cdrom/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm
#通过copy模块拷贝到远程主机
[root@mysql-01 data]# ansible 192.168.31.18 -m copy -a 'src=/mnt/cdrom/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm dest=/data/ansible'
#通过name指定本地rpm包安装
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'name=/data/ansible/vsftpd-3.0.2-28.el7.x86_64.rpm'
#更新缓存,避免yum安装缓存问题,以下为安装dstat工具
[root@mysql-01 data]# ansible 192.168.31.18 -m yum -a 'update_cache=yes name=dstat'
```
###### service模块管理服务
```shell
#设置vsftpd服务启动且开机自启动。state状态可设置为stopped,restarted
[root@mysql-01 data]# ansible 192.168.31.18 -m service -a 'name=vsftpd state=started enabled=yes'
```
###### user模块管理用户
```shell
#创建nginx用户,指定其所属组等信息。还可指定uid,home目录等。通过state=absent参数即可删除用户等信息
[root@mysql-01 data]# ansible 192.168.31.18 -m user -a 'name=nginx shell=/sbin/nologin system=yes groups=root,man'
#查看创建的用户的用户信息
[root@mysql-01 data]# ansible 192.168.31.18 -a 'getent passwd nginx'
192.168.31.18 | CHANGED | rc=0 >>
nginx:x:997:995::/home/nginx:/sbin/nologin
```
###### group模块管理组
```shell
#创建组,也可指定name参数后通过state=absent删除
[root@mysql-01 data]# ansible 192.168.31.18 -m group -a 'name=nginx system=yes gid=80'
```