草庐IT

ansible常用模块(playbook)

負笈在线 2023-10-16 原文

ansible常用模块(playbook)

hostname

例子

- name: change hostname
hostname:
 name: ansimgr

参数
name: 设置的主机名

file

例子

- name: touch ansible file
 file:
   path: /root/ansible_test/ansible_test2.yaml
   state: touch
   owner: root
   group: root
   mode: 0755

参数
follow: yes/no,默认no;如果原来的文件是link,拷贝后依旧是link
force: yes/no,默认no;强制执行
group: 设定一个群组拥有拷贝到远程节点的文件权限
mode: 等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”
owner: 设定一个用户拥有拷贝到远程节点的文件权限
path: 目标路径,也可以用dest,name代替
src: 待拷贝文件/文件夹的原始位置。
state: file/link/directory/hard/touch/absent,默认file;file代表拷贝后是文件;link代表最终是个软链接;directory代表文件夹;hard代表硬链接;touch代表生成一个空文件;absent代表删除

blockinfile

例子

- name: edit sshd_config
blockinfile:
 backup: yes
 path: /etc/ssh/sshd_config
 block: |
   Match User ansible-agent
   PasswordAuthentication no
 state: present

参数
path: required,指定要操作的文件。
block: 指定要操作的”一段文本”,此参数有一个别名叫”content”,使用content或block的作用是相同的。
marker: 在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,使用marker参数自定义”标记”。比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test。
state: state参数有两个可选值,present与absent,插入和删除对应标记的段落。
insertafter: 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
insertbefore: 在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
backup: 是否在修改文件之前对文件进行备份。
create: 当要操作的文件并不存在时,是否创建对应的文件。

lineinfile

例子

- name: set limit 2
lineinfile:
 backup: yes
 path: /etc/security/limits.conf
 insertafter: '# End of file'
 line: "{{ item }}"
 state: present
with_items:
 - '* soft nofile 655360'
 - '* hard nofile 131072'
 - '* soft nproc 655350'
 - '* hard nproc 655350'
 - '* soft memlock unlimited'
 - '* hard memlock unlimited'

参数
path/dest: 目标文件绝对路径+文件名,必须参数
line: 替换/插入的内容
regexp: 待匹配内容
insertbefore: 匹配行前面插入
insertafter: 匹配行后面插入
state: 删除匹配行,需要将值设为absent,默认值present。
backup: 是否在修改文件之前对文件进行备份。 yes/no
create: 当要操作的文件并不存在时,是否创建对应的文件。yes/no
backrefs:yes/no,backrefs为no时,如果没有匹配,则添加一行line。如果匹配了,则把匹配内容替被换为line内容;backrefs为yes时,如果没有匹配,则文件保持不变。如果匹配了,把匹配内容替被换为line内容。

setup

例子

- name: get server kernet
 setup: filter=ansible_kernel

参数
filter: 可以筛选关键词,主要可选的筛选项如下
ansible_all_ipv4_addresses #所有机器的ipv4地址
ansible_all_ipv6_addresses #所有机器的ipv6地址
ansible_date_time #系统时间
ansible_kernel #内核版本
ansible_default_ipv4 #默认机器的ipv4地址
ansible_default_ipv6 #默认机器的ipv6地址
ansible_distribution #linux系统发行版本,如centos,ubuntu,debian等
ansible_nodename #主机名
ansible_pkg_mgr #包管理器
ansible_python_version #python版本

group

例子

- name: add group admin
 group:
   gid: 1111
   name: admin
   system: yes
   state: present

参数
gid: 指创建的组ID信息
name: 指创建组名称信息
system: yes/no system=yes 则表示创建系统组
state: present(默认)/absent,指定组状态;present创建指定的用户组,absent删除指定的用户组

cron

例子

- name: start chkrootkit
cron:
 name: start chkrootkit
 minute: "0"
 hour: "2"
 weekday: "1"
 job: "/opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh"
 user: root

