通过system d服务在第一次引导时启动脚本

确保您已完成中描述的步骤 初始设置页面 在开始本教程之前。

在本教程中,我们将通过system d服务在第一次引导时运行脚本。我们将在前一个场景中的Butane配置中添加以下内容:

  • 在添加脚本 /usr/local/bin/public-ipv4.sh

  • 配置一个system d服务以在第一次引导时运行该脚本。

写剧本

让我们编写一个简单的脚本,它使用 icanhazip.com 要创建问题文件以在控制台上显示为登录前消息,请执行以下操作:

#!/bin/bash
echo "Detected Public IPv4: is $(curl https://ipv4.icanhazip.com)" > \
    /etc/issue.d/50_public-ipv4.issue

这在您可能具有不同公有和私有地址的云环境中可能很有用。

我们将此脚本存储到 /usr/local/bin/public-ipv4.sh 当我们对机器进行配置时。

编写system d服务

我们需要使用一个系统单元来调用上一节中的脚本。以下是我们想要的一种方式,即在第一次引导时执行,而不是再次:

[Unit]
Before=systemd-user-sessions.service
Wants=network-online.target
After=network-online.target
ConditionPathExists=!/var/lib/issuegen-public-ipv4

[Service]
Type=oneshot
ExecStart=/usr/local/bin/public-ipv4.sh
ExecStartPost=/usr/bin/touch /var/lib/issuegen-public-ipv4
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

我们将把这个单位称为 issuegen-public-ipv4.service 我们将在下一节中将其嵌入到Butane配置中。

写入Butane配置并转换为Ignition

现在,我们可以创建Butane配置,方法是将脚本和系统单元直接作为内联内容包含到系统/单元和存储/文件部分中。最终的Butane配置,存储在 services.bu ,将是:

variant: fcos
version: 1.4.0
systemd:
  units:
    - name: serial-getty@ttyS0.service
      dropins:
      - name: autologin-core.conf
        contents: |
          [Service]
          # Override Execstart in main unit
          ExecStart=
          # Add new Execstart with `-` prefix to ignore failure`
          ExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM
    - name: issuegen-public-ipv4.service
      enabled: true
      contents: |
        [Unit]
        Before=systemd-user-sessions.service
        Wants=network-online.target
        After=network-online.target
        ConditionPathExists=!/var/lib/issuegen-public-ipv4

        [Service]
        Type=oneshot
        ExecStart=/usr/local/bin/public-ipv4.sh
        ExecStartPost=/usr/bin/touch /var/lib/issuegen-public-ipv4
        RemainAfterExit=yes

        [Install]
        WantedBy=multi-user.target
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: |
          tutorial
    - path: /etc/profile.d/systemd-pager.sh
      mode: 0644
      contents:
        inline: |
          # Tell systemd to not use a pager when printing information
          export SYSTEMD_PAGER=cat
    - path: /etc/sysctl.d/20-silence-audit.conf
      mode: 0644
      contents:
        inline: |
          # Raise console message logging level from DEBUG (7) to WARNING (4)
          # to hide audit messages from the interactive console
          kernel.printk=4
    - path: /usr/local/bin/public-ipv4.sh
      mode: 0755
      contents:
        inline: |
          #!/bin/bash
          echo "Detected Public IPv4: is $(curl https://ipv4.icanhazip.com)" > \
              /etc/issue.d/50_public-ipv4.issue

然后转化为Ignition:

butane --pretty --strict services.bu --output services.ign

测试

与前面一样,我们将使用以下命令来引导实例:

# Setup the correct SELinux label to allow access to the config
chcon --verbose --type svirt_home_t services.ign

# Start a Fedora CoreOS virtual machine
virt-install --name=fcos --vcpus=2 --ram=2048 --os-variant=fedora-coreos-stable \
    --import --network=bridge=virbr0 --graphics=none \
    --qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/services.ign" \
    --disk=size=20,backing_store=${PWD}/fedora-coreos.qcow2

并在串口控制台上查看 Detected Public IPv4 就在您进入登录提示符之前,在串口控制台输出中显示:

[确定]已完成关于系统运行级别更改的UTMP更新。

Fedora CoreOS 32.20200715.3.0 X86_64(TtyS0)上的内核5.7.8-200.fc32.x86_64

SSH主机密钥:SHA256:1MdFJOw3JlNppvfcztG7k6EAWcLq1ktLnK9ftVybrOo(Ecdsa) SSH主机密钥:SHA256:bXD4Dfn2AdrHOdMJ3cfWLkcT+XTWUdaj8qb4KH+bu20(ED25519) SSH主机密钥:SHA256:crY6RMBzPLz/heXmYPX8fGRte+pbSihG9m9WyDyHgAo(Rsa) En2:192.168.122.136 fe80::5054:ff:fe74:611d Ignition:应用了用户提供的配置 没有由Ignition或Afterburn提供的SSH授权密钥 检测到的公共IPv4:IS 82.255.80.95 教程登录:CORE(自动登录)

[core@教程~]$

这项服务显示它已经成功上线:

[core@教程~]$system ctl状态—​完整问题根-公共-ipv4.service Issuegen-Public-ipv.service 已加载:已加载(/etc/systemd/system/issuegen-public-ipv.service;已启用;供应商预设:已启用) 激活:自Firi 2020-08-07 09:35:59 UTC以来激活(退出);57秒前 进程:1871 ExecStart=/usr/local/bin/public-ipv4.sh(code=已退出,状态=0/成功) 进程:1920 ExecStartPost=/usr/bin/ouch/var/lib/Issuegen-PUBLIC-IPV4(代码=已退出,状态=0/成功) 主PID:1871(代码=退出,状态=0/成功)

Aug 07 09:35:58教程系统d[1]:正在启动Issuegen-Public-ipv.service…​ 8月07日09:35:58教程公开-ipv4.sh[1874]:%总%收到%xferd平均速度时间时间当前时间 8月07日09:35:58教程公开-ipv4.sh[1874]:DLoad Upload总左侧速度 Aug 07 09:35:59教程公共-ipv4.sh[1874]:[158B BLOB数据] Aug 07 09:35:59教程系统d[1]:已完成发出-public-ipv.service。

清理

现在,让我们为下一个测试取下实例。首先,通过按断开与串行控制台的连接 CTRL + ] 然后摧毁机器:

病毒摧毁fcos 未定义病毒—​删除所有存储fcos

您现在可以继续进行 下一教程