对依赖 Ansible 角色的“组合”默认变量进行惰性求值

对依赖 Ansible 角色的“组合”默认变量进行惰性求值

我有两个 Ansible 角色,我们将它们称为postgresmyservice

在我的postgres角色中,我定义了一些默认变量(在postgres/defaults/main.yml):

postgres_db: pgdb
postgres_user: postgres
postgres_systemd_docker_service_name: postgres_{{postgres_db}}

在我的postgres角色中,我从变量中创建一个 systemd 服务单元文件postgres_systemd_docker_service_name。这里的想法是,如果我想为多个服务运行多个 postgres docker 容器,我可以使用变量来区分它们postgres_db

然后我有了myservice角色,其中我依赖于postgres角色并覆盖一些默认变量。

在我的myservice/meta/main.yml

dependencies:
  - {role: docker}
  - role: postgres
    postgres_user: "myservice_user"
    postgres_password: "myservice_password"
    postgres_db: "myservice"

但是,当我运行使用该角色的剧本时myservice,它将创建我的 systemd 单元文件为postgres_pgdb(这是默认值)而不是postgres_myservice

如果我postgres_systemd_docker_service_name在我的myservice角色中使用该变量,它会被评估为postgres_myservice

有什么方法可以确保我的postgres角色中的复合变量以这样的方式进行评估,即我的myservice角色可以覆盖默认值?

答案1

尝试一个小例子,我发现(使用 Ansible 2.4)一个组合默认变量(即中的defaults/main.yml)只会在第一次使用该默认值时被插入。

示例,仅使用单个角色:

roles/certs/defaults/main.yml

---
certs_dir: /etc/pki/tls/certs
cert_files:
  - "{{ ssl_domain }}.crt"
  - "{{ ssl_domain }}.key"
  - "{{ ssl_domain }}_ca-bundle.crt"

roles/certs/tasks/main.yml

---
- name: Determine the subdomain for the current host
  command: hostname --domain
  register: domain_result

- name: Set domain name as fact
  set_fact:
    ssl_domain: "{{ domain_result.stdout.strip() }}"

- name: Download certificates
  get_url:
    url: "http://{{ intranet_certificate_host }}/{{ intranet_certificate_path }}/_.{{ ssl_domain }}/{{ item }}"
    dest: "{{ certs_dir }}"
  with_items: "{{ cert_files }}"

这会起作用。我发现这不涉及“依赖”角色,但由于事实在各个角色之间都如此,我几乎可以肯定这在各个角色之间也同样有效。因此,至少在我使用的版本中,惰性求值是默认行为,您只需将其与set_fact提供组合默认值中的值相结合即可。

相关内容