jjzjj

杨校老师课堂之云计算私有云OpenStack框架快速搭建-详细搭建过程

杨校 2024-01-22 原文

更换镜像源为阿里云

  • 1 先安装 wget

    yum install -y wget
    
  • 2.打开https://developer.aliyun.com/mirror/ 访问阿里镜像资源网站,找到centOS

    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    
    或者
    
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    
    
  • 3.运行清除缓存

    [root@openstack ~]# yum clean all
    

  • 4.运行生成缓存

    [root@openstack ~]#  yum makecache
    

准备工作

  • 5.配置IP与主机名

    #配置IP地址
    [root@openstack ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
    #更新网卡操作
    [root@openstack ~]# systemctl restart network
    #配置主机名为openstack
    [root@openstack ~]# hostnamectl set-hostname openstack
    
  • 6.关闭防火墙和核心防护、取消开机自动运行

    #关闭防火墙
    [root@openstack ~]# systemctl stop firewalld
    #取消开机自动运行防火墙
    [root@openstack ~]# systemctl disable firewalld
    #关闭核心防护
    [root@openstack ~]# setenforce 0
    
    #取消开机自动运行核心防护
    [root@openstack ~]# vi /etc/sysconfig/selinux
    
    # 在selinux 文件内 ,将 SELINUX = enforce 更改为 disabled
    SELINUX=disabled
    
  • 7.关闭网络管理工具、取消开机自动运行

    #关闭网络管理工具
    [root@openstack ~]# systemctl stop NetworkManager
    
    #取消开机自动运行网络管理工具
    [root@openstack ~]# systemctl disable NetworkManager
    
  • 8.确保时间同步

    # 安装ntpdate服务
    [root@openstack ~]# yum install ntpdate -y
    
    # 同步阿里云时间
    [root@openstack ~]# ntpdate ntp.aliyun.com >> / var/log/ntpdate.log
    
    # 设置开机自动运行
    [root@openstack ~]# systemctl enable crond
    
  • 9.重启

    # 可以省略、跳过!
    # reboot
    

部署OpenStack

  • 1.安装PackStack服务软件

    # 在线更新openstack的镜像文件
    [root@openstack ~]#  yum -y install centos-release-openstack-train
    
    
  • 2.安装Packstack软件

    # 在线更新openstack-packstack的软件安装包
    [root@openstack ~]#  yum -y install openstack-packstack
    
  • 3.运行Packstack,以“All-in-One”方式安装OpenStack Train版本

    [root@openstack ~]#  packstack --allinone
    Installing:
    Clean Up                                             [ DONE ]
    Discovering ip protocol version                      [ DONE ]
    # 设置SSH密钥
    Setting up ssh keys                                  [ DONE ]
    # 准备服务器
    Preparing servers                                    [ DONE ]
    # 预安装Puppet并探测主机详情
    Pre installing Puppet and discovering hosts' details [ DONE ]
    # 准备预装的项目
    Preparing pre-install entries                        [ DONE ]
    # 设置证书
    Setting up CACERT                                    [ DONE ]
    # 准备AMQP(高级消息队列协议)项目
    Preparing AMQP entries                               [ DONE ]
    # 准备MariaDB(代替MySQL)数据库项目
    Preparing MariaDB entries                            [ DONE ]
    # 修正Keystone LDAP参数
    Fixing Keystone LDAP config parameters to be undef if empty[ DONE ]
    # 准备Keystone(身份服务)项目
    Preparing Keystone entries                           [ DONE ]
    # 准备Glance(镜像服务)项目
    Preparing Glance entries                             [ DONE ]
    # 检查Cinder(卷存储服务)是否有卷
    Checking if the Cinder server has a cinder-volumes vg[ DONE ]
    # 准备Cinder(卷存储服务)项目
    Preparing Cinder entries                             [ DONE ]
    # 准备Nova API(Nova接口)项目
    Preparing Nova API entries                           [ DONE ]
    # 为Nova迁移创建SSH密钥
    Creating ssh keys for Nova migration                 [ DONE ]
    Gathering ssh host keys for Nova migration           [ DONE ]
    Gathering ssh host keys for Nova migration           [ DONE ]
    # 准备Nova(计算服务)项目
    Preparing Nova Compute entries                       [ DONE ]
    Preparing Nova Scheduler entries                     [ DONE ]
    Preparing Nova VNC Proxy entries                     [ DONE ]
    Preparing OpenStack Network-related Nova entries     [ DONE ]
    Preparing Nova Common entries                        [ DONE ]
    # 准备Neutron(网络)项目
    Preparing Neutron API entries                        [ DONE ]
    Preparing Neutron L3 entries                         [ DONE ]
    Preparing Neutron L2 Agent entries                   [ DONE ]
    Preparing Neutron DHCP Agent entries                 [ DONE ]
    Preparing Neutron Metering Agent entries             [ DONE ]
    # 检查NetworkManager是否启用并运行
    Checking if NetworkManager is enabled and running    [ DONE ]
    # 准备OpenStack客户端项目
    Preparing OpenStack Client entries                   [ DONE ]
    # 准备Horizon仪表板项目
    Preparing Horizon entries                            [ DONE ]
    # 准备Swift(对象存储服务)项目
    Preparing Swift builder entries                      [ DONE ]
    Preparing Swift proxy entries                        [ DONE ]
    Preparing Swift storage entries                      [ DONE ]
    # 准备Gnocchi(用于计量的时间序列数据库服务器)项目
    Preparing Gnocchi entries                            [ DONE ]
    # 准备Redis(用于计量的数据结构服务器)项目
    Preparing Redis entries                              [ DONE ]
    # 准备Ceilometer(计量服务)项目
    Preparing Ceilometer entries                         [ DONE ]
    # 准备Aodh(警告)项目
    Preparing Aodh entries                               [ DONE ]
    # 准备Puppet模块和配置清单
    Preparing Puppet manifests                           [ DONE ]
    Copying Puppet modules and manifests                 [ DONE ]
    # 应用控制节点(测试时可能需要较长时间,可以考虑先开一局王者~)
    Applying 192.168.101.166_controller.pp
    192.168.101.166_controller.pp:                        [ DONE ]           
    # 应用网络节点(测试时可能需要较长时间,可以考虑先开一局王者~)
    Applying 192.168.101.166_network.pp
    192.168.101.166_network.pp:                           [ DONE ]        
    # 应用计算节点(测试时可能需要较长时间,可以考虑先开一局王者~)
    Applying 192.168.101.166_compute.pp
    192.168.101.166_compute.pp:                           [ DONE ]        
    # 应用Puppet配置清单
    Applying Puppet manifests                            [ DONE ]
    Finalizing                                           [ DONE ]
    # 安装成功,完成应用并给出其他提示信息
     **** Installation completed successfully ******
    Additional information:
    # 提示网络已采用OVN Neutron后端
     * Parameter CONFIG_NEUTRON_L2_AGENT: You have chosen OVN Neutron backend. Note that this backend does not support the VPNaaS or FWaaS services. Geneve will be used as the encapsulation method for tenant networks
    # 执行命令产生的应答文件
     * A new answerfile was created in: /root/packstack-answers-20220415-231639.txt
    # 未安装时间同步,需要确认CentOS当前的系统时间是否正确,如果不正确,则需要修改
     * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.
    # 在用户主目录下产生keystonerc_admin文件,要使用命令行工具需要使用它作为授权凭据
     * File /root/keystonerc_admin has been created on OpenStack client host 192.168.101.166. To use the command line tools you need to source the file.
    # 访问OpenStack Dashboard(Web访问界面),请使用keystonerc_admin中的登录凭据
     * To access the OpenStack Dashboard browse to http://192.168.101.166/dashboard .
    Please, find your login credentials stored in the keystonerc_admin in your home directory.
    # 安装日志文件名及其路径
     * The installation log file is available at: /var/tmp/packstack/20220415-231639-wZEI2M/ openstack-setup.log
    # Puppet配置清单路径
     * The generated manifests are available at: /var/tmp/packstack/20220415-231639- wZEI2M/manifests
    # 在命令行中执行以下命令,获取OpenStack主要组件Nova的当前安装版本。
    
    

访问

  • 切换到根路径

    [root@openstack log]# cd
    [root@openstack ~]# ll
    总用量 64
    -rw-------. 1 root root  1317 416 2022 anaconda-ks.cfg
    -rw-------. 1 root root   373 416 10:52 keystonerc_admin
    -rw-------. 1 root root   318 416 10:52 keystonerc_demo
    -rw-------. 1 root root 51769 416 10:41 packstack-answers-20220416-104111.txt
    
  • 查看keystonerc_admin文件

    unset OS_SERVICE_TOKEN
    	# 系统用户名![2022-04-16_112200](C:\Users\Administrator\Desktop\2022-04-16_112200.png)是admin
        export OS_USERNAME=admin
        # 系统密码是 ce0612847f2442ad
        export OS_PASSWORD='ce0612847f2442ad'
        export OS_REGION_NAME=RegionOne
         # 系统访问入口是 http://192.168.6.168
        export OS_AUTH_URL=http://192.168.6.168:5000/v3
        export PS1='[\u@\h \W(keystone_admin)]\$ '
        
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_IDENTITY_API_VERSION=3
    
    

  • 打开浏览器,访问http://192.168.6.168

    ### 更换镜像源为阿里云

  • 1 先安装 wget

    yum install -y wget
    
  • 2.打开https://developer.aliyun.com/mirror/ 访问阿里镜像资源网站,找到centOS

    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    
    或者
    
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    
    
  • 3.运行清除缓存

    [root@openstack ~]# yum clean all
    

  • 4.运行生成缓存

    [root@openstack ~]#  yum makecache
    

准备工作

  • 5.配置IP与主机名

    #配置IP地址
    [root@openstack ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
    #更新网卡操作
    [root@openstack ~]# systemctl restart network
    #配置主机名为openstack
    [root@openstack ~]# hostnamectl set-hostname openstack
    
  • 6.关闭防火墙和核心防护、取消开机自动运行

    #关闭防火墙
    [root@openstack ~]# systemctl stop firewalld
    #取消开机自动运行防火墙
    [root@openstack ~]# systemctl disable firewalld
    #关闭核心防护
    [root@openstack ~]# setenforce 0
    
    #取消开机自动运行核心防护
    [root@openstack ~]# vi /etc/sysconfig/selinux
    
    # 在selinux 文件内 ,将 SELINUX = enforce 更改为 disabled
    SELINUX=disabled
    
  • 7.关闭网络管理工具、取消开机自动运行

    #关闭网络管理工具
    [root@openstack ~]# systemctl stop NetworkManager
    
    #取消开机自动运行网络管理工具
    [root@openstack ~]# systemctl disable NetworkManager
    
  • 8.确保时间同步

    # 安装ntpdate服务
    [root@openstack ~]# yum install ntpdate -y
    
    # 同步阿里云时间
    [root@openstack ~]# ntpdate ntp.aliyun.com >> / var/log/ntpdate.log
    
    # 设置开机自动运行
    [root@openstack ~]# systemctl enable crond
    
  • 9.重启

    # 可以省略、跳过!
    # reboot
    

部署OpenStack

  • 1.安装PackStack服务软件

    # 在线更新openstack的镜像文件
    [root@openstack ~]#  yum -y install centos-release-openstack-train
    
    
  • 2.安装Packstack软件

    # 在线更新openstack-packstack的软件安装包
    [root@openstack ~]#  yum -y install openstack-packstack
    
  • 3.运行Packstack,以“All-in-One”方式安装OpenStack Train版本

    [root@openstack ~]#  packstack --allinone
    Installing:
    Clean Up                                             [ DONE ]
    Discovering ip protocol version                      [ DONE ]
    # 设置SSH密钥
    Setting up ssh keys                                  [ DONE ]
    # 准备服务器
    Preparing servers                                    [ DONE ]
    # 预安装Puppet并探测主机详情
    Pre installing Puppet and discovering hosts' details [ DONE ]
    # 准备预装的项目
    Preparing pre-install entries                        [ DONE ]
    # 设置证书
    Setting up CACERT                                    [ DONE ]
    # 准备AMQP(高级消息队列协议)项目
    Preparing AMQP entries                               [ DONE ]
    # 准备MariaDB(代替MySQL)数据库项目
    Preparing MariaDB entries                            [ DONE ]
    # 修正Keystone LDAP参数
    Fixing Keystone LDAP config parameters to be undef if empty[ DONE ]
    # 准备Keystone(身份服务)项目
    Preparing Keystone entries                           [ DONE ]
    # 准备Glance(镜像服务)项目
    Preparing Glance entries                             [ DONE ]
    # 检查Cinder(卷存储服务)是否有卷
    Checking if the Cinder server has a cinder-volumes vg[ DONE ]
    # 准备Cinder(卷存储服务)项目
    Preparing Cinder entries                             [ DONE ]
    # 准备Nova API(Nova接口)项目
    Preparing Nova API entries                           [ DONE ]
    # 为Nova迁移创建SSH密钥
    Creating ssh keys for Nova migration                 [ DONE ]
    Gathering ssh host keys for Nova migration           [ DONE ]
    Gathering ssh host keys for Nova migration           [ DONE ]
    # 准备Nova(计算服务)项目
    Preparing Nova Compute entries                       [ DONE ]
    Preparing Nova Scheduler entries                     [ DONE ]
    Preparing Nova VNC Proxy entries                     [ DONE ]
    Preparing OpenStack Network-related Nova entries     [ DONE ]
    Preparing Nova Common entries                        [ DONE ]
    # 准备Neutron(网络)项目
    Preparing Neutron API entries                        [ DONE ]
    Preparing Neutron L3 entries                         [ DONE ]
    Preparing Neutron L2 Agent entries                   [ DONE ]
    Preparing Neutron DHCP Agent entries                 [ DONE ]
    Preparing Neutron Metering Agent entries             [ DONE ]
    # 检查NetworkManager是否启用并运行
    Checking if NetworkManager is enabled and running    [ DONE ]
    # 准备OpenStack客户端项目
    Preparing OpenStack Client entries                   [ DONE ]
    # 准备Horizon仪表板项目
    Preparing Horizon entries                            [ DONE ]
    # 准备Swift(对象存储服务)项目
    Preparing Swift builder entries                      [ DONE ]
    Preparing Swift proxy entries                        [ DONE ]
    Preparing Swift storage entries                      [ DONE ]
    # 准备Gnocchi(用于计量的时间序列数据库服务器)项目
    Preparing Gnocchi entries                            [ DONE ]
    # 准备Redis(用于计量的数据结构服务器)项目
    Preparing Redis entries                              [ DONE ]
    # 准备Ceilometer(计量服务)项目
    Preparing Ceilometer entries                         [ DONE ]
    # 准备Aodh(警告)项目
    Preparing Aodh entries                               [ DONE ]
    # 准备Puppet模块和配置清单
    Preparing Puppet manifests                           [ DONE ]
    Copying Puppet modules and manifests                 [ DONE ]
    # 应用控制节点(测试时可能需要较长时间,可以考虑先开一局王者~)
    Applying 192.168.101.166_controller.pp
    192.168.101.166_controller.pp:                        [ DONE ]           
    # 应用网络节点(测试时可能需要较长时间,可以考虑先开一局王者~)
    Applying 192.168.101.166_network.pp
    192.168.101.166_network.pp:                           [ DONE ]        
    # 应用计算节点(测试时可能需要较长时间,可以考虑先开一局王者~)
    Applying 192.168.101.166_compute.pp
    192.168.101.166_compute.pp:                           [ DONE ]        
    # 应用Puppet配置清单
    Applying Puppet manifests                            [ DONE ]
    Finalizing                                           [ DONE ]
    # 安装成功,完成应用并给出其他提示信息
     **** Installation completed successfully ******
    Additional information:
    # 提示网络已采用OVN Neutron后端
     * Parameter CONFIG_NEUTRON_L2_AGENT: You have chosen OVN Neutron backend. Note that this backend does not support the VPNaaS or FWaaS services. Geneve will be used as the encapsulation method for tenant networks
    # 执行命令产生的应答文件
     * A new answerfile was created in: /root/packstack-answers-20220415-231639.txt
    # 未安装时间同步,需要确认CentOS当前的系统时间是否正确,如果不正确,则需要修改
     * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.
    # 在用户主目录下产生keystonerc_admin文件,要使用命令行工具需要使用它作为授权凭据
     * File /root/keystonerc_admin has been created on OpenStack client host 192.168.101.166. To use the command line tools you need to source the file.
    # 访问OpenStack Dashboard(Web访问界面),请使用keystonerc_admin中的登录凭据
     * To access the OpenStack Dashboard browse to http://192.168.101.166/dashboard .
    Please, find your login credentials stored in the keystonerc_admin in your home directory.
    # 安装日志文件名及其路径
     * The installation log file is available at: /var/tmp/packstack/20220415-231639-wZEI2M/ openstack-setup.log
    # Puppet配置清单路径
     * The generated manifests are available at: /var/tmp/packstack/20220415-231639- wZEI2M/manifests
    # 在命令行中执行以下命令,获取OpenStack主要组件Nova的当前安装版本。
    
    

访问

  • 切换到根路径

    [root@openstack log]# cd
    [root@openstack ~]# ll
    总用量 64
    -rw-------. 1 root root  1317 416 2022 anaconda-ks.cfg
    -rw-------. 1 root root   373 416 10:52 keystonerc_admin
    -rw-------. 1 root root   318 416 10:52 keystonerc_demo
    -rw-------. 1 root root 51769 416 10:41 packstack-answers-20220416-104111.txt
    
  • 查看keystonerc_admin文件

    unset OS_SERVICE_TOKEN
    	# 系统用户名![2022-04-16_112200](C:\Users\Administrator\Desktop\2022-04-16_112200.png)是admin
        export OS_USERNAME=admin
        # 系统密码是 ce0612847f2442ad
        export OS_PASSWORD='ce0612847f2442ad'
        export OS_REGION_NAME=RegionOne
         # 系统访问入口是 http://192.168.6.168
        export OS_AUTH_URL=http://192.168.6.168:5000/v3
        export PS1='[\u@\h \W(keystone_admin)]\$ '
        
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_IDENTITY_API_VERSION=3
    
    

  • 打开浏览器,访问http://192.168.6.168

  • 输入用户名和密码

用户名: admin
密码: ce0612847f2442ad

有关杨校老师课堂之云计算私有云OpenStack框架快速搭建-详细搭建过程的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. ruby - 使用 Ruby,计算 n x m 数组的每一列中有多少个 true 的简单方法是什么? - 2

    给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in

  8. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  9. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  10. arrays - 计算数组中的匹配元素 - 2

    给定两个大小相等的数组,如何找到不考虑位置的匹配元素的数量?例如:[0,0,5]和[0,5,5]将返回2的匹配项,因为有一个0和一个5共同;[1,0,0,3]和[0,0,1,4]将返回3的匹配项,因为0有两场,1有一场;[1,2,2,3]和[1,2,3,4]将返回3的匹配项。我尝试了很多想法,但它们都变得相当粗糙和令人费解。我猜想有一些不错的Ruby习惯用法,或者可能是一个正则表达式,可以很好地回答这个解决方案。 最佳答案 您可以使用count完成它:a.count{|e|index=b.index(e)andb.delete_at

随机推荐