如何对 systemd 模板实例进行符号链接或别名?

如何对 systemd 模板实例进行符号链接或别名?

概括

如果我有一个 systemd 模板单元[email protected],我如何符号链接到特定模板实例或为特定模板实例创建别名,例如,它bar.service是 的快捷方式[email protected]

背景

我有几个由 docker-compose 运行的服务。

/var/docker-compose/nginx/docker-compose.yml
/var/docker-compose/nextcloud/docker-compose.yml
/var/docker-compose/diaspora/docker-compose.yml

为了使用 systemd 管理这些服务,我采用了使用模板单元的方法为了避免重复,因为所有 docker-compose 单元文件几乎都是相同的。

# /etc/systemd/system/[email protected]

[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Restart=always

WorkingDirectory=/var/docker-compose/%i

# Remove old containers, images and volumes
ExecStartPre=/usr/bin/docker-compose down -v
ExecStartPre=/usr/bin/docker-compose rm -fv
ExecStartPre=-/bin/bash -c 'docker volume ls -qf "name=%i_" | xargs docker volume rm'
ExecStartPre=-/bin/bash -c 'docker network ls -qf "name=%i_" | xargs docker network rm'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=%i_*" | xargs docker rm'

# Compose up
ExecStart=/usr/bin/docker-compose up %i

# Compose down, remove containers and volumes
ExecStop=/usr/bin/docker-compose down -v

[Install]
WantedBy=multi-user.target

目标

现在我想为各个服务提供别名或符号链接,以使启动和停止它们的时间更短。

而不是

systemctl stop docker-compose@nginx

我想输入:

systemctl stop nginx

什么不起作用

  • 我尝试创建一个符号链接:

    cd /etc/systemd/system
    ln -s [email protected] nginx.service
    

    但当nginx.service我想启动或停止它时却找不到。

  • 我尝试在模板单元中定义别名:

    [Install]
    Alias=%i.service
    

    但是,如果我理解正确的话,这是不允许这对我不起作用。

  • 我还没有找到一种方法来“导入”或“需要”基本单元文件并仅覆盖该WorkingDirectory行。然后,我可以创建单独的短文件,如下所示:

    # /etc/systemd/system/nginx.service
    
    [email protected]
    
    WorkingDirectory=/var/docker-compose/nginx
    

谢谢!

答案1

-我尝试根据以下内容使用包含破折号 ( ) 的单元名称所考虑的属性archlinux 手册页,并且它起作用了:

此外,对于包含破折号( )的单元名称-,也会搜索通过重复截断所有破折号后的单元名称而生成的目录集。具体来说,对于单位名称,foo-bar-baz.service不仅会搜索常规的插入目录foo-bar-baz.service.d/,还会搜索foo-bar-.service.d/foo-.service.d/

作为手册页的另一条注释:

除了单元文件之外,还可能存在foo.service“插入”目录。此目录中foo.service.d/带有后缀的所有文件.conf将按字母数字顺序合并,并在解析主单元文件本身后进行解析。

在我的工作示例中,这是我的单元搜索路径根目录下的文件的最终结构(即/etc/systemd/system/):

│    docker-a.service
│    docker-b.service  
│    docker-c.service
└─── docker-.service.d
    │    docker.conf
             

另外,docker.conf文件docker-a.service是:

# /etc/systemd/system/docker-.service.d/docker.conf

[Unit]
Description=We named our service [%j] service
After=network.target

[Service]
WorkingDirectory=/home/arman/%j
ExecStartPre=/bin/bash -c 'echo "The prestart command for %j was done!" >> log.txt'
ExecStart=/bin/bash -c 'echo "The start command for %j was done!" >> log.txt'

# /etc/systemd/system/docker-a.service

[Install]
WantedBy=multi-user.target
Alias=a.service

我通过以下步骤做到了:

  1. 首先,创建一个插入目录,如docker-.service.d单元搜索路径目录的根目录(例如/etc/systemd/system)。
  2. 然后,创建一个类似于创建的放置目录的.conf文件,并使用说明符在该文件中写入您的和部分:docker.conf[Unit][Service]%j

%j-:这是前缀名称的最后一个和末尾之间的字符串。

  1. 之后,在根搜索路径中的插入目录旁边为每一项想要的服务创建一个服务文件。它们应该只包含[Install]使用选项显式确定其别名的部分Alias。 (我也尝试将此部分也放入文件中docker.conf,但[Install]在服务启动时找不到该部分。)请注意,这些服务的名称应满足约束。
  2. 现在,如果您systemctl enable docker-{alias}.service为每个创建的服务运行,您将能够仅通过其{alias}.就是这样!

答案2

如何按原样接受该命令并仅使用命令行的 bash 别名:

文件~/.bash_aliases

alias nginx-stop="systemctl stop docker-compose@nginx"
alias nginx-start="systemctl start docker-compose@nginx"
alias nextcloud-stop="systemctl stop docker-compose@nextcloud"
alias nextcloud-start="systemctl start docker-compose@nextcloud"
alias diaspora-stop="systemctl stop docker-compose@diaspora"
alias diaspora-start="systemctl start docker-compose@diaspora"

答案3

以下解决方法不是 systemd 原生的,而是使用创建 systemd 服务文件耙文件

解决方法

这假设红宝石安装在主机系统上。

  1. 检查是否存在。在此文件中用作服务名称的变量,例如“nginx”。/etc/systemd/system/[email protected]%i

  2. 创建Rakefile一个/var/docker-compose/

    # /var/docker-compose/Rakefile
    
    TEMPLATE_SERVICE_FILE = "/etc/systemd/system/[email protected]"
    
    task :systemd_units do
      print "Creating systemd units:\n"
    
      Dir.glob("/var/docker-compose/*/docker-compose.yml").each do |compose_file|
        service_name = compose_file.split("/")[-2]
        unit_file = "/etc/systemd/system/#{service_name}.service"
        unit_file_content = File.read TEMPLATE_SERVICE_FILE
        unit_file_content.gsub! "%i", service_name
        File.write unit_file, unit_file_content
        print "#{unit_file}\n"
      end
    end
    
  3. rake从目录运行/var/docker-compose/

这将为每个服务明确创建一个单独的单元文件,例如/etc/systemd/system/nginx.service基于模板文件。/etc/systemd/system/[email protected]

优点:

  • systemctl start nginx作品
  • systemctl enable nginx作品
  • 选项卡补全工作

缺点:

  • rake当更改模板文件或从 docker-compose 目录添加/删除服务时,必须重新运行。

相关内容