【问题标题】:Using vars together with template in Ansible在 Ansible 中使用 vars 和模板
【发布时间】:2023-04-08 02:38:01
【问题描述】:

尝试在我的模板中使用预定义变量时,我有点困惑。我的目的是我希望我的 template.xml 文件包含已在 vars yaml 文件中定义的正确信息。

例如,对于每个 namevm,每个模板都已经包含在 vars 文件中定义的每个信息。但不幸的是,当我运行我的 playbook 时,我收到以下错误消息,指出变量 'vmname' 未定义,我对此感到困惑。

你知道我错过了哪一部分吗?

TASK [createvm : modify db template] ********************************************
fatal: [127.0.0.1]: FAILED! => {
  "msg": "The task includes an option with an undefined variable. The error was : 'list object' has no attribute 'vmname'. The offending line appears to be:\n\n\n- name: modify db template\n  ^ here\n" }

我的剧本是什么样子的:

 - name: Prepare DB component
   hosts: 127.0.0.1
   connection: local
   roles:
     - { role: "createvm" }

我的角色/createvm/tasks/main.yml 是什么样的:

- name: modify db template
  template:
    src: template.xml
    dest: /home/synthesizer/{{ settings.vmname }}.xml
  vars:
    settings: "{{ dbserver }}"

- name: modify loadbalancer template
  template:
    src: template.xml
    dest: /home/synthesizer/{{ settings.vmname }}.xml
  vars:
    settings: "{{ loadbalancer }}"

- name: modify forwarder template
  template:
    src: template.xml
    dest: /home/synthesizer/{{ settings.vmname }}.xml
  vars:
    settings: "{{ forwarder }}"

这是角色/createvm/vars/main.yml 的样子:

loadbalancer:
  - vmname: elbi1
    memory: 1024
    cpu: 2
  - vmname: elbi2
    memory: 2048
    cpu: 3
forwarder:
  - vmname: efwe1
    memory: 1024
    cpu: 1
  - vmname: efwe2
    memory: 4096
    cpu: 3
dbserver:
  - vmname: dibi1
    memory: 1024
    cpu: 3
  - vmname: dibi2
    memory: 2048
    cpu: 1

最后这就是我的角色/createvm/templates/templates.xml 的样子:

<name>{{settings.vmname}}</name>
<memory unit='KiB'>{{settings.memory}}</memory>
<vcpu placement='static'>{{settings.cpu}}</vcpu>

【问题讨论】:

  • settings.namevm 对你有用吗?您可能需要检查 namevm 与 vmname 的使用情况。
  • @VladimirBotka 尝试更改为 settings.namevm 但仍然相同的错误列表对象没有属性“namevm”

标签: ansible ansible-template


【解决方案1】:

要遍历 vars 列表,您必须使用 loop 模块,以便您可以通过当前使用的点运算符访问列表中的各个元素。

您必须将tasks/main.yml 修改为:

---
- name: modify db template
  template:
    src: template.xml
    dest: "/home/synthesizer/ {{ db.vmname }}.xml"
  loop: "{{ dbserver }}"
  loop_control:
    loop_var: db

- name: modify loadbalancer template
  template:
    src: template.xml
    dest: "/home/synthesizer/{{ lb.vmname }}.xml"
  loop: "{{ loadbalancer }}"
  loop_control:
    loop_var: lb

- name: modify forwarder template
  template:
    src: template.xml
    dest: "/home/synthesizer/{{ fw.vmname }}.xml"
  loop: "{{ forwarder }}"
  loop_control:
    loop_var: fw

现在,您可以使用它遍历 vars 各个列表。希望这会有所帮助!

【讨论】:

  • 不错!我想这就是我需要的。我的下一个问题是,如何在我的 template.xml 中定义?
  • 你想在你的 template.xml 中定义什么
  • 我的意思是,我是否必须为每个 db、lb 和 fw 创建 3 个不同的 template.xml(但内容完全相同)?因为,如果我只使用一个 template.xml 并且只定义 {{ vmname }},它将产生另一条错误消息,说明要采用哪个 vmname
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2020-01-08
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多