通过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。