bash无论在命令行上执行,还是bash脚本中,都需要调用cd、ls、copy、yum等命令;模块就是Ansible的“命令”,模块是ansible命令行和脚本中都需要调用的。常用的Ansible模块有yum、copy、template等。
# 语法格式:
ansible -m -a
# 也就是:
ansible 匹配模式 -m 模块 -a '需要执行的内容'
# 解释说明:
匹配模式:即哪些机器生效 (可以是某一台, 或某一组, 或all) , 默认模块为command , 执行常规的shell命令.
# 参数:
-v,--verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息。
-i,PATH,--inventory(清单)=PATH:指定inventory(清单)信息,默认/etc/ansible/hosts
-f NUM,--forks=NUM:并发线程数,默认5个线程。
--private-key=PRIVATE_KEY_FILE:指定密钥文件。
-m NMAE,--module-name=NAME:指定执行使用的模块。
-M DIRECTORY,--module-path=DIRECTORY:指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。
-a ‘ARGUMENTS’,--args=‘ARGUMENTS’:模块参数。
-k,--ask-pass SSH:认证密码
-K,--ask-sudo-pass sudo:用户的密码(--sudo时使用)。
-o,--one-line:标准输出至一行。
-s,--sudo:相当于Linux系统下的sudo命令。
-t DIRECTORY,--tree=DIRECTORY:输出信息至DIRECTORY目录下,结果文件以远程主机命名。
-T SECONDS,--timeout=SECONDS:指定连接远程主机的最大超时,单位是秒。
-B NUM,--background=NUM:后台执行命令,超NUM秒后中止正在执行的任务。
-P NUM,--poll=NUM:定期返回后台任务进度。
-u USERNAME,--user=USERNAME:指定远程主机以USERNAME运行命令。
-U SUDO_USERNAME,--sudo-user=SUDO_USERNAME:使用sudo,相当于LInux下的sudo命令。
-c CONNECTION,--connection=CONNECTION:指定连接方式,可用选项paramiko(SSH)、ssh、local,local方式常用于crontab和kickstarts。
-l SUBSET,--limit=SUBSET:指定运行主机。
-l ~REGEX,--limit=~REGEX:指定运行主机(正则)。
--list-hosts:列出符合条件的主机列表,不执行任何命令。
# 执行的状态返回信息:
--绿色:执行成功并且不需要做改变的动作
--黄色:执行成功并且对目标主机做变更
--红色:执行失败
参数 | 解释 |
---|---|
name | 要创建、修改、移除的用户名 |
password | 设置用户密码。此处只能使用加密密码作为值 |
system | 设置为yes表示创建一个系统用户,只能用于创建不能用于修改已有用户为系统用户 |
state | 创建用户(present)还是删除用户(absent)。 默认为present |
createhome | 创建家目录,或者已有的用户但家目录不存在也会创建。设置为no则不创建家目录 |
home | 指定要创建的家目录路径 |
move_home | 如果设置为yes,则"home="则表示将家目录移动到此选项指定的路径下 |
uid | 设置用户的uid |
group | 设置用户的primary group |
groups | 将用户加入到辅助组列表中。如果设置"groups=", 则会将此用户从所有辅助组中移除 |
shell | 设置用户的shell |
force | 配合’state=absent’时,等价于’userdel --force’, 即强制删除用户、家目录和邮件列表 |
remove | 配合’state=absent’时, 等价于’userdel --remove’, 即删除家目录和邮件列表 |
update_password | user是幂 等模块,"always"将总是修改密码。"on_.create"将只在创建用户时设置密码 |
示例:
# 临时命令使用user模块来确保newbie用户存在于node1上,并且其UID为4000
[student@ansible ~/ansible]$ansible node1 -m user -a 'name=newbie uid=4000 state=present'
[root@node1 ~]#id newbie
uid=4000(newbie) gid=4000(newbie) 组=4000(newbie)
# 设置newbie用户密码
[student@ansible ~/ansible]$ansible node1 -m user -a 'name=newbie password=$1$x5dsadpB$PqzHJZD//CqCaxOZoZcj71'
# 创建无家目录,不能登录的用户
[student@ansible ~/ansible]$ansible node1 -m user -a 'name=zhao create_home=no shell=/sbin/nologin state=present'
在远程主机上执行复杂的命令
# 语法:
ansible 主机清单 -m shell -a '执行命令'
# 示例:
--临时命令使用shell模块来删除node1.example.com节点中的用户newbie
[student@ansible ~/ansible]$ansible node1 -m shell -a 'userdel -r newbie'
node1 | CHANGED | rc=0 >>
参数 | 模块 |
---|---|
backup=[yes|no] | 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no |
dest | 目标路径,只能是绝对路径,如果拷贝的文件是目录,则目标路径必须也是目录 |
content | 直接以content给定的字符串或变量值作为文件内容保存到远程主机上,它会替代src选项 |
directory_mode | 当对目录做递归拷贝时,设置了directory_mode将会使得只拷贝新建文件 |
follow=[yes|no] | 是否追踪到链接的源文件 |
force=[yes|no] | 设置为yes(默认)时, 将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝 |
group | 设置远程文件的所属组 |
owner | 设置远程文件的所有者 |
mode | 设置远程文件的权限。使用数值表示时不能省略第一位,如0644。 也可以使用’u+rwx’或’u=rw,g=r,0=r’等方式设置 |
src | 拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了 斜杠"/",则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和 目录内的内容到远程。 |
示例:
# 将源文件,copy到被控端
[student@ansible ~/ansible]$ansible node1 -m copy -a 'src=/etc/fstab dest=/var/tmp/fstab'
参数 | 解释 |
---|---|
backup | 拷贝的同时也创建一个包含时间戳信息的备份文件,默认为no |
dest | 目标路径 |
force | 设置为yes (默认)时,将覆盖远程同名文件。设置为no时,忽略同名文件的拷贝 |
group | 设置远程文件的所属组 |
owner | 设置远程文件的所有者 |
mode | 设置远程文件的权限。使用数值表示时不能省略第一位,如0644。 也可以使用’u+rwx’ or 'u=rw,g=r,0=r’等 方式设置 |
src | ansible控制器上Jinja2格式的模板所在位置,可以是相对或绝对路径 |
validate | 在复制到目标主机后但放到目标位置之前,执行此选项指定的命令。 一般用于检查配置文件语法,语法正确则保存到目标位置。 如果要引用目标文件名,则使用%s, 下面的示例 中的s%即表示目标机器上的/etc/nginx/nginx. conf. |
示例:
[student@ansible ~/ansible]$ansible node1 -m template -a 'src=/usr/share/doc/httpd/httpd-vhosts.conf dest=/etc/httpd/conf.d/httpd-vhosts.conf group=root owner=root mode=0644'
参数 | 解释 |
---|---|
group | 设置文件的所属组 |
owner | 设置文件的所有组 |
mode | 修改权限 |
path | 指定代操作的文件 |
recurse | 递归修改文件属性,要求state=directory |
src | 原文件名 |
state | directory:如果目录不存在则递归创建 file:文件不存在时,不会被创建(默认值) touch:创建新文件 link:修改或创建软链接 hard:修改或创建硬链接 absent:目录和其中的文件会被递归删除,文件或链接将取消链接状态 |
示例:
# 修改文件的权限属性和context值
[student@ansible ~/ansible]$ansible node1 -m file -a 'path=/var/tmp/fstab mode=g+w mode=o+w group=galaxy owner=galaxy setype=samba_share_t'
# 新建文件
[student@ansible ~/ansible]$ansible node1 -m file -a 'path=/var/tmp/bbb state=touch'
# 新建目录
[student@ansible ~/ansible]$ansible node1 -m file -a 'path=/var/tmp/cc state=directory'
# 删除文件或者目录
[student@ansible ~/ansible]$ansible node1 -m file -a 'path=/var/tmp/cc state=absent'
# 创建软链接
[student@ansible ~/ansible]$ansible node1 -m file -a 'dest=/var/tmp/chenyu src=/var/tmp/bbb state=link'
# 创建硬链接
[student@ansible ~/ansible]$ansible node1 -m file -a 'dest=/var/tmp/chenyu1 src=/var/tmp/aaa state=hard'
参数 | 解释 |
---|---|
path | 必须参数,指定要操作的文件路径 |
line | 必须参数,指定要替换的文本内容 |
regexp | 匹配正则语句,与要过滤的关键字 |
state | 状态语句:state=absent则是删除,state=present默认 |
backrefs | 表示是否开启反向引用,默认no |
create | 当文件不存在时,是否创建对应的文件 |
backup | 是否在修改文件之前对文件进行备份 |
insertafter | 借助insertafter参数可以将文本插入到"指定的行"之后 |
insertbefore | 借助insertbefore参数可以将文本插入到"指定的行"之前 |
示例:
# 通过正则匹配查找/etc/selinux/config 文本中开头是SELINUX=的行,并替换成SELINUX=disabled
[student@ansible ~/ansible]$ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="^SELINUX=" line="SELINUX=disabled"'
# 通过正则匹配查找/etc/selinux/config文本,并在文本末尾插入一行www.alone.com
[student@ansible ~/ansible]$ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="EOF" line="www.alone.com"'
# 通过正则匹配查找/etc/selinux/config文本,并在文本行首插入一行www.alone.com
[student@ansible ~/ansible]$ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="BOF" line="www.alone.com"'
# 4.通过正则匹配查找/etc/selinux/config文本,删除所有的www.alone.com字段.
[student@ansible ~/ansible]$ansible node1 -m lineinfile -a 'path=/etc/selinux/config regexp="^www.alone.com" state=absent'
# 5.通过正则匹配查找/etc/selinux/config文本中在开头是SELINUX=disabled行的行后插入一段话www.alone.com
[student@ansible ~/ansible]$ansible node1 -m lineinfile -a 'path=/etc/selinux/config insertafter="^SELINUX=" line="www.alone.com"'
# 6.通过正则匹配查找/etc/selinux/config文本中在开头是SELINUX=disabled行的行前插入一段话www.alone.com
[student@ansible ~/ansible]$ansible node1 -m lineinfile -a 'path=/etc/selinux/config insertbefore="^SELINUX=" line="www.alone.com"'
参数 | 解释 |
---|---|
baseurl | 地址 |
mirrorlist | 设置mirrorlist地址 |
description | 描述信息 |
enabled | 是否启用该仓库 |
file | 保存此仓库的文件,不设置该项的话则默认以name选项中的名称命名 |
gpgcheck | 是否要进行gpgcheck |
name | 仓库的名称 |
reposdir | 保存.repo文件的目录 |
state | repo文件的状态,present/absent |
示例:
# 配置yum仓库
[student@ansible ~/ansible]$ansible done1 -m yum_repository -a 'file=server name=BaseOS description=BaseOS baseurl=file:///mnt/BaseOS enabled=yes gpgcheck=no'
[student@ansible ~/ansible]$ansible done1 -m yum_repository -a 'file=server name=AppStream description=AppStream baseurl=file:///mnt/AppStream enabled=yes gpgcheck=no'
参数 | 解释 |
---|---|
name | 用于指定安装包的包名 |
state | 用于指定软件包的状态,默认值为present |
disable_gpg_check | 用于禁用对 rpm 包的公钥 gpg 验证,默认值为 no |
enablerepo | 用于指定安装软件包时临时启用的 yum 源 |
disablerepo | 用于指定安装软件包时临时禁用的 yum 源 |
exclude | 排除哪些包不安装,仅在state=present或latest时生效 |
list | 类似于yum list |
update_cache | 强制更新yum的cache |
示例:
# 安装软件:通过Yum模块批量的安装httpd服务到指定主机上.
[student@ansible ~/ansible]$ansible node1 -m yum -a "name=httpd state=installed"
# 卸载软件:通过Yum模块批量的卸载httpd服务主机.
[student@ansible ~/ansible]$ansible node1 -m yum -a "name=httpd state=removed"
参数 | 解释 |
---|---|
name | 此参数用于指定需要操作的服务名称 |
state | 此参数用于指定服务的状态,started、stopped、restarted、reloaded |
enabled | 此参数用于指定是否将服务设置为开机 启动项 |
示例:
# 设置服务开机自启动,设置httpd服务开机自启动.
[student@ansible ~/ansible]$ansible node1 -m service -a "name=httpd state=started enabled=yes"
# 关闭服务开机自启动,关闭httpd服务开机自启动.
[student@ansible ~/ansible]$ansible node1 -m service -a "name=httpd state=stopped enabled=no"
参数 | 解释 |
---|---|
dest | 目标绝对路径 |
src | 复制的源文件路径,源文件只能是文件 |
flat | 改变拉取后的路径存储方式。如果设置为yes, 且当dest以"/"结尾时, 将直接把源文件的basename存储在dest下。显然,应该考虑多个主机拉取时的文件覆盖情况。 |
fail on missing | 当设置为yes时,如果拉取的源文件不存在,则此任务失败。默认为no. |
validate_checksum | 远程主机上的源文件。只能是文件,不支持目录。在未来的版本中可能会支持目录递归拉取。 |
示例:
# 将远程主机的/etc/fstab文件拉取到本地来,存储的名字为/tmp/node1/etc/fstab
[student@ansible ~/ansible]$ansible node1-m fetch -a 'src=/etc/fstab dest=/tmp'
# 将某台远程主机的/etc/fstab文件拉取到本地来,存储的名字为/tmp/fstab
[student@ansible ~/ansible]$ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/ flat=yes'
# 将远程主机的/etc/fstab文件拉取到本地来,存储的名字为/tmp/fstab-node1
[student@ansible ~/ansible]$ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/fstab-{{inventory_hostname}} flat=yes'
参数 | 解释 |
---|---|
icmp_block | 在防火墙中添加或者移除的ICMP块 |
icmp_bolck_inversion | 开启/关闭防火墙区域ICMP报文反转功能 |
immediate | 如果将此配置设置为永久性,则应立即应用此配置,yes or no,默认no |
interface | 在防火墙中添加或移除interface |
masquerade | 在在防火墙中开启或关闭masquerade功能 |
offline | 是否在防火墙离线时运行此模块,yes or no |
permanent | 该配置是否在运行的防火墙配置中,或者在重新启动时仍然存在。注意,如果这是no, immediate被假定为yes。 |
port | 在防火墙中添加或移除端口名称或端口范围。端口范围必须为PORT/PROTOCOL或PORT-PORT/PROTOCOL格式 |
rich_rule | rich_rule添加或删除到防火墙 |
service | 在防火墙中添加或移除服务名称该服务必须在firewall-cmd --get-services 的输出中列出 |
source | 在防火墙中添加或移除某个来源的网络 |
state | 启用或禁用一项设置。对于端口:该端口是否接受(enabled)或拒绝(disabled)连接。状态的(present)和(absent)只能在区域级别操作中使用(即,当除了zone和state没有设置其他参数时)。 |
timeout | 该规则应在非永久性时生效的时间,默认0 |
zone | 添加或移除的防火墙区域。注意,可以为每个系统配置默认的区域,可能的值有block , dmz , drop , external , home , internal , public , trusted , work ,public |
示例:
# 允许http流量的传入
[student@ansible ~/ansible]$ansible node1 -m firewalld -a 'service=http permanent=yes state=enabled immediate=yes'
# 副规则 允许192.168.111.0/24主机http流量的传入
[student@ansible ~/ansible]$ansible node1 -m firewalld -a ‘zone=public rich_rule="rule family=ipv4 source address=192.168.111.0/24 service name=http accept" permanent=yes state=enabled immediate=yes'
参数 | 解释 |
---|---|
path | 必须参数,指定要操作的文件名称 |
regexp | 必须参数,指定一个正则表达式 |
replace | 指定最终要替换成的文本 |
backup | 在修改文件之前对文件进行备份,yes/no |
示例:
# 将/tmp/zsl文件中的“abc”替换成“yyy”
[student@ansible ~/ansible]$ansible node1 -m replace -a 'path=/tmp/zsl regexp="abc" replace="yyy"'
# 将/tmp/zsl文件中的“yyy”替换成“iii”,且把替换前的/tmp/zsl文件备份
[student@ansible ~/ansible]$ansible node1 -m replace -a 'path=/tmp/zsl regexp="yyy" replace="iii" backup=yes'
参数 | 解释 |
---|---|
device | 指定硬盘设备路径 比如 /dev/vdb |
label | 指定分区表类型 gpt mbr |
number | 指定分区序号 |
part_start | 分区起始位置 |
part_end | 分区结束位置 |
state | 指定操作方式 创建(present) 、删除(absent) 、查信息(info) |
示例:
# 新建扩展分区
[student@ansible ~/ansible]$ansible node1 -m parted -a 'device=/dev/sda number=4 part_type=extended part_start=46GiB part_end=49.8GiB state=present'
# 新建逻辑分区
[student@ansible ~/ansible]$ansible node1 -m parted -a 'device=/dev/sda number=5 part_type=logical part_start=46.1GiB part_end=48.2GiB state=present'
参数 | 解释 |
---|---|
dev | 要格式化的分区 |
fstype | 文件系统类型 比如 ext4 xfs |
force | 强制格式化,如果以前分区中有数据 |
示例:
# 给/dev/sda5格式化,类型是xfs
[student@ansible ~/ansible]$ansible node1 -m filesystem -a 'fstype=xfs dev=/dev/sda5'
参数 | 解释 |
---|---|
path | 挂载点 |
src | 挂载的文件 |
fstype | 挂载的硬盘类型 比如iso9660、ext4、xfs、nfs、 cifs samba的共享文件系统 ntfs windows磁盘文件系统 |
opts | 传递给mount命令的参数 |
state | present 开机挂载,仅将挂载配置写入/etc/fstab并不会真的挂载 mounted 挂载设备,并将配置写入/etc/fstab unmounted 卸载设备,不会清除/etc/fstab写入的配置 absent 卸载设备,并清理/etc/fstab写入的配置 |
示例:
# 新建挂载点/common
[student@ansible ~/ansible]$ansible node1 -m file -a 'path=/common state=directory'
# 查看/dev/sda5的UUID
[student@ansible ~/ansible]$ansible node1 -m shell -a 'blkid /dev/sda5'
# 将分区/dev/sda5挂载到/common目录
[student@ansible ~/ansible]$ansible node1 -m mount -a 'path=/common src="UUID=d162b8b9-2326-4ee4-a559-80861461c4f0" fstype=xfs state=mounted'
# 卸载
[student@ansible ~/ansible]$ansible node1 -m mount -a 'path=/common src="UUID=d162b8b9-2326-4ee4-a559-80861461c4f0" fstype=xfs state=absent'
参数 | 解释 |
---|---|
vg | 卷组名称 |
state | present创建(默认) 或者 absent删除 |
force | 可以在删除时使用 |
pvs | 指定物理卷 |
pesize | 设定pe大小 |
示例:
# 新建卷组vg0
[student@ansible ~/ansible]$ansible node1 -m lvg -a 'vg=vg0 pesize=16M pvs=/dev/sda5
参数 | 解释 |
---|---|
lv | 定义逻辑卷名称 |
size | 定义逻辑卷大小 |
vg | 逻辑卷的空间来自哪个vg |
state | present创建(默认) 或者 absent删除 |
force | 强制删除或者调整逻辑卷大小 |
示例:
# 新建逻辑卷lv0
[student@ansible ~/ansible]$ansible node1 -m lvol -a 'lv=lv0 size=1000M vg=vg0'
# 在线扩容逻辑卷
[student@ansible ~/ansible]$ansible node1 -m lvol -a 'lv=lv0 size=1600M vg=vg0 resizefs=yes'
参数 | 解释 |
---|---|
target | 指定目标目录 |
setype | 设置安全性本文 |
state | 模块状态:present代表增加目录的安全性本文;absent代表删除目录的安全性本文 |
示例:
# 修改context值
[student@ansible ~/ansible]$ansible node1 -m sefcontext -a 'target="/share(/.*)?" setype=samba_share_t state=present'
# 应用新的selinux 文件的context值
[student@ansible ~/ansible]$ansible node1 -m command -a 'restorecon -Rv /share'
参数 | 解释 |
---|---|
msg | 调试输出的消息 |
var | 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出 |
verbosity | debug的级别(默认是0级,全部显示) |
示例:
# 输出Alone
[student@ansible ~/ansible]$ansible node1 -m debug -a 'msg=Alone'
参数 | 解释 |
---|---|
user | 用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户 |
job | 指定计划的任务中需要实际执行的命令或者脚本 |
name | 用于设置计划任务的名称,计划任务的名称会在注释中显示 |
state | 相关状态信息,当删除计划任务时,需要将 state 的值设置为 absent,用于创建present(默认)|用于移除absent |
disabled | 当计划任务有名称时,我们可以根据名称使对应的任务失效 |
backup | 此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会对计划任务备份 |
$time | 指定具体的执行时间、minute分、hour时、day天、month月、weekday、0-7 代表周 |
示例:
# 创建计划任务,任务名称为mkdirs test 任务于每天1点5分,执行输出一段话echo hello lyshark
[student@ansible ~/ansible]$ansible node1 -m cron -a "name='mkdirs test' minute=5 hour=1 job='echo hello lyshark'"
# 删除计划任务mkdirs test,删除前做好备份.
[student@ansible ~/ansible]$ansible node1 -m cron -a "name='mkdirs test' state=absent backup=yes"
参数 | 解释 |
---|---|
dest | 文件下载到远程的那个目录下 如果dest是一个目录,则使用url的base name作为文件名 如果dest是一个目录,则’force’选项不生效 如果dest是一个目录,则总是会下载目标文件,但只在已存在的文件变化了才会替换旧文件 如果设置为yes, 且dest不是一个目录时,则总是会下载文件,但只在已存在的文件变化了才会替换旧文件 如果设置为no(默认),则只会在目录路径下不存在该文件时才会进行下载 |
force | 是否强制覆盖yes/no |
url | 指定一个URL地址 |
backup | 下载文件时间时创建一个名称中包含时问戳的备份文件 |
tmp_dest | 下载时临时存放目录,在任务执行完成前会删除下载的临时文件 |
group | 文件/目录的所属组 |
owner | 文件/目录的所有者 |
timeout | 请求ur1时的超时时间,默认10秒钟 |
示例:
# 下载一个指定文件到远程主机
[student@ansible ~/ansible]$ansible node -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/root"