Ansible 模块

2023-03-17 11:17:31 浏览数 (3)

Ansible 模块

1、什么是Ansible模块?

bash无论在命令行上执行,还是bash脚本中,都需要调用cd、ls、copy、yum等命令;模块就是Ansible的“命令”,模块是ansible命令行和脚本中都需要调用的。常用的Ansible模块有yum、copy、template等。

2、Ansible命令及参数

代码语言:javascript复制
# 语法格式:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
# 也就是:
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:列出符合条件的主机列表,不执行任何命令。
  

# 执行的状态返回信息:
		--绿色:执行成功并且不需要做改变的动作
		--黄色:执行成功并且对目标主机做变更
		--红色:执行失败

3、Ansible模块

  • 文件模块:
    • copy:将本地文件复制到受控主机
    • file:创建或者和删除远程主机上的文件或者目录
    • lineinfile:替换文件中的内容,添加内容到指定文件位置
    • synchronize:使用rsync同步内容
  • 软件包模块
    • package:使用操作系统本机的自动检测软件包管理器管理软件包
    • yum:使用yum软件包管理器管理软件包
    • apt:使用apt软件包管理器管理软件包
    • dnf:使用dnf软件包管理器管理软件包
    • pip:从PyPI管理Python软件包
  • 系统模块
    • firewalld:使用firewalld管理任意端口和服务
    • reboot:重新启动计算机
    • service:管理服务
    • user:添加、删除和管理用户账户
  • Net Tools模块
    • get_url:通过http、https或者ftp下载文件
    • nmcli:管理网络
    • uri:与WEB服务交互

3、Ansible 常用模块

1 user模块

参数

解释

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"将只在创建用户时设置密码

示例:

代码语言:javascript复制
# 临时命令使用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'
2 shell模块

在远程主机上执行复杂的命令

代码语言:javascript复制
# 语法:
ansible 主机清单 -m  shell -a  '执行命令'

# 示例:
--临时命令使用shell模块来删除node1.example.com节点中的用户newbie
[student@ansible ~/ansible]$ansible node1 -m shell -a 'userdel -r newbie'
node1 | CHANGED | rc=0 >>
3 copy模块

参数

模块

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

拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了斜杠"/",则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和目录内的内容到远程。

示例:

代码语言:javascript复制
# 将源文件,copy到被控端
[student@ansible ~/ansible]$ansible node1 -m copy -a 'src=/etc/fstab dest=/var/tmp/fstab'
4 template模块

参数

解释

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.

示例:

