草庐IT

Ansible常用模块

赵九思 2023-09-26 原文

Ansible 模块

1、什么是Ansible模块?

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

2、Ansible命令及参数

# 语法格式:
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_passworduser是幂 等模块,"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'

2 shell模块

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

# 语法:
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拷贝本地源文件到远程,可使用绝对路径或相对路径。如果路径是目录,且目录后加了
斜杠"/",则只会拷贝目录中的内容到远程,如果目录后不加斜杠,则拷贝目录本身和
目录内的内容到远程。

示例:

# 将源文件,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’等 方式设置
srcansible控制器上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'

5 file模块

参数解释
group设置文件的所属组
owner设置文件的所有组
mode修改权限
path指定代操作的文件
recurse递归修改文件属性,要求state=directory
src原文件名
statedirectory:如果目录不存在则递归创建
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'

6 lineinfile模块

参数解释
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"'

7 yum_repository模块

参数解释
baseurl地址
mirrorlist设置mirrorlist地址
description描述信息
enabled是否启用该仓库
file保存此仓库的文件,不设置该项的话则默认以name选项中的名称命名
gpgcheck是否要进行gpgcheck
name仓库的名称
reposdir保存.repo文件的目录
staterepo文件的状态,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'

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

示例:

# 安装软件:通过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此参数用于指定是否将服务设置为开机 启动项

示例:

# 设置服务开机自启动,设置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远程主机上的源文件。只能是文件,不支持目录。在未来的版本中可能会支持目录递归拉取。

示例:

# 将远程主机的/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_rulerich_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'

12 replace模块

参数解释
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'

13 parted模块

参数解释
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'

14 filesystem模块

参数解释
dev要格式化的分区
fstype文件系统类型 比如 ext4 xfs
force强制格式化,如果以前分区中有数据

示例:

# 给/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命令的参数
statepresent 开机挂载,仅将挂载配置写入/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'

16 lvg模块

参数解释
vg卷组名称
statepresent创建(默认) 或者 absent删除
force可以在删除时使用
pvs指定物理卷
pesize设定pe大小

示例:

# 新建卷组vg0
[student@ansible ~/ansible]$ansible node1 -m lvg -a 'vg=vg0 pesize=16M pvs=/dev/sda5

17 lvol模块

参数解释
lv定义逻辑卷名称
size定义逻辑卷大小
vg逻辑卷的空间来自哪个vg
statepresent创建(默认) 或者 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'

18 sefcontext模块

参数解释
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'

19 debug模块

参数解释
msg调试输出的消息
var将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbositydebug的级别(默认是0级,全部显示)

示例:

# 输出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 代表周

示例:

# 创建计划任务,任务名称为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秒钟

示例:

# 下载一个指定文件到远程主机
[student@ansible ~/ansible]$ansible node -m get_url -a "url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/root"

有关Ansible常用模块的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  9. ruby-on-rails - Controller 中的 Rails 辅助模块 - 2

    我有一个Controller,我想为这个Controller创建一个助手,我可以在不包含它的情况下使用它。我尝试像这样创建一个与Controller同名的助手classCars::EnginesController我创建的助手是moduleCars::EnginesHelperdefcheck_fuellogger.debug("chekingfuel")endend我得到的错误是undefinedlocalvariableormethod`check_fuel'for#有没有我遗漏的约定? 最佳答案 如果你真的想在Controll

  10. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

随机推荐