如何基于systemd版本设置变量并合并Ansible配置任务?
合并Ansible配置任务的实现方案
当然可以将两个针对不同systemd版本的配置任务合并为一个,核心思路是先通过变量标识版本区间,再在单个配置任务中用条件判断动态生成对应内容。
步骤1:注册版本判断的布尔变量
首先执行命令获取systemd版本,再通过set_fact生成布尔变量区分版本是否≤245:
- name: 获取systemd版本号 command: systemctl --version | grep systemd | awk '{print $2}' register: systemd_version_raw changed_when: false # 标记该任务不会改变系统状态 - name: 设置版本判断布尔变量 set_fact: systemd_le_245: "{{ systemd_version_raw.stdout | int <= 245 }}"
步骤2:合并配置任务
有两种常用方式实现单任务动态配置:
方式一:使用Jinja2模板文件
创建模板文件templates/consul_resolved.conf.j2,在模板中加入条件判断:
{% if systemd_le_245 %} # 适配systemd 245及更早版本的配置 DNS=127.0.0.1 Domains=~consul {% else %} # 适配systemd 246及以上版本的配置 DNS=127.0.0.1 Domains=~consul ResolveUnicastSingleLabel=yes {% endif %}
然后编写单个Ansible任务调用模板:
- name: 配置consul resolved文件 template: src: consul_resolved.conf.j2 dest: /etc/systemd/resolved.conf.d/consul.conf mode: '0644' notify: 重启systemd-resolved # 配置变更后触发服务重启
方式二:直接在任务中内嵌内容(无需外部模板)
如果不想单独维护模板文件,可以直接在copy模块的content参数中用Jinja2条件生成配置:
- name: 配置consul resolved文件 copy: content: | {% if systemd_le_245 %} # 适配systemd 245及更早版本的配置 DNS=127.0.0.1 Domains=~consul {% else %} # 适配systemd 246及以上版本的配置 DNS=127.0.0.1 Domains=~consul ResolveUnicastSingleLabel=yes {% endif %} dest: /etc/systemd/resolved.conf.d/consul.conf mode: '0644' notify: 重启systemd-resolved
以上两种方式都能将原本的两个配置任务合并为一个,通过布尔变量systemd_le_245的取值自动匹配对应版本的配置内容。
内容的提问来源于stack exchange,提问作者Ciasto piekarz
相关产品推荐
相关产品推荐