代码语言:javascript复制
[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'
5 file模块

参数

解释

group

设置文件的所属组

owner

设置文件的所有组

mode

修改权限

path

指定代操作的文件

recurse

递归修改文件属性,要求state=directory

src

原文件名

state

directory:如果目录不存在则递归创建 file:文件不存在时,不会被创建(默认值)touch:创建新文件link:修改或创建软链接hard:修改或创建硬链接absent:目录和其中的文件会被递归删除,文件或链接将取消链接状态

示例:

代码语言:javascript复制
# 修改文件的权限属性和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'
6 lineinfile模块

参数

解释

path

必须参数,指定要操作的文件路径

line

必须参数,指定要替换的文本内容

regexp

匹配正则语句,与要过滤的关键字

state

状态语句:state=absent则是删除,state=present默认

backrefs

表示是否开启反向引用,默认no

create

当文件不存在时,是否创建对应的文件

backup

是否在修改文件之前对文件进行备份

insertafter

借助insertafter参数可以将文本插入到"指定的行"之后

insertbefore

借助insertbefore参数可以将文本插入到"指定的行"之前

示例:

代码语言:javascript复制
# 通过正则匹配查找/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"'
7 yum_repository模块

参数

解释

baseurl

地址

mirrorlist

设置mirrorlist地址

description

描述信息

enabled

是否启用该仓库

file

保存此仓库的文件,不设置该项的话则默认以name选项中的名称命名

gpgcheck

是否要进行gpgcheck

name

仓库的名称

reposdir

保存.repo文件的目录

state

repo文件的状态,present/absent

示例:

代码语言:javascript复制
# 配置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'
8 yum模块

参数

解释

name

用于指定安装包的包名

state

用于指定软件包的状态,默认值为present

disable_gpg_check

用于禁用对 rpm 包的公钥 gpg 验证,默认值为 no

enablerepo

用于指定安装软件包时临时启用的 yum 源

disablerepo

用于指定安装软件包时临时禁用的 yum 源

exclude

排除哪些包不安装,仅在state=present或latest时生效

list

类似于yum list

update_cache

强制更新yum的cache

示例:

代码语言:javascript复制
# 安装软件:通过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" 
9 service模块

参数

解释

name

此参数用于指定需要操作的服务名称

state

此参数用于指定服务的状态,started、stopped、restarted、reloaded

enabled

此参数用于指定是否将服务设置为开机 启动项

示例:

代码语言:javascript复制
# 设置服务开机自启动,设置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"
10 fetch模块

参数

解释

dest

目标绝对路径

src

复制的源文件路径,源文件只能是文件

flat

改变拉取后的路径存储方式。如果设置为yes, 且当dest以"/"结尾时, 将直接把源文件的basename存储在dest下。显然,应该考虑多个主机拉取时的文件覆盖情况。

fail on missing

当设置为yes时,如果拉取的源文件不存在,则此任务失败。默认为no.

validate_checksum

远程主机上的源文件。只能是文件,不支持目录。在未来的版本中可能会支持目录递归拉取。

示例:

代码语言:javascript复制
# 将远程主机的/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'
11 firewalld模块

参数

解释

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

示例:

代码语言:javascript复制
# 允许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'
12 replace模块

参数

解释

path

必须参数,指定要操作的文件名称

regexp

必须参数,指定一个正则表达式

replace

指定最终要替换成的文本

backup

在修改文件之前对文件进行备份,yes/no

示例:

代码语言:javascript复制
# 将/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'
13 parted模块

参数

解释

device

指定硬盘设备路径 比如 /dev/vdb

label

指定分区表类型 gpt mbr

number

指定分区序号

part_start

分区起始位置

part_end

分区结束位置

state

指定操作方式 创建(present) 、删除(absent) 、查信息(info)

示例:

代码语言:javascript复制
# 新建扩展分区
[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'
14 filesystem模块

参数

解释

dev

要格式化的分区

fstype

文件系统类型 比如 ext4 xfs

force

强制格式化,如果以前分区中有数据

示例:

代码语言:javascript复制
# 给/dev/sda5格式化,类型是xfs
[student@ansible ~/ansible]$ansible node1 -m filesystem -a 'fstype=xfs dev=/dev/sda5'
15 mount模块

参数

解释

path

挂载点

src

挂载的文件

fstype

挂载的硬盘类型 比如iso9660、ext4、xfs、nfs、cifs samba的共享文件系统ntfs windows磁盘文件系统

opts

传递给mount命令的参数

state

present 开机挂载,仅将挂载配置写入/etc/fstab并不会真的挂载mounted 挂载设备,并将配置写入/etc/fstabunmounted 卸载设备,不会清除/etc/fstab写入的配置absent 卸载设备,并清理/etc/fstab写入的配置

示例:

代码语言:javascript复制
# 新建挂载点/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'
16 lvg模块

参数

解释

vg

卷组名称

state

present创建(默认) 或者 absent删除

force

可以在删除时使用

pvs

指定物理卷

pesize

设定pe大小

示例:

代码语言:javascript复制
# 新建卷组vg0
[student@ansible ~/ansible]$ansible node1 -m lvg -a 'vg=vg0 pesize=16M pvs=/dev/sda5
17 lvol模块

参数

解释

lv

定义逻辑卷名称

size

定义逻辑卷大小

vg

逻辑卷的空间来自哪个vg

state

present创建(默认) 或者 absent删除

force

强制删除或者调整逻辑卷大小

示例:

代码语言:javascript复制
# 新建逻辑卷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'
18 sefcontext模块

参数

解释

target

指定目标目录

setype

设置安全性本文

state

模块状态:present代表增加目录的安全性本文;absent代表删除目录的安全性本文

示例:

代码语言:javascript复制
# 修改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'
19 debug模块

参数

解释

msg

调试输出的消息

var

将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出

verbosity

debug的级别(默认是0级,全部显示)

示例:

代码语言:javascript复制
# 输出Alone
[student@ansible ~/ansible]$ansible node1 -m debug -a 'msg=Alone'
20 cron模块

参数

解释

user

用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户

job

指定计划的任务中需要实际执行的命令或者脚本

name

用于设置计划任务的名称,计划任务的名称会在注释中显示

state

相关状态信息,当删除计划任务时,需要将 state 的值设置为 absent,用于创建present(默认)|用于移除absent

disabled

当计划任务有名称时,我们可以根据名称使对应的任务失效

backup

此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会对计划任务备份

$time

指定具体的执行时间、minute分、hour时、day天、month月、weekday、0-7 代表周

示例:

代码语言:javascript复制
# 创建计划任务,任务名称为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"
21 get_url模块

参数

解释

dest

文件下载到远程的那个目录下如果dest是一个目录,则使用url的base name作为文件名如果dest是一个目录,则’force’选项不生效如果dest是一个目录,则总是会下载目标文件,但只在已存在的文件变化了才会替换旧文件如果设置为yes, 且dest不是一个目录时,则总是会下载文件,但只在已存在的文件变化了才会替换旧文件如果设置为no(默认),则只会在目录路径下不存在该文件时才会进行下载

force

是否强制覆盖yes/no

url

指定一个URL地址

backup

下载文件时间时创建一个名称中包含时问戳的备份文件

tmp_dest

下载时临时存放目录,在任务执行完成前会删除下载的临时文件

group

文件/目录的所属组

owner

文件/目录的所有者

timeout

请求ur1时的超时时间,默认10秒钟

0 人点赞