三、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:在所有被管控主机创建gid为2000的用户组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:在所有被管控主机创建uid为3000、基本组为mygroup、附加组为testgroup、shell为/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+rwx或u=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=link或state=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软件包
Ø 如果时间单位(minute、hour、day等)设定的参数都未指定时,任务计划的时间默认设定为“* * * * *”,表示每分钟都会执行一次任务计划
Ø 参数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.6的echo路径为:/usr/bin/echo;CentOS 6.10的echo路径为:/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方式安装最新版本的httpd和php
# ansible all -m yum -a 'name=httpd,php state=latest'
备注:参数state的可选值包括安装(present=installed、latest)和卸载(absent=removed)
示例2:被管控主机192.168.1.144中安装版本为1.12.2的nginx
# ansible 192.168.1.144 -m yum -a 'name=nginx-1.12.2 state=present'
备注:CentOS 6.10 epel源中nginx的版本为1.10.2,CentOS 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的可选值包括started、stopped、restarted和reloaded
示例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的可选值包括started、stopped、restarted和reloaded
示例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文件的状态信息,包括atime、ctime、mtime、uid、gid、inode、mode、md5等
# ansible all -m stat -a 'path=/etc/fstab get_checksum=yes checksum_algorithm=md5'
备注:参数checksum_algorithm的可选值包括md5、sha1、sha224、sha256、sha384和sha512
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'