依赖 Ansible 角色中“组合”默认变量的延迟评估

StF*_*tFS 5 ansible

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

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

postgres_db: pgdb
postgres_user: postgres
postgres_systemd_docker_service_name: postgres_{{postgres_db}}
Run Code Online (Sandbox Code Playgroud)

在我的postgres角色中,我从postgres_systemd_docker_service_name变量创建了一个 systemd 服务单元文件。这里的想法是,如果我想为多个服务运行多个 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"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tho*_*sch 2

尝试一个小例子,我发现(使用 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"
Run Code Online (Sandbox Code Playgroud)

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 }}"
Run Code Online (Sandbox Code Playgroud)

这会起作用。我认为这并不涉及“依赖”角色,但由于事实是跨角色的,我几乎可以肯定这也将跨角色发挥作用。因此,至少在我使用的版本中,惰性求值是默认行为,您只需将其与set_fact提供组合默认值内的值即可。