我不断发现,在 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 下的启动脚本来运行,然后在完成后它会自动删除最后一行?
答案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
模块来取得进一步的进展。