参数
backup: yes/no,默认no 如果设置了,请在修改crontab之前创建备份。该模块在backup_file变量中返回备份的位置。
cron_file: 如果指定了该文件,将使用该文件而不是单个用户的crontab。如果这是一个相对路径,它将根据/etc/cron.d进行解释,如果它是绝对的,它通常会是/etc/crontab。要使用cron_file参数,还必须指定use。
day: 默认"" 作业应该运行的月份(1-31、、/2等)
disabled: yes/no,默认no 是否应该在crontab中禁用该作业(注释掉)。只有state=present时才有效。
env: yes/no,默认no 如果设置了,则管理crontab的环境变量。在crontab上添加了新的变量。Name和value参数是环境变量的名称和值。
hour: 默认"
" 作业应该运行的时间(0-23、、/2等)
insertafter: 与state=present和env一起使用。如果指定了,环境变量将被插入到指定环境变量的声明之后。
insertbefore: 与state=present和env一起使用。如果指定了,环境变量将被插入到指定环境变量的声明之前。
job: 执行的命令,如果设置了env,则为环境变量的值。命令不应该包含换行符。如果需要state=present。
minute: 默认"" 作业应该运行的时间(0-59、、/2等)
month: 默认"
" 作业应该运行的月份(1-12,,/2,等等)
name: crontab表项的描述,如果设置了env,则是环境变量的名称。如果需要state=absent。如果没有设置name并且state=present,那么无论现有的crontab条目是什么,都会创建一个新的crontab条目。
reboot: yes/no,默认no 是否应该在重新启动时运行作业。不赞成使用该选项。用户应该使用special_time。
special_time: annually or daily or hourly or monthly or reboot or weekly or yearly 特殊时间规范昵称。
state: absent/present,默认present 是否确保作业或环境变量存在或不存在。
user: 需要修改crontab的用户。如果不设置,该参数默认使用root。
weekday: 默认"" 作业应该运行的星期几(0-6表示周日-周六,等)

fetch

例子

- name: fetch chkrootkit
fetch:
  src: /opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh
  dest: /root/

参数
dest: 保存文件的目录。例如,如果dest目录是/backup,则主机host.example.com上名为/etc/profile的src文件将被保存到/backup/host.example.com/etc/profile。主机名以库存名称为准
fail_on_missing: yes/no,默认为yes 当设置为yes时,如果由于任何原因无法读取远程文件,则任务将失败。
flat: yes/no,默认no 允许您覆盖将主机名/path/to/文件追加到目标的默认行为。如果dest以’/'结尾,它将使用源文件的基名,类似于copy模块。如果使用单个主机,或者检索每个主机唯一命名的文件,这可能很有用。如果使用多个具有相同文件名的主机,则每个主机的文件将被覆盖。
src: 要在远程系统上获取的文件。这必须是一个文件,而不是目录。在以后的版本中可能会支持递归抓取。
validate_checksum: yes/no,默认yes 在获取文件之后,验证源和目标校验和是否匹配。

firewalld

例子

- name: deny 8081 port
firewalld:
 port: 8081/tcp
 permanent: yes
 state: enabled

参数
icmp_block: 在防火墙中添加或者移除的ICMP块。
icmp_bolck_inversion: 开启/关闭防火墙区域ICMP报文反转功能。
immediate: yes/no,默认no 如果将此配置设置为永久性,则应立即应用此配置。
interface: 在防火墙中添加或移除interface
masquerade: 在在防火墙中开启或关闭masquerade功能
offline: yes/no 是否在防火墙离线时运行此模块。
permanent: yes/no 该配置是否在运行的防火墙配置中,或者在重新启动时仍然存在。注意,如果这是no, immediate被假定为yes。
port: 在防火墙中添加或移除端口名称或端口范围。端口范围必须为PORT/PROTOCOL或PORT-PORT/PROTOCOL格式。
rich_rule: rich_rule添加或删除到防火墙
service: 在防火墙中添加或移除服务名称该服务必须在firewall-cmd --get-services的输出中列出。
source: 在防火墙中添加或移除某个来源的网络
state: absent/disabled/enabled/present 启用或禁用一项设置。对于端口:该端口是否接受(enabled)或拒绝(disabled)连接。状态的(present)和(absent)只能在区域级别操作中使用(即,当除了zone和state没有设置其他参数时)。
timeout: 默认0 该规则应在非永久性时生效的时间
zone: 添加或移除的防火墙区域。注意,可以为每个系统配置默认的区域,可能的值有block, dmz, drop, external, home, internal, public, trusted, work,public

script

例子

- name: sh chkrootkit
script:
 cmd: /opt/chkrootkit-0.55/scripts/chkrootkit_exec.sh

