三、Ansible常用模块介绍:

1、ping:测试被管控主机连通性

# ansible all --list-hosts

# ansible dbsrvs --list-hosts

查看参数:# ansible-doc -s ping

示例:测试所有被管控主机的连通性

# ansible all -m ping

备注:ping模块后无需加key=value格式的参数列表

2、hostname:设置主机名

查看参数:# ansible-doc -s hostname

示例:将被管控主机192.168.1.144的主机名修改为144

# ansible 192.168.1.144 -m hostname -a 'name=144'

3、group:增加或删除用户组

查看参数:# ansible-doc -s group

示例1:在所有被管控主机创建gid2000的用户组testgroup

# ansible all -m group -a 'gid=2000 name=testgroup state=present system=no'

示例2:删除testgroup用户组

# ansible all -m group -a 'gid=2000 name=testgroup state=absent'

4、user:管理用户账户

查看参数:# ansible-doc -s user

示例1:在所有被管控主机创建uid3000、基本组为mygroup、附加组为testgroupshell/bin/bash、注释为test的非系统用户testuser

# ansible all -m user -a 'uid=3000 group=mygroup groups=testgroup shell=/bin/bash comment=test system=no state=present name=testuser append=yes'

备注:

Ø  基本组mygroup和附加组testgroup必须事先存在

Ø  当不使用group设置基本组时,默认基本组与用户名相同

Ø  当不使用groups设置附加组时,默认附加组与用户名相同

Ø  可以设置多个附加组,用逗号隔开

Ø  append:默认为no,覆盖原来多个附加组,设置为yes,表示追加附加组到现有的附加组

示例2:删除用户testuser及其家目录

# ansible all -m user -a 'uid=3000 state=absent name=testuser remove=yes'

5、shell:在被管控主机执行命令

查看参数:# ansible-doc -s shell

示例:在所有被管控主机设置用户testuser的密码为123456

# ansible all -m shell -a 'echo 123456 | passwd --stdin testuser'

备注:shell模块后直接加需要执行的命令,而非key=value格式的参数列表

6、command:在被管控主机执行命令(无法执行管道、重定向等命令)

查看参数:# ansible-doc -s command

示例:查看所有被管控主机的网卡信息

# ansible all -m command -a 'ip a l'

备注:command模块后直接加需要执行的命令,而非key=value格式的参数列表

7、fetch:从被管控主机拉取文件至Ansible主机

查看参数:# ansible-doc -s fetch

示例:将被管控主机中的/software/test.txt文件复制至本地Ansible主机的/tmp目录中

# ansible all -m fetch -a 'src=/software/test.txt dest=/tmp/'

备注:

Ø  被管控主机中文件/software/test.txt必须事先存在

Ø  参数src中指定的必须是文件,不能是目录

Ø  如果被管控主机在hosts文件中定义了主机别名,则Ansible主机本地保存的文件路径为:/tmp/被管控主机别名/software/test.txt;如果直接定义了IP地址,则路径为:/tmp/被管控主机IP/software/test.txt

8、copy:将Ansible主机文件复制至被管控主机

查看参数:# ansible-doc -s copy

示例1:将本地文件/etc/fstab复制至所有被管控主机的/software目录下,且重命名为fstab.ansible,文件属主为testuser,属组为testgroup

# ansible all -m copy -a 'src=/etc/fstab dest=/software/fstab.ansible owner=testuser group=testgroup backup=yes'

备注:

Ø  如果参数src和参数dest均为文件,则参数dest的父目录/software必须事先存在

Ø  远程主机用户testuser和用户组testgroup必须事先存在

Ø  参数backup:创建一个包含时间戳信息的备份文件

示例2:将本地/tmp目录中的所有文件复制至所有被管控主机的/software目录下,且文件权限修改为600

# ansible all -m copy -a 'src=/tmp/ dest=/software mode=0600'

备注:

Ø  目录/software必须事先存在

