建议对RPM规范中的模板化.service / .conf文件

时间:2018-03-13 16:34:53

标签: templates service rpm specfiles

我们已经从.spec文件创建了RPM,其中包括为upstart和systemd(因此,.conf和.service)文件安装服务。但.conf和.service文件包含服务文件的硬连线路径。

myservice.service:

[Unit]
Description=My Service

[Service]
WorkingDirectory=/opt/myproduct
ExecStart=/opt/myproduct/myservice /opt/myproduct/myservicearg
Restart=always

[Install]
WantedBy=multi-user.target

myservice.conf:

description "My Service"

respawn
respawn limit 15 5

start on (stopped rc and runlevel [2345])
stop on runlevel [06]

chdir /opt/myproduct

exec /opt/myproduct/myservice /opt/myproduct/myservicearg

安装路径可能会改变,但强力搜索和替换似乎是石器时代。

我使用了Ansible和.j2(Jinja2)模板文件,这似乎是一种将变量用于二进制/脚本路径的好方法。使用它们可能看起来像这样:

myservice.service.j2:

[Unit]
Description=My Service

[Service]
WorkingDirectory={{ myproductpath }}
ExecStart={{ myproductpath }}/myservice {{ myproductpath }}/myservicearg
Restart=always

[Install]
WantedBy=multi-user.target

myservice.conf.j2:

description "My Service"

respawn
respawn limit 15 5

start on (stopped rc and runlevel [2345])
stop on runlevel [06]

chdir {{ myproductpath }}

exec {{ myproductpath }}/myservice {{ myproductpath }}/myservicearg

但我无法找到任何暗示这是构建RPM的常用方法。是否有建议的方法在RPM中模拟这些.conf和.service文件,在RPM构建期间或安装期间填写?

1 个答案:

答案 0 :(得分:1)

没有。 Rpm没有任何这样的模板工具。大多数开发人员更喜欢经典的sed:

%build
....
sed -i 's/{{ myproductpath }}/\/real\/path/g' myservice.conf.j2
mv myservice.conf.j2 myservice.conf

或者你可以BuildRequires: ansible并让ansible扩展它。但对于这项工作来说,这是一个非常重要的工具。