【问题标题】:Unable to run commands inside user_data in openstack heat template无法在 openstack heat 模板的 user_data 中运行命令
【发布时间】:2020-07-12 10:49:50
【问题描述】:

我想在服务器从 HOT 模板启动后运行一些命令。没有抛出任何错误; 'runcmd' 中的命令不起作用。

  Server02:
    type: OS::Nova::Server
    properties:
      name: { get_param: [SV_HOSTNAMES, 1] }
      flavor: { get_param: FLAVOR_N }
      image: { get_param: IMAGE_N }
      networks:
        - port: { get_resource: Server02_PRI_NET_ID_port }
        - port: { get_resource: Server02_SEC_NET_ID_port }
      config_drive: true
      user_data_format: RAW
      user_data:
        str_replace:
           template: |
               runcmd: |
                  #!/bin/sh
                  echo $ETH0_IP $NODENAME.vil.in >> /etc/hosts
                  rm -f /etc/sysconfig/network-scripts/ifcfg-eth0
                  echo -e "BOOTPROTO=static\nDEVICE=eth0\nIPADDR=$ETH0_IP\nPREFIX=24\nONBOOT=yes\nMTU=9000\nTYPE=Ethernet\nUSERCTL=no\nNMCONTROLLED=no" > /etc/sysconfig/network-scripts/ifcfg-eth0
                  rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
                  echo -e "BOOTPROTO=static\nDEVICE=eth1\nIPADDR=$ETH1_IP\nPREFIX=24\nONBOOT=yes\nMTU=9000\nTYPE=Ethernet\nUSERCTL=no\nNMCONTROLLED=no" > /etc/sysconfig/network-scripts/ifcfg-eth1
                  sync;sync;shutdown -r +1
           params:
              $NODENAME: { get_param: [SV_HOSTNAMES, 1] }
              $ETH0_IP: { get_attr: [Server02_PRI_NET_ID_port, fixed_ips, 0, ip_address] }
              $NETGW0: { get_attr: [Server02_PRI_NET_ID_port, subnets, 0, gateway_ip] }
              $NETCIDR0: { get_attr: [Server02_PRI_NET_ID_port, subnets, 0, cidr] } 
              $ETH1_IP: { get_attr: [Server02_SEC_NET_ID_port, fixed_ips, 0, ip_address] }
              $NETGW1: { get_attr: [Server02_SEC_NET_ID_port, subnets, 0, gateway_ip] }
              $NETCIDR1: { get_attr: [Server02_SEC_NET_ID_port, subnets, 0, cidr] } 
              $VOL0: {get_resource: Server02_VDB_VOL }

以下行按预期工作,但无法将参数传递给 cloud_config

  #*************************************************#
  #***********Instance Definition*****************#
  #*************************************************#
  vServer1:
    type: OS::Nova::Server
    properties:
      name: 
        str_replace:
           template: { get_param: sv_hostname }
           params:
             HOSTNAME: { get_param: sv_hostname }
      flavor: F_TestSmall
      image: rhel7-image
      networks:
        - port: { get_resource: port_instance1a }
        - port: { get_resource: port_instance1b }
      config_drive: true
      user_data_format: SOFTWARE_CONFIG
      user_data: {get_resource: root_config}
  #*************************************************#
  #***********Script Definition*****************#
  #*************************************************#
  root_config:
    type: OS::Heat::CloudConfig
    properties:
      cloud_config:
        ssh_pwauth: true
        disable_root: false
        chpasswd: { expire: False }
        write_files:
        - path: /tmp/test_script.sh
          permissions:  '0777'
          content: |
            #!/bin/bash
            rm -f /etc/sysconfig/network-scripts/ifcfg-eth0
            echo -e "BOOTPROTO=static\nDEVICE=eth0\nIPADDR=12.16.33.5\nNETMASK=255.255.255.0\nONBOOT=yes\nMTU=9000\nTYPE=Ethernet\nUSERCTL=no\nNMCONTROLLED=no" > /etc/sysconfig/network-scripts/ifcfg-eth0
            rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
            echo -e "BOOTPROTO=static\nDEVICE=eth1\nIPADDR=12.16.34.5\nNETMASK=255.255.255.0\nONBOOT=yes\nMTU=9000\nTYPE=Ethernet\nUSERCTL=no\nNMCONTROLLED=no" > /etc/sysconfig/network-scripts/ifcfg-eth1
            service network restart
            systemctl disable cloud-init.service
        runcmd:
            - sh /tmp/test_script.sh

我也试过删除 'runcmd' 并在 user_data 下执行命令,但没有成功。

【问题讨论】:

    标签: shell openstack ansible-template openstack-heat


    【解决方案1】:

    我对 HEAT 没有深入的了解,但也许这对你有帮助:

    https://ask.openstack.org/en/question/103576/how-to-pass-parameter-value-to-runcmd-in-osheatcloudconfig-resource/

    已经有人问过,是否可以将参数传递给cloud_config。在那里,它通过嵌入式模板解决了。因为cloud_config 适合您,所以这也可以解决您的问题。

    【讨论】:

      【解决方案2】:

      感谢您的回复。我已经尝试过这个选项,但不知何故它对我不起作用。但我确实在一小时前找到了解决方案,并且它奏效了。 100 种方法中的一种;可能第 50 个选项对我有用。 :)

        Server02:
          type: OS::Nova::Server
          properties:
            name: { get_param: [SV_HOSTNAMES, 1] }
            flavor: { get_param: FLAVOR_N }
            image: { get_param: IMAGE_N }
            networks:
              - port: { get_resource: Server02_PRI_NET_ID_port }
              - port: { get_resource: Server02_SEC_NET_ID_port }
            config_drive: true
            user_data_format: SOFTWARE_CONFIG
            user_data: {get_resource: root_config_02}
        root_config_02:
          type: OS::Heat::SoftwareConfig
          properties:
            config:
              str_replace: 
                params:
                   $NODENAME: { get_param: [SV_HOSTNAMES, 1] }
                   $ETH0_IP: { get_attr: [Server02_PRI_NET_ID_port, fixed_ips, 0, ip_address] }
                template: |
                  #!/bin/bash
                  hostnamectl set-hostname $NODENAME.vil.in
                  echo $ETH0_IP $NODENAME.vil.in >> /etc/hosts
      

      希望其他人觉得这有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多