Avaliação preguiçosa da variável padrão “composta” no papel dependente Ansible

3

Eu tenho dois papéis Ansible, vamos chamá-los de postgres e myservice .

Na minha função postgres , defino algumas variáveis padrão (em postgres/defaults/main.yml ):

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

Na minha função postgres , eu crio um arquivo de unidade de serviço systemd da variável postgres_systemd_docker_service_name . A ideia aqui é que, se eu quiser executar mais de um contêiner de postgres docker para vários serviços, posso distingui-los usando a variável postgres_db .

Depois, tenho o papel myservice , no qual dependo do papel postgres e sobrescrevo algumas das variáveis padrão.

No meu myservice/meta/main.yml :

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

No entanto, quando executo um manual que usa a função myservice , ele cria meus arquivos de unidade do systemd como postgres_pgdb (que é o valor padrão) em vez de postgres_myservice .

Se eu usar a variável postgres_systemd_docker_service_name na minha função myservice , ela será avaliada como postgres_myservice .

Existe alguma maneira de garantir que a variável composta na minha função postgres seja avaliada de tal forma que minha função myservice possa substituir os valores padrão?

    
por StFS 05.03.2017 / 19:08

1 resposta

1

Eu estava me fazendo a mesma pergunta novamente.

Tentando um pequeno exemplo, descobri que (usando Ansible 2.4) uma variável padrão composta (ou seja, que está no defaults/main.yml ) será interpolada somente quando o valor padrão for usado pela primeira vez.

Exemplo, usando apenas uma única função:

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 }}"

Isso funcionará. Vejo que isso não envolve um papel "dependente", mas, como os fatos funcionam assim em todos os papéis, estou certo de que isso também funcionará nos papéis. Então, pelo menos na versão que eu usei, a avaliação preguiçosa é o comportamento padrão, você só precisa combiná-la com set_fact para fornecer o valor que está dentro do padrão composto.

    
por 16.03.2018 / 15:02

Tags