Ansible systemd装载依赖项

Ansible systemd装载依赖项,ansible,systemd,Ansible,Systemd,我使用Ansible将systemd单元文件部署到estate中的所有服务器,并使其能够在引导时启动。在其中一些服务器上,单元文件中定义的二进制文件位于不同的文件系统上。这要求单元文件依赖于正在装入的文件系统。例如: [Unit] Description = Start the widget After = network.target usr.mount [Service] Type = simple ExecStart = /usr/bin/widget [Install] Wanted

我使用Ansible将systemd单元文件部署到estate中的所有服务器,并使其能够在引导时启动。在其中一些服务器上,单元文件中定义的二进制文件位于不同的文件系统上。这要求单元文件依赖于正在装入的文件系统。例如:

[Unit]
Description = Start the widget
After = network.target usr.mount

[Service]
Type = simple
ExecStart = /usr/bin/widget

[Install]
WantedBy = multi-user.target
目前,Ansible使用
Ansible.builtin.copy
模块将单元文件作为静态文件部署。如果
/usr
是挂载点,有没有办法将其转换为模板并在
之后将挂载点附加到
中?

只需使用模板任务,在src模板任务中,就有条件根据条件打印所需的块。您可以将一个变量传递给模板任务并根据它做出决定,即首先检查任务中是否需要该文件系统,然后根据模板任务生成文件。

Ansible fact Ansible\u mounts保留装载点列表。让我们使用以下变量进行测试

小部件:
-/usr/local/apps/widget
-/usr/share/apps/widget
-/scratch/apps/widget
我的可更换支架:
-安装:/
-安装:/boot/efi
-安装:/usr
-挂载:/usr/本地
根目录:
- /
创建小部件和相关挂载点的字典,例如

-设置事实:
_mlist:[]
-设定事实:
_mlist:“{{{u mlist+[{'dict':item.0,‘mount':item.1}]}”
使用嵌套的\u:
-“{{widgets}}”
-“{my_ansible_mounts | map(attribute='mount')| difference(root)}”
时间:item.0 | regex_搜索('^'~item.1)!=没有一个
-设定事实:
_MDCT:{}
-设定事实:
_mdict:{{{uMDICT}合并({item.0:item.1|
映射(属性='mount')|
映射('regex_replace'、'/'、'-')|
列表})}}”
循环:{{{u mlist}groupby('dict')}
给予

\u mdct:
/usr/local/apps/widget:
--usr
--usr本地
/usr/share/apps/widget:
--usr
那么流应该是琐碎的,例如

-调试:
味精:|-
{%如果_mdct[item]|默认值([])|长度>0%}
[单位]
Description=启动小部件
After=network.target{%fori in{u mdct[item]]}{{i[1::}}.mount{%endfor%}
{%endif%}
[服务]
类型=简单
ExecStart={{item}
循环:“{{widgets}}”
给予

ok:[localhost]=>(item=/usr/local/apps/widget)=>
味精:|-
[单位]
Description=启动小部件
After=network.target usr.mount usr-local.mount
[服务]
类型=简单
ExecStart=/usr/local/apps/widget
确定:[localhost]=>(item=/usr/share/apps/widget)=>
味精:|-
[单位]
Description=启动小部件
After=network.target usr.mount
[服务]
类型=简单
ExecStart=/usr/share/apps/widget
确定:[localhost]=>(项=/scratch/apps/widget)=>
味精:|-
[服务]
类型=简单
ExecStart=/scratch/apps/widget

要测试真正的东西,在代码中,用ansible_挂载替换my_ansible_挂载,并使小部件和主机符合您的需要。

是否自动将“/usr”转换为“usr.mount”,或者是否存在任何映射?e、 g.可能还有“/usr/local/”挂载点。@VladimirBotka它似乎通过替换/为-”来转换。例如/usr/local变为usr-local.mount。运行
systemctl list units--type=mount
将显示所有这些单元。