参数
chdir: 在运行脚本之前,在远程节点上切换到这个目录。
cmd: 要运行的本地脚本的路径,后跟可选参数。
creates: 远程节点上的文件名,如果它已经存在,则不会运行此步骤。
decrypt: yes/no,默认yes 此选项控制使用保险库对源文件进行自动解密。
executable: 用于调用脚本的可执行文件的名称或路径。
free_form: 本地脚本文件的路径,后跟可选参数。
removes: 远程节点上的文件名,如果不存在,则不会运行此步骤。

user

例子

- name: add user luorf
 user: 
   system: yes
   comment: user luorf
   home: /home/luorf
   groups: root
   name: luorf 
   shell: /bin/bash

参数
system: 默认创建为普通用户,为yes则创建系统用户
append: 添加一个新的组
comment: 添加描述信息
createhome: 给用户创建家目录
force: 强制删除用户
group: 创建用户主组
groups: 将用户加入组或者附属组添加
home: 指定用户的家目录
name: 表示状态,是否create、remove、modify
password: 指定用户的密码,为加密密码
remove: 删除用户
shell: 设置用户的shell登录环境
uid: 设置用户ID
update_password: 修改用户密码
state: 用户状态,默认为present,表示新建用户

command

例子

- name: cat hosts file
 command: chdir=/root ls -lt 

参数
chdir: 执行命令前,切换到目录
creates: 当该文件存在时,不执行该步骤
executable: 切换shell来执行命令,需要使用命令的绝对路径
free_from: 需要执行的脚本,一般使用Ansible的-a参数代替。
removes: 当该文件不存在时,不执行该步骤
warn: 如果在ansible.cfg中存在告警,如果设定了false,不会告警该行

说明

command模块不支持变量、重定向、管道符等

shell

例子

- name: hosts bak
shell: cp /etc/hosts /etc/hosts.bak.`date +%Y%m%d`

参数

chdir: 在哪个目录下执行shell命令,相当于执行shell命令前先cd到对应目录

creates: 如果存在某文件,就不执行shell

removes: 如果不存在某文件,就不执行shell;与creates左右相反

executable: 修改并指定shell解释器来执行命令

free_form: 指的就是具体的shell命令,实际上是一个不存在的选项

ping

例子

- name: ping all server
ping:
 data: crash

参数
data: 为ping返回值返回的数据。默认为’pong’,如果该参数设置为crash,模块将引发异常。

make

例子

- name: Build ClamAV 3 
make:
 chdir: /root/clamav-{{clamav_version}}/build
 target: install 
become: yes

参数
chdir: 在执行task之前,需要切换的目录路径—必须

file: 标准Makefile的路径

params: 一些额外的需要传给make命令的参数

target: make要执行的操作,可以写:install/test/all

make.params.PREFIX: 编译之后的文件存放位置。适用于不是root用户执行的脚本

archive

例子

- name:  archive ansible test files
 archive:
   path: /root/ansible_test/
   dest: /root/ansible_test.gz
   owner: root

参数
path: 远程主机上需要被打包/压缩的源文件(可以是文件列表,支持glob模式)
dest: 打包/压缩后的包文件路径(包文件的父目录必须存在);如果包文件已存在,则会被覆盖。
format: 指定压缩类型,包括:bz2、gz(默认)、tar、xz、zip
owner: 指定属主
group: 指定属组
mode: 指定权限
remove: yes|no,默认为no,在打包/压缩后,不删除源文件

unarchive

例子

- name: Unarchive kubernetes package
unarchive:
 src: "/opt/kubernetes-server-linux-amd64.tar.gz"
 dest: "/usr/local/bin/"
 remote_src: yes
 extra_opts:
  - --strip-components=3
 exclude:
  - "*.tar"
  - "*_tag"
  - "*.org"
  - "*.io"
  - "*.com"
  - "*.net"

参数
creates: 如果指定的绝对路径(文件或目录)已存在,则不会运行此步骤。。
copy: 默认为yes,拷贝的文件从ansible主机复制到远程主机,如果没有可复制对象,在远程主机上寻找,no在远程主机上寻找src源文件解压
src: tar源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需设置copy=no
dest: 远程主机上的目标绝对路径
mode: 设置解压缩后的文件权限
exec: 列出需要排除的目录和文件
remote_src: 设置remote_src=yes为解包目标上已经存在的档案。对于Windows目标,改用win_unzip模块。
owner: 解压后文件或目录的属主
group: 解压后的目录或文件的属组
exclude: 列出要从unarchive操作中排除的目录和文件条目。
extra_opts:通过传入数组指定其他选项
keep_newer:不要替换比归档文件更新的现有文件

