使用 systemd ansible 启动多个进程

Raz*_*zor 4 ansible

我想用该systemd模块启动 N 个进程,假设我有以下服务:

# file: /etc/systemd/system/sleep@.service
[Service]
ExecStart=/bin/sleep 420

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我想用 systemd 模块启动 3 个进程:

- name: Start Systemd Unit
  systemd:
    name: 'sleep@{1..3}.service'
    state: 'started'
Run Code Online (Sandbox Code Playgroud)

上面的任务只创建一个编码过程sleep@\\x7b1..3\\x7d.service,我不知道如何不对字符串进行编码。ansible支持创建多个进程吗?如果没有,最简单的方法是什么?


我当前的解决方法定义了具有密钥的服务列表instances,使用“subelements我能够单独创建这些进程”。我认为有更好的方法。

app_systemd_services:
  - name: sleep
    instances: "{{ range(3) | list }}"
Run Code Online (Sandbox Code Playgroud)
- name: Ensure Systemd Units are started
  systemd:
    name: "{{ item.0.name }}@{{ item.1 }}.service"
    state: started
  loop: "{{ app_systemd_services | subelements('instances') }}" 
Run Code Online (Sandbox Code Playgroud)

Geo*_*lin 6

Ansible 不支持范围 (...)。使用with_items

- name: Start Systemd Unit
  systemd:
    name: 'sleep@{{ item }}.service'
    state: started
  with_items:
    - 1
    - 2
    - 3
Run Code Online (Sandbox Code Playgroud)

又一个不请自来的建议。如果您使用 systemd 模板,请使用.target带有依赖项的单位。

foo@.service应该说模板Wanted-by: foo.target,并且您可以通过它来管理它们systemctl stop/start/restart foo.target

  • 如今,建议使用“loop”而不是“with_items”:https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#comparing-loop-and-with (2认同)