在 terraform 和 huaweicloudstack 提供商的帮助下,我使用特定的 ssh 密钥创建了 ECS 实例,但我无法使用密钥登录,也无法使用管理员密码登录。如果我通过 webconsole 手动创建机器,则一切正常。Webconsole 还显示正确的 ssh 密钥。
机器创建后还有什么需要做的吗?
resource "huaweicloudstack_compute_instance_v2" "testsrv" {
name = "basic"
flavor_name = "s3.small.1"
key_pair = "authorized-key"
admin_pass = "somepass"
security_groups = ["default", "base"]
availability_zone = "az1.dc0"
user_data = "#cloud-config\nhostname: basic\nfqdn: basic"
network {
port = huaweicloudstack_networking_port_v2.port_1.id
}
block_device {
uuid = huaweicloudstack_blockstorage_volume_v2.volume_1.id
source_type = "volume"
destination_type = "volume"
boot_index = 0
delete_on_termination = true
}
}
谢谢你的帮助。
答案1
快速解决方案-
config_drive: true
在实例中使用
原因:如果没有 config_drive: true,实例将尝试从网络获取配置。最新 centos 中内置的 cloudinit 版本有错误:
failed run of stage init
------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/cloudinit/cmd/main.py", line 652, in status_wrapper
ret = functor(name, args)
File "/usr/lib/python3.6/site-packages/cloudinit/cmd/main.py", line 362, in main_init
init.apply_network_config(bring_up=bool(mode != sources.DSMODE_LOCAL))
File "/usr/lib/python3.6/site-packages/cloudinit/stages.py", line 649, in apply_network_config
netcfg, src = self._find_networking_config()
File "/usr/lib/python3.6/site-packages/cloudinit/stages.py", line 636, in _find_networking_config
if self.datasource and hasattr(self.datasource, 'network_config'):
File "/usr/lib/python3.6/site-packages/cloudinit/sources/DataSourceOpenStack.py", line 115, in network_config
self.network_json, known_macs=None)
File "/usr/lib/python3.6/site-packages/cloudinit/sources/helpers/openstack.py", line 645, in convert_net_json
'Unknown network_data link type: %s' % link['type'])
ValueError: Unknown network_data link type: cascading
最新的 centos 内置版本为 18.5,但是 ubuntu 有 20.1,并且已经解决了这个错误,因此 cloudinit 运行时没有错误。
我之所以能够通过控制台手动启动实例,是因为华为的 openstack 使用 configdrive 模块,而不是网络。所以找到 cdrom 实际上是解决方案。
因此有两个选择:
- 使用 config_drive: true openstack 将生成 cd 驱动器并将其安装到实例中。很简单。
- 在 centos 中更新 cloud-init 手动启动实例,进入,更新 cloud-init,从实例创建映像,然后使用这个新映像。比较难。