我有两个 Ansible 角色,我们将它们称为postgres
和myservice
。
在我的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
提供组合默认值中的值相结合即可。