如何在没有 shell/命令模块的情况下为“systemctl set-defaultgraphic.target”编写 Ansible 任务

Ila*_*sky 6 ansible

我想在 Ansible 中编写一个任务来执行以下命令:

“systemctl set-default Graphical.target”,不使用 shell/命令模块。

不确定“ansible.builtin.systemd”模块是否有此选项。

TRW*_*TRW 8

您可以使用该command模块并使用一些魔法来为您的问题提供幂等解决方案。实际上没有具体的模块,并且给定的 systemd 模块的更改请求已关闭且未合并。

- name: "Get current systemd default"
  command: "systemctl get-default"
  changed_when: false
  register: systemdefault

- name: "Set default to graphical target"
  command: "systemctl set-default graphical.target"
  when: "'graphical' not in systemdefault.stdout"
Run Code Online (Sandbox Code Playgroud)

当然这需要使用命令。但是,当您知道何时需要使用命令时,没有什么不好的理由不使用命令。它看起来不太好——好吧。但最终,自定义模块也会在后台执行相同的操作,对于这样的“单一”问题可能有点复杂。实际上“链接”解决方案的作用是相同的,但有必要明确知道链接文件的位置(参见 Debian)。


小智 5

执行的时候systemctl set-default graphical.target可以看到这个日志

Removed symlink /etc/systemd/system/default.target. 
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
Run Code Online (Sandbox Code Playgroud)

然后您可以使用file模块创建符号链接,如下所示

- name: Change default target
  hosts: all
  become: yes
  gather_facts: no

  tasks:
  - name: Change default target to graphical.target
    file:
      src: /usr/lib/systemd/system/graphical.target
      dest: /etc/systemd/system/default.target
      state: link
Run Code Online (Sandbox Code Playgroud)

  • 在 Debian 系统上,目标文件存储在: /lib/systemd/system/ - 有没有办法知道目标目录在哪里,而无需对其进行硬编码? (2认同)