我有两个 Ansible 角色,我们称它们为postgres
和myservice
。
在我的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
角色可以覆盖默认值的方式进行评估?
尝试一个小例子,我发现(使用 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
提供组合默认值内的值即可。
归档时间: |
|
查看次数: |
1520 次 |
最近记录: |