草庐IT

openstack victoria 对接华为存储OceanStor 5110 v5(Kunpeng)

牛角上的男孩 2023-04-05 原文

1. 环境

本文主要侧重于victoria 版本对接华为存储OceanStor 5110 v5(Kunpeng)的步骤记录和问题记录,云平台的部署等相关问题本文不做介绍

HOST OS:Ubuntu 20.04.3 LTS
OpenStack:victoria (kolla),详情如下:

kolla_base_distro: "centos"
kolla_install_type: "source"
openstack_release: "victoria"
openstack_tag: "victoria"

存储:华为存储OceanStor 5110 v5(Kunpeng),万兆交换机
网络:具备管理、业务、存储等隔离网络条件


2. 华为存储配置

华为存储上需要做三项配置:

  • 导入LICNESE文件,以支持cinder的对接
  • 创建资源资源池,用于OpenStack cinder对接,其中主机组、LUN组、主机、映射等均不用做
  • 配置管理地址和业务网络地址,分别用于API和业务使用

3. cinder配置

OpenStack的部署我们这里略过,直接介绍cinder配置相关信息,由于我们这块采用了kolla部署的openstack云平台,所以所有服务均运行于容器内,配置文件也通过映射模式映射到容器内的,配置文件(/etc/kolla/目录下)修改会有些差异,可根据各自的环境做适当调整。

github有华为openstack_cinder_driver配置文档:https://github.com/Huawei/OpenStack_Driver/tree/50ff55d2cad7d70bb4d26f5975326c2061556c41/ConfigDoc/zh
对接不同OpenStack版本的驱动代码:https://github.com/Huawei/OpenStack_Driver/tree/master/Cinder
cinder配置部分均在cinder-volume节点操作。

3.1 驱动下载导入

通过git clone https://github.com/Huawei/OpenStack_Driver.git 或者直接网页下载后解压,我们采用了当时最新的OpenStack_Driver-2.3.RC3

docker cp OpenStack_Driver-2.3.RC3 cinder_volume:/tmp
docker exec -it -u 0 cinder_volume bash
cd /tmp/OpenStack_Driver-2.3.RC3/Cinder/Victoria
mv * /var/lib/kolla/venv/lib/python3.6/site-packages/cinder/volume/drivers/huawei/

3.2 cinder_huawei_conf.xml

创建如下文件,并编辑如下

vim /etc/kolla/cinder-volume/cinder_huawei_conf.xml

<?xml version='1.0' encoding='UTF-8'?>
<config>
  <Storage>
    <Product>V5</Product>
    <Protocol>iSCSI</Protocol>
    <RestURL>https://x.x.x.x:8088/deviceManager/rest/</RestURL>
    <UserName>admin</UserName>
    <UserPassword>******</UserPassword>
  </Storage>
  <LUN>
    <LUNType>Thin</LUNType>
    <LUNCopySpeed>4</LUNCopySpeed>
    <StoragePool>xxx</StoragePool>
  </LUN>
  <iSCSI>
          <Initiator HostName="*" ALUA="1" FAILOVERMODE="3" SPECIALMODETYPE="0" PATHTYPE="0" TargetIP="y.y.y.y z.z.z.z"/>
  </iSCSI>
</config>

根据我们所采用的产品、协议和账号密码等填写Product、Protocol、RestURL,Username、Userpassword、StoragePool等信息,这些信息均在第二章所配置的。Userpassword项填写admin密码,RestURL项中的x.x.x.x填写管理地址,StoragePool项填写需要对接的资源池,TargetIP项填写业务地址。

3.3 config.json

添加cinder_huawei_conf.xml文件映射
vim /etc/kolla/cinder-volume/config.json

		...
        {
            "source": "/var/lib/kolla/config_files/cinder_huawei_conf.xml",
            "dest": "/etc/cinder/cinder_huawei_conf.xml",
            "owner": "cinder",
            "perm": "0700"
        },
        ...

3.4 cinder.conf

