Ansible小结 (五) 常用模块

Posted by Yancy on 2016-03-09

ansible命令总结使用:

在上一篇中介绍了commands部分模块,本篇承接上篇介绍下常用的模块。根据官方的分类,将模块按功能分类为:

1
云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块

具体可以参看官方页面

这里从官方分类的模块里选择最常用的一些模块进行介绍(commands模块上一篇已经介绍,这里不再提)。

一、ping模块

测试主机是否是通的,用法很简单,不涉及参数:
1
2
3
4
5
6
7
ansible tomcat_B1 -m ping
[root@ansible ~]# ansible tomcat_C1 -m ping
192.168.1.177 | SUCCESS => {
"changed": false,
"ping": "pong"
}

二、setup模块

setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。setup模块下经常使用的一个参数是filter参数,具体使用示例如下(由于输出结果较多,这里只列命令不写结果):

查看主机内存信息
1
[root@ansible ~]# ansible tomcat_C1 -m setup -a 'filter=ansible_*_mb'
查看地接口为eth0-2的网卡信息
1
2
[root@ansible ~]# ansible tomcat_C1 -m setup -a 'filter=ansible_eth[0-2]'
[root@ansible ~]# ansible all -m setup --tree /tmp/facts

//将所有主机的信息输入到/tmp/facts目录下,每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)

三、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
2
3
4
ansible test -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
ansible test -m file -a "path=/tmp/fstab state=absent"
ansible test -m file -a "path=/tmp/test state=touch"
ansible test -m file -a "path=/tmp/test state=directory" ansible test -m file -a "path=/tmp/testd state=directory owner=root group=root mode=777"

四、copy模块

复制文件到远程主机,copy模块包含如下选项:
  • backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
  • content:用于替代”src”,可以直接设定指定文件的值
  • dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
  • directory_mode:递归的设定目录的权限,默认为系统默认权限
  • force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
  • others:所有的file模块里的选项都可以在这里使用
  • src:要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/“来结尾,则只复制目录里的内容,如果没有使用”/“来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
  • validate:The validation command to run before copying into place. The path to the file to validate is passed in via ‘%s’ which must be present as in the visudo example below.

示例如下:

1
2
3
ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644"
ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"
ansible test -m copy -a "src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'"

这里在举个例子:

目的:把主控端/opt/目录下面logstash.tar.gz文件拷贝到到指定节点上/srv/下面
命令:ansible cluster1:children -m copy -a "src=/opt/logstash.tar.gz dest=/srv/. owner=root group=root mode=644"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@salt ~]# ansible cluster1:children -m copy -a "src=/opt/logstash.tar.gz dest=/srv/. 10.47.59.190 | SUCCESS => {
"changed": true,
"checksum": "9d15ea324f39d08cb379f59ffee9fa7ad2a62ab8",
"dest": "/srv/./logstash.tar.gz",
"gid": 0,
"group": "root",
"md5sum": "c151602e79a336ca363928dea68d2567",
"mode": "0644",
"owner": "root",
"size": 84431108,
"src": "/root/.ansible/tmp/ansible-tmp-1483939085.93-201327709717575/source",
"state": "file",
"uid": 0
}
10.47.106.105 | SUCCESS => {
"changed": true,
"checksum": "9d15ea324f39d08cb379f59ffee9fa7ad2a62ab8",
"dest": "/srv/./logstash.tar.gz",
"gid": 0,
"group": "root",
"md5sum": "c151602e79a336ca363928dea68d2567",
"mode": "0644",
"owner": "root",
"size": 84431108,
"src": "/root/.ansible/tmp/ansible-tmp-1483939088.11-46151538408374/source",
"state": "file",
"uid": 0
}

批量控制解压文件

批量解压命令:

ansible cluster1:children -m shell -a "tar -zxvf /srv/logstash.tar.gz" -C /srv/.

五、yum模块

yum安装使用:

使用yum包管理器来管理软件包,其选项有:

  • config_file:yum的配置文件
  • disable_gpg_check:关闭gpg_check
  • disablerepo:不启用某个源
  • enablerepo:启用某个源
  • name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
    state:状态(present,absent,latest)

示例如下:

1
ansible tomcat_D1 -s -m yum -a "name=wget state=latest"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@ansible playbook]# ansible tomcat_D1 -s -C -m yum -a "name=kernel state=latest"
192.168.1.178 | SUCCESS => {
"changed": true,
"changes": {
"installed": [],
"updated": [
[
"kernel",
"2.6.32-642.4.2.el6.x86_64 from updates"
]
]
},
"msg": "",
"rc": 0,
"results": []
}

六 service模块

用于管理服务 该模块包含如下选项:

  • arguments:给命令行提供一些选项
  • enabled:是否开机启动 yes|no name:必选项,服务名称
  • pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行
  • runlevel:运行级别
  • sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
  • state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

示例如下:

