在预置 late_command 期间,Ansible 未找到 rsyslog.service

在预置 late_command 期间,Ansible 未找到 rsyslog.service

我不断发现,在 Ubuntu Bionic 预置文件中运行时,某些东西“就是不起作用” preseed/late_command。 (这同样适用于 Ubuntu Focal 的自动安装。)在这个特定情况下,我尝试运行 Ansible 角色(具体来说,适用于 Ansible STIG 的 Canonical Ubuntu 18.04 LTS)针对目标为late_command

d-i    preseed/late_command    string \
    in-target /usr/bin/curl -fsSL -o /opt/stig.zip {{ di_preseed.stig_role_url }}; \
    in-target /usr/bin/unzip -qq /opt/stig.zip -d /opt; \
    in-target /usr/bin/unzip -qq /opt/ubuntu1804STIG-ansible.zip -d /opt; \
    in-target /bin/sh -c -- 'cd /opt && ANSIBLE_LOG_PATH=/var/log/ansible.log /bin/sh enforce.sh'

这里enforce.sh只是一个包装ansible-playbook

在 Virtualbox 上使用 ISO 安装失败,原因如下:

Failed to run preseeded command ... <command> finished with exit code 2

我仍然可以以 身份登录到该框ubuntu并成为root。我看到 Ansible 已成功安装(它最初在 中指定pkgsel/include)。

然后我打开/var/log/installer/syslog目标并发现ansible-playbook找不到它rsyslog.service

在此处输入图片描述

这很令人困惑,因为rsyslog.service它肯定是在安装后启用并处于活动状态,我可以通过 来确认systemctl (status|is-active) rsyslog

因此,我在这里想要了解的是:

  • 为什么 Ansible 在安装过程中无法找到,rsyslog.service即使它似乎已启用?
  • 安装中有哪些不同因素导致某些东西似乎经常损坏或不可用?
  • 我是否最好将其作为 init.rc 下的启动脚本来运行,然后在完成后它会自动删除最后一行?

有关的:某些命令(例如 modprobe 或 usermod)在 Ubuntu 自动安装中作为后期命令失败

答案1

要记住的关键一点是,这些in-target命令是在环境中执行的chroot。它们不是在完全启动的系统中执行的,在该系统上,诸如 systemd 之类的核心进程正在运行且可用。

测试

我根据屏幕截图中的 STIG 任务设置了一个剧本,并从预置中运行它。我看到了与您相同的结果。

  • 剧本
---
- hosts: localhost
  gather_facts: no
  connection: local

  tasks:
    - name: check if rsyslog.service is installed
      shell: ! systemctl list-unit-files | grep "^rsyslog.service[ \t]\+"
      changed_when: False
      check_mode: no
      register: result
      failed_when: result.rc > 1

    - name: stigrule_219160_rsyslog_enable
      service:
        name: rsyslog.service
        enabled: "yes"
  • 部分预置文件
d-i pkgsel/include string ansible
d-i preseed/late_command string \
    wget -P /target/ http://REDACTED/my_playbook.yml ; \
    in-target ansible-playbook -i /dev/null -b -v /my_playbook.yml

Bionic 软件包 ansible2.5.1该版本的服务模块似乎执行了systemctl show rsyslog.service。这在 chroot 环境中不起作用。为了演示,如果我在安装程序环境中打开终端并运行,in-target systemctl show rsyslog.service则日志文件将显示输出

in-target: Running in chroot, ignoring request: show

潜在修复

我确实在 Ansible 2.3 中找到了补丁解决问题systemctl 在 chroot 环境中运行时将忽略命令。但这仅适用于模块systemd,而不适用于service模块。我更新了我的剧本,这确实运行成功。

---
- hosts: localhost
  gather_facts: no
  connection: local

  tasks:
    - name: check if rsyslog.service is installed
      shell: ! systemctl list-unit-files | grep "^rsyslog.service[ \t]\+"
      changed_when: False
      check_mode: no
      register: result
      failed_when: result.rc > 1

    - name: stigrule_219160_rsyslog_enable fixed
      systemd:
        name: rsyslog.service
        enabled: "yes"

因此,您可以通过将 STIG 任务从使用模块修改service为使用systemd模块来取得进一步的进展。

相关内容