采用iSCSI协议,enabled_backends以逗号分割,可以接多个后端,我们仅用一个,如下:
vim /etc/kolla/cinder-volume/cinder.conf

[DEFAULT]
enabled_backends = huawei_backend
[huawei_backend]
volume_driver = cinder.volume.drivers.huawei.huawei_driver.HuaweiISCSIDriver
cinder_huawei_conf_file = /etc/cinder/cinder_huawei_conf.xml
volume_backend_name = huawei_backend
use_multipath_for_image_xfer = true
enforce_multipath_for_image_xfer = true

做完以上配置,重启服务

docker restart cinder_volume

4. multipath配置

存储(cinder-volume)和计算(nova-compute)节点都需要配置
针对存储配置多路径
vim /etc/kolla/multipathd/multipath.conf

defaults {
   user_friendly_names yes
   find_multipaths yes
}

blacklist {
  devnode "^sda$"
  devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
  devnode "^hd[a-z]"
  devnode "^sd[b-d]"
  devnode "^nbd*"
}

devices {
  device {
    vendor                            "HUAWEI"
    product                           "XSG1"
    path_grouping_policy              "group_by_prio"
    path_checker                      tur
    prio                              alua
    detect_checker                    no
    failback                          immediate
    path_selector                     "round-robin 0"
    dev_loss_tmo                      30
    fast_io_fail_tmo                  5
  }
}

5. 计算节点

配置nova-compute支持多路径及cpu_mode为透传
vim /etc/kolla/nova-compute/nova.conf

[libvirt]
volume_use_multipath = True
cpu_mode=host-passthrough

docker restart nova_compute

6. OpenStack使用后端存储

创建卷类型并关联后端如下:

cinder type-create huawei_backend
cinder type-key huawei_backend set volume_backend_name="huawei_backend"

通过cinder type-list获取存储后端信息,通过glance image-list获取镜像信息等:

cinder type-list
+--------------------------------------+----------------+---------------------+-----------+
| ID                                   | Name           | Description         | Is_Public |
+--------------------------------------+----------------+---------------------+-----------+
| 81a35e1a-70d5-4d19-9873-7c9a40cd7cda | huawei_backend | -                   | True      |
+--------------------------------------+----------------+---------------------+-----------+

创建卷(启动卷含image id,亦可创建空卷)选择对应的后端:

cinder create --volume-type 81a35e1a-70d5-4d19-9873-7c9a40cd7cda--image-id 678f7dab-2c3b-44d3-9f9e-b758ddc1cbe8 --name volume-with-huawei 200

7. 问题记录

  • 对接华为存储LICENSE invalid问题
    参看cinder-volume.log日志详情如下:
2022-04-10 10:53:06.985 103 ERROR oslo_messaging.rpc.server     raise exception.VolumeBackendAPIException(data=msg)
2022-04-10 10:53:06.985 103 ERROR oslo_messaging.rpc.server cinder.exception.VolumeBackendAPIException: Bad or unexpected response from the storage volume backend API: Create lun {'NAME': '7636c1b0-3c7e9475b344d8138b0476', 'PARENTID': '3', 'DESCRIPTION': 'volume-7636c1b0-dcfa-4703-aaab-a806a3bd2ae7', 'ALLOCTYPE': '1', 'CAPACITY': 20971520, 'ENABLESMARTDEDUP': False, 'ENABLECOMPRESSION': False, 'MIRRORPOLICY': '1'} error.
2022-04-10 10:53:06.985 103 ERROR oslo_messaging.rpc.server result: {'data': {}, 'error': {'code': 1077951771, 'description': 'The license format is incorrect or the feature included in the license file is invalid.', 'suggestion': 'Download a valid license file. If the problem persists, contact technical support engineers.'}}.

