【问题标题】:How to define dictionary anchor before Ansible Playbook?如何在 Ansible Playbook 之前定义字典锚?
【发布时间】:2018-08-13 12:40:43
【问题描述】:

我在剧本中经常使用默认变量,我希望在剧本定义之前定义一个带有默认变量的字典,如下例所示:

# Playbook defaults
vars: &default_vars
  servicename: "{{ job.params.servicename }}"
  core_site: "{{cluster.config['core-site']}}"
  hdfs_site: "{{cluster.config['hdfs-site']}}"
  yarn_site: "{{cluster.config['yarn-site']}}"
  mapred_site: "{{cluster.config['mapred-site']}}"
  # ....

# Playbook 
- name: Install and Configure Namenode 
  hosts: HDFS.Namenode 
  gather_facts: no
  vars:
    <<: *default_vars 
    componentname: Namenode
  roles:
    - role: roles/hadoop

但似乎根据 YAML 语法,我无法在顶层同时定义 dict 和 list 。 如何在 Ansible Playbook 之前定义默认 vars 锚点?

【问题讨论】:

  • 什么“顶级列表”?在您的代码中看不到任何内容,也无法想象您的意思,vars 始终是字典。
  • @techraf,我的意思是,如果我将 YAML 作为列表启动(就像任何其他剧本一样),那么它就是顶层的列表。如果我将 YAML 作为字典启动,那么它就是字典。我不能在同一个 yaml 文件中混合 dict 和 list 定义。我在这里尝试过 - yaml-online-parser.appspot.com,但后来我得到了类似“预期 ,但发现'-'”的东西,这很明显,因为列表不能跟随 dict。

标签: ansible yaml


【解决方案1】:

您可以创建仅包含 vars 定义的“虚拟”播放。变量将作为播放范围被丢弃,但锚点将保持定义:

- name: Playbook defaults
  hosts: localhost
  connection: local
  gather_facts: false
  vars: &default_vars
    my_var1: value1
    my_var2: value2

- name: Install and Configure Namenode
  hosts: myhosts
  vars:
    <<: *default_vars
    my_var3: value3
  tasks:
    - debug:
        var: my_var1

结果:

ok: [myhost1] => {
    "my_var1": "value1"
}

【讨论】:

    【解决方案2】:

    您可以将默认值放入角色默认文件 (defaults/main.yml)。如需更多信息,请参阅Playbooks best practices

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多