Ansible - 编辑 systemd 服务文件

Kdg*_*Dev 8 systemd ansible

systemd 模块:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/systemd_module.html

我正在寻找一种将条件添加到服务文件的方法。

例如:

ConditionPathIsMountPoint=/mnt/myreplication/path/
Run Code Online (Sandbox Code Playgroud)

这对于 docker 安装很有用,确保 docker 在所需的安装实际可用之前不会启动容器。

遗憾的是,Ansible 目前似乎不支持添加此功能。我的说法正确吗?我需要手动添加它还是使用lineinfile?或者还有其他方法吗?

编辑:这个问题似乎正在获得观点,所以我将添加以下内容:

https://askubuntu.com/questions/659267/how-do-i-override-or-configure-systemd-services

这是我的另一个问题的答案:https://askubuntu.com/a/1348117/1612

引用一下:

不要编辑 /lib/systemd/ 或 /usr/share/systemd 中的文件,因为它们会在更新时被覆盖。

Pet*_*lák 14

让我发布一个ini_file对我有用的解决方案:

- name: Create a foo.service override directory
  file:
    owner: root
    group: root
    mode: 0755
    path: /etc/systemd/system/foo.service.d
    state: directory
- name: Set up foo.service override
  ini_file:
    dest: /etc/systemd/system/foo.service.d/bar_override.conf
    owner: root
    group: root
    mode: 0644
    section: Unit
    option: ConditionPathIsMountPoint
    value: /mnt/myreplication/path/
Run Code Online (Sandbox Code Playgroud)

这避免了重写原始服务文件,而是将专用覆盖添加到.d子目录中。

请注意,ini_file在周围添加空格,=如下所示

[Unit]
ConditionPathIsMountPoint = /mnt/myreplication/path/
Run Code Online (Sandbox Code Playgroud)

但这很好,请参阅systemd.syntax(7)

每个文件都是一个纯文本文件,分为多个部分,配置条目的样式为key=value. “=”之前或之后的空白将被忽略。


U88*_*80D 5

我的说法正确吗?

是的,systemd_module不是用于操作服务文件的。

由于我过去遇到过一些类似的问题,因此我想分享我的方法。

您可以维护自己的服务文件模板并部署它

- name: "Make sure the systemd service file is correct"
  template:
    src: "{{ MYSERVICE }}.service.j2"
    dest: "/etc/systemd/system/{{ MYSERVICE }}.service"
    mode: 0755
  tags: install,systemd
Run Code Online (Sandbox Code Playgroud)

或通过lineinfile_module添加必要的行

- name: "Make sure the entry in '{{ MYSERVICE }}.service' exists"
  lineinfile:
    path: "/etc/systemd/system/{{ MYSERVICE }}.service"
    line: "ConditionPathIsMountPoint=/mnt/myreplication/path/"
    state: present
  tags: install,systemd
Run Code Online (Sandbox Code Playgroud)

并重新加载并重新启动服务

- name: "Make sure the service is started and enabled via systemd"
  systemd:
    name: "{{ MYSERVICE }}"
    state: started
    enabled: yes
    daemon_reload: yes
  tags: install,systemd
Run Code Online (Sandbox Code Playgroud)

从而它可能很好用insertbeforeinsertafter也。

  • 是否有任何理由使用 `lineinfile` 而不是 [`ini_file`](https://docs.ansible.com/ansible/latest/collections/community/general/ini_file_module.html) 来处理到位的文件? (3认同)
  • 既然这正是 systemd 服务文件的样子,那么这似乎是一个更合适的解决方案,不是吗?这完全消除了使用 insertbefore 或 insertafter 的需要。 (3认同)

Kdg*_*Dev 1

编辑:这个问题似乎正在获得观点,所以我将添加以下内容:

https://askubuntu.com/questions/659267/how-do-i-override-or-configure-systemd-services

这是我的另一个问题的答案:https://askubuntu.com/a/1348117/1612

引用一下:

不要编辑 /lib/systemd/ 或 /usr/share/systemd 中的文件,因为它们会在更新时被覆盖。