1
2
3
4
ansible test -m service -a "name=httpd state=started enabled=yes"
ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"
ansible cluster2:children -m service -a "name=logstash pattern=/etc/init.d/logstash state=started"

参考:http://www.361way.com/ansible-modules/4415.html

七 shell 模块

这里我写个例子:

批量更改组的机器的用户名密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@salt ansible]# ansible cluster1:children -m shell -a "echo "Ihaozhuo" | passwd --stdin "root" "
10.43.59.190 | SUCCESS | rc=0 >>
更改用户 root 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
10.23.2.106 | SUCCESS | rc=0 >>
更改用户 root 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
10.23.232.85 | SUCCESS | rc=0 >>
更改用户 root 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
10.23.232.131 | SUCCESS | rc=0 >>
更改用户 root 的密码 。
passwd: 所有的身份验证令牌已经成功更新。

查看分组上机器所有端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@salt ansible]# ansible zk1:children -m shell -a "netstat -ntulp"
10.37.238.75 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 12497/java
tcp 0 0 0.0.0.0:56521 0.0.0.0:* LISTEN 12497/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1251/sshd
tcp 0 0 0.0.0.0:4888 0.0.0.0:* LISTEN 12497/java
tcp 0 0 127.0.0.1:15770 0.0.0.0:* LISTEN 1434/aegis_quartz
udp 0 0 118.178.240.129:123 0.0.0.0:* 1262/ntpd
udp 0 0 10.27.238.75:123 0.0.0.0:* 1262/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1262/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1262/ntpd
10.37.100.200 | SUCCESS | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:58367 0.0.0.0:* LISTEN 11232/java
tcp 0 0 10.47.100.200:10050 0.0.0.0:* LISTEN 646/zabbix_agentd
tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 11232/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1243/sshd
tcp 0 0 0.0.0.0:4888 0.0.0.0:* LISTEN 11232/java
tcp 0 0 127.0.0.1:15770 0.0.0.0:* LISTEN 1436/aegis_quartz
udp 0 0 120.27.152.77:123 0.0.0.0:* 1254/ntpd
udp 0 0 10.47.100.200:123 0.0.0.0:* 1254/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1254/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1254/ntpd

shell 模块 可以用的最多。查看目录执行文件等等。

ansible修改线上服务器上的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ansible cluster1:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible cluster2:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible cluster3:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible zk1:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible kafka1:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible es1:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible ihaozhuo1:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "
ansible monitor1:children -m shell -a "echo "Ihaozhuo_b3314" | passwd --stdin "root" "

2、Ansible 总结举例常用模块学习

1
2
shell > ansible-doc -l # 列出 Ansible 支持的模块
shell > ansible-doc ping # 查看该模块帮助信息

远程命令模块( command / raw / script / shell )

command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持管道符。

例:

1
shell > ansible Client -m command -a "free -m" # 查看 Client 分组主机内存使用情况

raw模块 [类似于command模块、支持管道传递]

例:

1
ansible Client -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print \$2}' |awk -F: '{print \$2}'"

script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp + shell 组合。

例:

1
shell > ansible Client -m script -a "/home/test.sh 12 34" # 远程执行本地脚本

shell 的功能是执行远程主机上的 shell 脚本文件,支持管道符。

例:

1
shell > ansible Client -m shell -a "/home/test.sh" # 执行远程脚本

copy 模块(实现主控端向目标主机拷贝文件,类似于 scp 功能)

例:

1
2
shell > ansible Client -m copy -a "src=/home/test.sh desc=/tmp/ owner=root group=root mode=0755"
# 向 Client 组中主机拷贝 test.sh 到 /tmp 下,属主、组为 root ,权限为 0755

stat 模块(获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid 等信息)

例:

1
shell > ansible Client -m stat -a "path=/etc/syctl.conf"

get_url 模块(实现在远程主机下载指定 URL 到本地,支持 sha256sum 文件校验)

例:

1
shell > ansible Client -m get_utl -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"

yum 模块(软件包管理)

例:

1
shell > ansible Client -m yum -a "name=curl state=latest"

cron 模块(远程主机 crontab 配置)

例:

1
2
3
4
5
6
shell > ansible Client -m cron -a "name='check dirs' hour='5,2' job='ls -alh > /dev/null'"
效果:
# Ansible: check dirs
* 5,2 * * * ls -alh > /dev/null

mount 模块(远程主机分区挂载)

例:

1
shell > ansible Client -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext4 opts=ro state=present"

service 模块(远程主机系统服务管理)

例:

1
2
3
shell > ansible Client -m service -a "name=nginx state=stoped"
shell > ansible Client -m service -a "name=nginx state=restarted"
shell > ansible Client -m service -a "name=nginx state=reloaded"

user 服务模块(远程主机用户管理)

例:

1
2
shell > ansible Client -m user -a "name=wang comment='user wang'"
shell > ansible Client -m user -a "name=wang state=absent remove=yes" # 添加删除用户