Ø  权限的写法

  ²  0600

    ²  "600"

    ²  1.8版本开始,支持类似u+rwxu=rw,g=r,o=r

    ²  2.3版本开始,支持mode=preserve,表示将授予该文件与源文件相同的权限

示例3:将本地/tmp目录递归复制至所有被管控主机的/test目录下,且新创建的目录权限为755,目录和文件的属主均为testuser,属组均为testgroup

# ansible all -m copy -a 'src=/tmp dest=/test directory_mode=0755 owner=testuser group=testgroup'

备注:

Ø  如果远程主机中不存在/test目录,并且参数dest以“/”结尾或参数src是目录,则远程主机会自动创建/test目录

Ø  远程主机用户testuser和用户组testgroup必须事先存在

Ø  directory_mode:递归的设定目录的权限,默认为系统默认权限

示例4:在所有被管控主机的/tmp目录中新建属主为testuser、属组为testgroup、权限为600,且名称为test.txt的文件,内容为hello world

# ansible all -m copy -a 'content="hello world\n" dest=/tmp/test.txt owner=testuser group=testgroup mode=0600'

9、file:设置文件属性

查看参数:# ansible-doc -s file

示例1:在所有被管控主机的/tmp目录中创建名称为a.txt的文件

# ansible all -m file -a 'path=/tmp/a.txt state=touch'

示例2:在所有被管控主机的/tmp目录中创建a.txt的符号链接文件a.link

# ansible all -m file -a 'src=/tmp/a.txt path=/tmp/a.link state=link'

备注:参数src只应用于state=linkstate=hard

示例3:在所有被管控主机的/tmp目录中创建属主为testuser、属组为testgroup、权限为700,且名称为test的目录

# ansible all -m file -a 'path=/tmp/test owner=testuser group=testgroup mode=0700 state=directory'

示例4:在所有被管控主机的/tmp目录中删除test目录

# ansible all -m file -a 'path=/tmp/test state=absent'

10、cron:管理任务计划

查看参数:# ansible-doc -s cron

示例1:在所有被管控主机执行任务计划,要求每3分钟同步内网NTP服务器192.168.1.142

# ansible all -m cron -a 'minute=*/3 job="/usr/sbin/ntpdate 192.168.1.142 &> /dev/null" name=ntpdate user=root state=present backup=yes'

备注:

Ø  被管控主机需要先安装ntpdate软件包

Ø  如果时间单位(minutehourday等)设定的参数都未指定时,任务计划的时间默认设定为“* * * * *”,表示每分钟都会执行一次任务计划

Ø  参数backup:如果此参数的值设置为yes,那么当修改或者删除对应的任务计划时,会先对任务计划进行备份,然后再对任务计划进行修改或者删除,cron模块会在被管控主机的/tmp目录中创建备份文件,以crontab开头且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到

示例2:在所有被管控主机执行任务计划,要求以testuser用户身份、每月的4号和每周一至周三的上午10点输出一次Hello World

# ansible all -m cron -a 'minute=0 hour=10 day=4 month=* weekday=1-3 job="echo Hello World" name=echo user=testuser state=present'

备注:CentOS 7.6echo路径为:/usr/bin/echoCentOS 6.10echo路径为:/bin/echo

示例3:所有被管控主机删除名称为ntpdate的任务计划

# ansible all -m cron -a 'name=ntpdate state=absent'

示例4:所有被管控主机创建名称为“test special time”的任务计划,任务将在重启时执行,任务内容为输出test字符

# ansible all -m cron -a 'name="test special time" special_time=reboot job="echo test" state=present'

备注:参数special_time的可选值包括reboot(重启时)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)和hourly(每小时)

11、yum:使用yum包管理器管理软件包

查看参数:# ansible-doc -s yum

示例1:所有被管控主机以yum方式安装最新版本的httpdphp

# ansible all -m yum -a 'name=httpd,php state=latest'

