linux 启动AWS EC2示例时,cloud-init脚本中未执行`runcmd`

uqdfh47h  于 2023-05-28  发布在  Linux
关注(0)|答案(1)|浏览(590)

我想在EC2示例启动时创建2个用户并更改route 53记录。
在阅读this documentthis document之后,我将以下内容写入其 * 用户数据 * 部分。

#cloud-config
cloud_final_modules:
- [users-groups, always]
- [runcmd, always]
users:
- name: brian.lee
  ssh-authorized-keys:
  - ssh-ed25519 AAAAC3NzaC1lZ...
    brian.lee@3H1-01-987654.my-company.com
  groups:
  - wheel
  sudo:
  - ALL=(ALL) NOPASSWD:ALL
  shell: /bin/bash
- name: test.user
  ssh-authorized-keys:
  - ssh-ed25519 AAAAC3Nz...
    test.user@3H1-01-12345.my-company.com
  groups:
  - wheel
  sudo:
  - ALL=(ALL) NOPASSWD:ALL
  shell: /bin/bash

runcmd:
- echo aaa > /tmp/test.txt
- |
  export public_ip=$(/usr/bin/curl http://checkip.amazonaws.com)
  sudo sed -i "s|PUBLIC_IP|$public_ip|" /tmp/change_dns.json
- aws route53 change-resource-record-sets --hosted-zone-id B4QMKZ7DTDEZL1 --change-batch\
  file:///tmp/change_dns.json
write_files:
- path: /tmp/change_dns.json
  owner: root:root
  permissions: '0644'
  content: |-
    {
      "Comment": "redirect route53 record to this EC2",
      "Changes": [
        {
          "Action": "UPSERT",
          "ResourceRecordSet": {
            "Name": "bastion.my-company.com",
            "Type": "A",
            "TTL": 300,
            "ResourceRecords": [
              {
                "Value": "PUBLIC_IP"
              }
            ]
          }
        }
      ]
    }

用户创建成功,/tmp/change_dns.json文件也顺利创建。
但是runcmd部分根本不会执行。我甚至在EC2示例中找不到/tmp/test.txt
我检查了/var/log/cloud-init-output.log文件。但是我找不到任何与runcmd相关的错误。
我给EC2示例赋予了一个IAM角色,这样它就有权更改route 53记录。
有人知道为什么runcmd在我的cloud-init脚本中没有执行吗?

cgyqldqp

cgyqldqp1#

根据cloudinit的官方文档
注意:不要从cloud-init将文件写入/tmp,而应使用/run/somedir。早期 Boot 环境可能会争用systemd-tmpfiles-clean LP:#1707222.
尝试将输出文件更改为/tmp的其他位置;这符合你所说的,cloudinit日志中没有错误。
根据文档,runcmd步骤应在配置阶段而不是最后阶段运行
您将runcmd放入cloud_final_modules中,并期望在创建change_dns.json后在进程结束时运行,但实际情况并非如此;因此,您可能需要翻转runcmdwritefiles步骤,并首先运行writefiles,以便json文件为runcmd步骤做好准备。

相关问题