解决办法:找华为存储厂商,要LICENSE,然后通过存储页面导入LICENSE文件

  • 存储挂载Volume device not found at及重复initiator问题
    nova-compute日志详情如下:
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/var/lib/kolla/venv/lib/python3.6/site-packages/os_brick/utils.py", line 68, in _wrapper
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     return r.call(f, *args, **kwargs)
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/var/lib/kolla/venv/lib/python3.6/site-packages/tenacity/__init__.py", line 409, in call
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     do = self.iter(retry_state=retry_state)
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/var/lib/kolla/venv/lib/python3.6/site-packages/tenacity/__init__.py", line 368, in iter
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     raise retry_exc.reraise()
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/var/lib/kolla/venv/lib/python3.6/site-packages/tenacity/__init__.py", line 186, in reraise
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     raise self.last_attempt.result()
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/usr/lib64/python3.6/concurrent/futures/_base.py", line 425, in result
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     return self.__get_result()
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/usr/lib64/python3.6/concurrent/futures/_base.py", line 384, in __get_result
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     raise self._exception
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/var/lib/kolla/venv/lib/python3.6/site-packages/tenacity/__init__.py", line 412, in call
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     result = fn(*args, **kwargs)
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]   File "/var/lib/kolla/venv/lib/python3.6/site-packages/os_brick/initiator/connectors/iscsi.py", line 784, in _connect_multipath_volume
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]     raise exception.VolumeDeviceNotFound(device='')
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f] os_brick.exception.VolumeDeviceNotFound: Volume device not found at .
2022-04-12 11:42:40.852 7 ERROR nova.compute.manager [instance: 0f48b1a2-6365-4e90-abc9-9549bcb1956f]
2022-04-12 11:42:40.892 7 ERROR nova.volume.cinder [req-8036223c-164a-4bb4-9655-7889218a6567 5375c23f2bf445aa87b0518d3db820df 3e3013c5092b475980fd4e0fb9015bd7 - default default] Delete attachment failed for attachment dde284a2-1e4e-43c0-9610-6d9abea24fcb. Error: Volume attachment could not be found with filter: attachment_id = dde284a2-1e4e-43c0-9610-6d9abea24fcb. (HTTP 404) (Request-ID: req-0cbfdf63-5749-4302-a512-2aaf85c0002e) Code: 404: cinderclient.exceptions.NotFound: Volume attachment could not be found with filter: attachment_id = dde284a2-1e4e-43c0-9610-6d9abea24fcb. (HTTP 404) (Request-ID: req-0cbfdf63-5749-4302-a512-2aaf85c0002e)
2022-04-12 11:42:40.964 7 ERROR oslo_messaging.rpc.server [req-8036223c-164a-4bb4-9655-7889218a6567 5375c23f2bf445aa87b0518d3db820df 3e3013c5092b475980fd4e0fb9015bd7 - default default] Exception during message handling: os_brick.exception.VolumeDeviceNotFound: Volume device not found at .

cinder-volume.log日志详情如下:

2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     conn = self.initialize_connection(volume, properties)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "<decorator-gen-763>", line 2, in initialize_connection
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/cinder/coordination.py", line 151, in _synchronized
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     return f(*a, **k)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/cinder/volume/drivers/huawei/huawei_driver.py", line 70, in initialize_connection
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     self.configuration)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/cinder/volume/drivers/huawei/huawei_flow.py", line 2475, in initialize_iscsi_connection
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     engine.run()
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/taskflow/engines/action_engine/engine.py", line 247, in run
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     for _state in self.run_iter(timeout=timeout):
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/taskflow/engines/action_engine/engine.py", line 340, in run_iter
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     failure.Failure.reraise_if_any(er_failures)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/taskflow/types/failure.py", line 339, in reraise_if_any
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     failures[0].reraise()
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/taskflow/types/failure.py", line 346, in reraise
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     six.reraise(*self._exc_info)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/usr/lib/python3.6/site-packages/six.py", line 703, in reraise
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     raise value
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/taskflow/engines/action_engine/executor.py", line 53, in _execute_task
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     result = task.execute(**arguments)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/cinder/volume/drivers/huawei/huawei_flow.py", line 1444, in execute
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     initiator, host_id, alua_info)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/cinder/volume/drivers/huawei/rest_client.py", line 613, in associate_iscsi_initiator_to_host
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     initiator, host_id)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils   File "/var/lib/kolla/venv/lib/python3.6/site-packages/cinder/volume/drivers/huawei/rest_client.py", line 93, in _assert_result
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils     raise exception.VolumeBackendAPIException(data=msg)
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils cinder.exception.VolumeBackendAPIException: Bad or unexpected response from the storage volume backend API: Add initiator iqn.1994-05.com.redhat:92a5f47e3aa5 to host 25 error.
2022-04-12 16:40:21.634 104 ERROR cinder.volume.volume_utils result: {'data': {}, 'error': {'code': 1077950338, 'description': 'The initiator has been added to another host.', 'suggestion': 'Specify a valid initiator and add it to the host.'}}.