备注:参数state的可选值包括安装(present=installedlatest)和卸载(absent=removed

示例2:被管控主机192.168.1.144中安装版本为1.12.2nginx

# ansible 192.168.1.144 -m yum -a 'name=nginx-1.12.2 state=present'

备注:CentOS 6.10 epel源中nginx的版本为1.10.2CentOS 7.6 epel源中nginx的版本为1.12.2

示例3:所有被管控主机安装/software目录下的rpm软件包

# ansible all -m yum -a 'name=/software/jdk-8u212-linux-x64.rpm state=present'

备注:rpm软件包在被管控主机,而非Ansible主机

示例4:所有被管控主机以yum方式删除php

# ansible all -m yum -a 'name=php state=absent'

示例5:所有被管控主机安装Development Tools软件包组:

# ansible all -m yum -a 'name="@Development Tools" state=present'

备注:使用命令# yum grouplist查看软件包组信息

12、service:管理服务

查看参数:# ansible-doc -s service

示例1:所有被管控主机启动httpd服务,并设置开机自启

# ansible all -m service -a 'name=httpd state=started enabled=yes'

备注:参数state的可选值包括startedstoppedrestartedreloaded

示例2:所有被管控主机停止httpd服务,并取消开机自启

# ansible all -m service -a 'name=httpd state=stopped enabled=no'

13、script:先将Ansible主机中的脚本传输至被管控主机,再执行

查看参数:# ansible-doc -s script

示例:所有被管控主机执行Ansible主机中的/scripts/test.sh脚本,目标是在所有被管控主机的/tmp目录中创建名称为script.txt的文件

# cat /scripts/test.sh

#!/bin/bash

touch script.txt

# ansible all -m script -a 'chdir=/tmp /scripts/test.sh'

备注:

Ø  脚本在Ansible主机中,而非被管控主机,无需手动复制脚本至被管控主机后再执行

Ø  script模块后直接加需要执行的脚本文件,可以无需加key=value格式的参数列表

14、setup:收集被管控主机信息

查看参数:# ansible-doc -s setup

示例1:收集所有被管控主机的所有信息

# ansible all -m setup | less

示例2:收集所有被管控主机的操作系统发行版信息

# ansible all -m setup -a 'filter=ansible_distribution'

备注:在playbook里经常会用到的一个参数gather_facts就与setup模块相关

15、template:将模板文件复制至被管控主机

查看参数:# ansible-doc -s template

示例:将redis模板文件redis.conf.j2复制至所有被管控主机

# ansible all -m template -a 'src=redis.conf.j2 dest=/etc/redis.conf owner=redis group=root mode=0640 backup=yes'

16、unarchive:将归档文件解压后复制至被管控主机指定路径

查看参数:# ansible-doc -s unarchive

示例:将Ansible主机中/software目录下的apache-tomcat-8.5.40.tar.gz解压至所有被管控主机的/usr/local目录下,无需复制apache-tomcat-8.5.40.tar.gz至所有被管控主机

# ansible all -m unarchive -a 'src=/software/apache-tomcat-8.5.40.tar.gz dest=/usr/local/'

 17、debug:执行命令过程中打印信息

查看参数:# ansible-doc -s debug

示例:输出“hello world”信息

# ansible all -m debug -a 'msg="hello world"'

18、reboot:重启被管控主机

查看参数:# ansible-doc -s reboot

示例:重启所有被管控主机

# ansible all -m reboot

备注:reboot模块后无需加key=value格式的参数列表

19、systemd:管理服务

查看参数:# ansible-doc -s systemd

示例1:被管控主机192.168.1.144重启httpd服务,并设置开机自启

# ansible 192.168.1.144 -m systemd -a 'name=httpd.service state=restarted enabled=yes'

备注:

Ø  systemd模块仅可用于CentOS 7.x系统

Ø  参数state的可选值包括startedstoppedrestartedreloaded

示例2:被管控主机192.168.1.144停止httpd服务,并取消开机自启

# ansible 192.168.1.144 -m systemd -a 'name=httpd.service state=stopped enabled=no'

20、sysctl:管理sysctl.conf

查看参数:# ansible-doc -s sysctl

示例:将所有被管控主机中/etc/sysctl.conf文件的net.ipv4.ip_forward值设置为1

# ansible all -m sysctl -a 'sysctl_file=/etc/sysctl.conf name=net.ipv4.ip_forward value=1 reload=yes state=present'

21、selinux:改变SELinux的策略和状态

查看参数:# ansible-doc -s selinux

示例:所有被管控主机禁用SELinux

# ansible all -m selinux -a 'state=disabled'

备注:被管控主机需要先安装libselinux-python软件包

22、stat:检索文件或者文件系统的状态

查看参数:# ansible-doc -s stat

示例:获取所有被管控主机中/etc/fstab文件的状态信息,包括atimectimemtimeuidgidinodemodemd5

# ansible all -m stat -a 'path=/etc/fstab get_checksum=yes checksum_algorithm=md5'

备注:参数checksum_algorithm的可选值包括md5sha1sha224sha256sha384sha512

23、replace:使用向后引用的正则表达式替换文件中特定字符串的所有实例

查看参数:# ansible-doc -s replace

示例:将被管控主机192.168.1.144/tmp/test.txt文件内的HELLOWORLD全部替换成helloworld

# cat /tmp/test.txt

HELLOWORLD

helloworld

HELLOworld

helloWORLD

# ansible 192.168.1.144 -m replace -a 'path=/tmp/test.txt regexp=HELLOWORLD replace=helloworld backup=yes'

24、lineinfile:管理文本文件中的行

查看参数:# ansible-doc -s lineinfile

示例:将所有被管控主机中/etc/selinux/config文件内的SELinux的值设置为disabled

# ansible all -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled" state=present backup=yes'

25、blockinfile:插入/更新/删除由标记线包围的文本块

查看参数:# ansible-doc -s blockinfile

示例1:在所有被管控主机中/tmp/service.txt文件的开头插入一行“hello world

# cat /tmp/service.txt

111111

222222

333333

# ansible all -m blockinfile -a 'path=/tmp/service.txt block="hello world" marker="#{mark} test echo" insertbefore=BOF state=present backup=yes'

备注:BOF --> Begin Of File

示例2:在所有被管控主机中/tmp/test.txt文件的末尾插入一行“welcome home

# cat /tmp/test.txt

111111

222222

333333

# ansible all -m blockinfile -a 'path=/tmp/test.txt block="welcome home" marker="#{mark} test" insertafter=EOF state=present backup=yes'

备注:EOF --> End Of File,默认操作就是将文本块插入到文档的末尾,可以不加参数EOF

示例3:在所有被管控主机中/tmp/script.sh文件的“#!/bin/sh”开头的行后插入HELLO WORLD

# cat /tmp/script.sh

#!/bin/sh

 

#Licensed to the Apache Software Foundation (ASF) under one or more

# ansible all -m blockinfile -a 'path=/tmp/script.sh block="HELLO WORLD" marker="#{mark} test reg" insertafter="^#!/bin/sh" state=present backup=yes'

26、yum_repository:增加或删除yum仓库

查看参数:# ansible-doc -s yum_repository

示例:在所有被管控主机中创建如下yum仓库

# cat /etc/yum.repos.d/MariaDB.repo                          //仓库名称由file参数定义

[mariadb]                                                                      //name参数定义

name=MariaDB Repo                                                  //description参数定义

baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/

gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB

gpgcheck=1

enabled=1

# ansible all -m yum_repository -a 'file=MariaDB name=mariadb description="MariaDB Repo" baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/ gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=yes enabled=yes owner=root group=root mode=0644 state=present'

27、mysql_user:增加或删除MySQL数据库中的用户

查看参数:# ansible-doc -s mysql_user

示例:在被管控主机的MySQL数据库中通过root@localhost用户,密码123456,增加testuser@%用户,密码654321,并对所有库的所有表拥有任何权限

# ansible all -m mysql_user -a 'login_host=localhost login_user=root login_password=123456 name=testuser host="%" password=654321 priv=*.*:all state=present'