k8s

例子

- name: create namespace
k8s:
  name: my-namespace
  api_version: v1
  kind: Namespace
  state: present

参数
name: 用于指定对象的名称

api_version: 指定API版本号,默认“v1”

force:yes/no,默认为no;如果设置为“yes”,并且存在状态,则将替换现有对象。

kind: 指定对象资源类型

namespace:用于指定对象的命令空间

state:absent/present /patched,默认为present ;present,如果不存在,则安装;absent,如果存在,则删除,patched,如果存在,则修补

reboot

例子

- name: Wait for server to restart
reboot:
 reboot_timeout: 180

参数
reboot_timeout: 等待计算机重新启动并响应测试命令的最长秒数,默认为600S

test_command: 重启后测试命令,默认为“whoami”

msg:重启前提示用户的消息,默认为“Reboot initiated by Ansible”

service

例子

- name: init service chrony
service:
 name: chronyd 
 enabled: yes 
 state: started

参数
name(required): 设置启停服务名称
enabled: 设置服务是否开机自启动,可选项yes/no;如果参数不指定,原有服务开机自启动状态进行保留
sleep: 如果执行了restarted,则在stop和start之间沉睡几秒钟
state: 需要对当前服务执行的动作,可选项reloaded(平滑重启),restarted(重启),started(启动),stopped(停止)

get_url

例子

- name: get file calico-etcd.yaml
get_url: 
 url=https://docs.projectcalico.org/manifests/calico-etcd.yaml
 dest=/root/
 validate_certs=no

参数
dest: 指定将文件下载的绝对路径—必须
url: 文件的下载地址(网址)—必须
url_username: 用于http基本认证的用户名
url_password: 用于http基本认证的密码
validate_certs: 如果否,SSL证书将不会验证。这只应在使用自签名证书的个人控制站点上使用
owner: 指定属主
group: 指定属组
mode: 指定权限

copy

例子

- name: calico-etcd cfg 1
copy:
 src: calico.sh
 dest: /root/
 owner: root
 group: root
 mode: 0755

参数
src: 用于指定需要copy的文件或目录。
dest: 用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数。
content: 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup: 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group: 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode: 指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r--r--“,则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。

template

例子

- name: 将index.html文件复制到节点,并将其中的变量替换为对应的值
template:
 src: ~/play/template/index.html
 dest: /var/www/html/index.html
 
$ cat index.html
# 将变量写在文件中
welcome to {{ ansible_hostname }} on {{ ansible_ztuzex7lqa.ipv4.address }} 

参数

backup: yes/no,建立个包括timestamp在内的文件备份,以备不时之需
dest: 必选项,远程节点上的绝对路径,用于放置template文件
group: 设置远程节点上的的template文件的所属用户组
mode: 设置远程节点上的template文件权限。类似Linux中chmod的用法
owner: 置远程节点上的template文件所属用户
src: 必选项,本地Jinjia2模版的template文件位置

filesystem

例子

- name: Create a ext4 filesystem on /dev/sdb1 and check disk blocks
filesystem:
 fstype: ext4
 dev: /dev/sdb1
 opts: -cc

参数
fstype: 文件系统的类型(Choices: btrfs, ext2, ext3, ext4, ext4dev, f2fs, lvm, ocfs2, reiserfs, xfs, vfat,swap)
dev: 预备检查的硬盘分区
force: yes/no,默认为no;强制格式化文件系统,在已经格式化文件系统的基础上重新格式化文件系统需要把参数配成yes
opts: 其他mkfs命令的参数

lvol

例子

- name: Create a logical volume of 512m with disks /dev/sdb1 and /dev/sdb2
lvol:
 vg: firefly
 lv: test
 size: 512
 pvs: /dev/sdb1,/dev/sdb2

参数
vg: 在哪个卷组上创建lv
lv: 逻辑卷名
size: 逻辑卷大小,默认单位是M。
pvs: 指定物理卷
force: yes/no,默认no,即默认不允许缩小和删除lv操作,如果一定要执行就force=yes
state: 模块状态,absent代表删除,present代表新建,默认是present。
active: 卷是否已激活并且对主机可见

lvg

例子

- name: Create a volume group on top of /dev/sdb1 with physical extent size = 32MB
lvg:
 vg: vg.services
 pvs: /dev/sdb1
 pesize: 32