解决办法:通过查看存储发现,挂载时候有两个启动器,且一个离线一个在线,绑定到离线的主机上了。而且由于是容器化部署,经过摸排发现是iscsid和nova_compute容器里面InitiatorName不一致导致的,每个计算节点又是同一个InitiatorName,故每个节点InitiatorName需要重新生成,且保证iscsid和nova_compute里面InitiatorName一致。
具体操作如下:

docker exec -it -u 0 iscsid bash
echo "InitiatorName=`/sbin/iscsi-iname`" > /etc/iscsi/initiatorname.iscsi
exit

docker cp iscsid:/etc/iscsi/initiatorname.iscsi /opt
docker cp /opt/initiatorname.iscsi nova_compute:/etc/iscsi/initiatorname.iscsi
docker restart iscsid nova_compute
  • 基于镜像创建卷signature_verified问题
    执行从镜像创建卷,镜像拷贝一段时间后报错:Failed to copy metadata
    to volume: Glance metadata cannot be updated, key signature_verified exists for
    volume id b75f957c-0ba4-4099-8706-866c68012779,最终导致创建卷失败。
    解决办法:
vim /etc/kolla/cinder-volume/cinder.conf
[DEFAULT]
verify_glance_signatures = disabled

docker restart cinder_volume

  • 调整实例大小报危险,发生错误稍后重试
    查看horizon日志/var/lib/docker/volumes/kolla_logs/_data/horizon/horizon.log如下:
    解决办法:
    https://review.opendev.org/c/openstack/horizon/+/829686/

  • 虚拟机热迁移same host问题
    nova-compute日志报错:

ERROR nova.virt.libvirt.driver [req-acade39d-5762-4ba6-809b-883d55323aff - - - - -] [instance: ae3d9d67-1520-4ebd-b1e3-891a7a53a291] Live Migration failure: internal error: Attempt to migrate guest to the same host 03000200-0400-0500-0006-000700080009: libvirt.libvirtError: internal error: Attempt to migrate guest to the same host 03000200-0400-0500-0006-000700080009

解决办法:
各计算节点通过uuidgen生成UUID
vim /etc/kolla/nova-libvirt/libvirtd.conf

host_uuid  = "c536f595-8eb8-4a72-a0da-46ceca198576"

docker restart nova_compute nova_libvirt


8. 参考文献

https://github.com/Huawei/OpenStack_Driver/tree/master/Cinder
https://github.com/Huawei/OpenStack_Driver/tree/50ff55d2cad7d70bb4d26f5975326c2061556c41/ConfigDoc/zh
https://docs.openstack.org/cinder/queens/configuration/block-storage/drivers/huawei-storage-driver.html
https://blog.csdn.net/weixin_34111819/article/details/91730809

有关openstack victoria 对接华为存储OceanStor 5110 v5(Kunpeng)的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 华为常用命令 - 2

    system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100

  5. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  6. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  7. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  8. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  9. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  10. ruby - 如何存储和读取 RubyVM::InstructionSequence? - 2

    有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR

随机推荐