参数
vg: 要创建的卷组名称
pvs: 要加入到卷组中的物理卷列表
pesize: 指定pe大小,默认值是4M,默认单位是M。
state: 模块状态,absent代表删除,present代表新建,默认是present。

yum_repository

例子

- name: Add repository
yum_repository:
 name: epel
 description: EPEL YUM repo
 baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/

参数
name: 指定repository ID。
description: 软件源的描述信息。
file: 保存repo信息的文件(不用加.repo后缀);如果不指定,默认保存在以name命名的repo文件中。
baseurl: repodata文件的URL。
state: present(默认)或absent。
mirrorlist: mirrorlist是一个包含多个baseurl的列表文件,这里指定的是mirrorlist文件的URL。
gpgcheck: yes|no,是否需要对该软件源的程序包进行GPG校验。没有默认值,如果不设置,将会延用/etc/yum.conf中的配置,或者系统默认的no。

package_facts

例子

- name: take installed package
package_facts:
 manager: auto

- name: list installed package
debug:
 var: ansible_facts.packages

参数
manager: auto/rpm/apt/portage/pkg/pacman/apk,默认auto;表示系统使用的包管理器,auto表示自动判断包管理器类型

strategy:first/all,默认first;如何查询系统上的程序包管理器。 first意味着它将仅返回有关第一个受支持的程序包管理器的信息。 all 将返回系统上所有受支持的可用软件包管理器的信息。

package

例子

- name: install package mariadb
package:
 name:
   - mariadb-server
 state: latest

参数
name: 指定要安装的软件包名
state: present/absent;present 安装 absent 卸载

yum/dnf

例子

- name: install service chrony
dnf:
 name:
  - chrony

参数
name: 用于指定需要管理的软件包,比如 chrony。
state: 状态 present,installed,removed,latest,absent;默认为present;installed and present等效;latest标志安装yum中最新版本;absent and removed 等效,表示删除安装包。
disable_gpg_check: 用于禁用rmp包的公钥gpg验证,默认值no,表示不做验证,设置为yes 表示禁用验证,即不验证包,直接安装。在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装。
enablerepo: 用于指定安装软件包是临时启用的yum源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
Disablerepo: 用于指定安装软件包是临时禁止用的yum源。当多个yum源中同时存在要安装的软件包时,可以使用此参数临时禁用某个源

mount

例子

- name: mount media
mount:
 src=/dev/sr0
 path=/media
 state=mounted
 fstype=iso9660

参数
src: 定义挂载内容
path: 设备挂载至本地的路径,必须指定
fstype: 挂载的文件系统类型,xfs、nfs...,必须指定
opts: 挂载的参数,defaults、ro...
state: 挂载的状态,absent/mounted/unmounted;mounted进行挂载,修改/etc/fstab信息,unmounted临时卸载,不修改/etc/fstab信息,absent永久性卸载,并修改 /etc/fstab信息

其他

main.yml

例子

# cat main.yml 
- import_tasks: kube-proxy_cfg.yml 

参数

import_tasks:静态加载,playbook在运行一开始解析的时候,加载子任务中全部变量;

include_tasks:动态加载,playbook在执行到该子任务的时候,才会加载该子任务中全部变量;

补充:import_tasks调用的子任务文件名称不可以使用变量,但是include_tasks调用的子任务名称则可以加变量;import_tasks会调用子任务中的所有tag,使用–list-tags参数时也能看到,但是include_tasks调用的子任务中如果定义了tag,则不会生效。

常用的通用参数

忽略错误

ignore_errors: True

打标签

tags: kube-proxy_cfg

输出结果

register: result3
- debug:
 var: result3.stdout

判断后输出结果

  debug:
    msg: "NetworkManager版本:{{ansible_facts.packages['NetworkManager'][0].version}}"
  when: "'NetworkManager' in ansible_facts.packages" 
  # 如果NetworkManager在已安装列表中,显示NetworkManager的版本

循环参数

 line: "{{ item }}"
with_items:
 - '* soft nofile 655360'
 - '* hard nofile 131072'
 - '* soft nproc 655350'
 - '* hard nproc 655350'
 - '* soft memlock unlimited'
 - '* hard memlock unlimited'

使用root或者sudoer的权限

  become: yes

如何查询模块的用法和写法

执行命令ansible-doc 「ansiblem模块名称」,然后输入「/EXAMPLE(注意大写) 」回车键

$ ansible-doc user
/EXAMPLE

有关ansible常用模块(playbook)的更多相关文章

  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

随机推荐