首页 > 解决方案 > 在 Ansible 中注册和使用多个变量

问题描述

我正在尝试弹出 VM 实例,将它们放入不同的主机组(例如 webservers 和 devops/admin 机器),并在一个剧本中安装它们所需的内容。

我不知道什么 IP 地址,例如,GCP 会给这些实例,所以我试图将它们捕获在一个变量中,以便稍后在剧本中使用。我可以使用“注册”很好地捕捉它们,但事实证明使用它们很棘手。例如,如果我这样做。

- name: création des adresses statiques
      gcp_compute_address:
          name: "{{ item }}"
          state: present
          region: "{{ region }}"
          project: "{{ gcp_project }}"
          auth_kind: "{{ gcp_cred_kind }}"
          service_account_file: "{{ gcp_cred_file }}"
          scopes:
            - https://www.googleapis.com/auth/compute
      loop:
        - adresse-1
        - adresse-2
        - adresse-3
        - adresse-4
        - adresse-5
      register: address

我后来想出使用这些变量的最佳方法是:

network_interfaces: 
      - network: "{{ network.name }}"
        access_configs:
        - name: 'External NAT'
          type: 'ONE_TO_ONE_NAT'
          nat_ip:
            - "{{ address.results[0].address }}"
            - "{{ address.results[1].address }}"
            - "{{ address.results[2].address }}"

失败得很惨。

请帮忙 ?如何使用我创建的地址范围?我要疯了

标签: ansible

解决方案


可以将_host添加到组网络服务器并继续下一场比赛

    - add_host:
        name: "{{ item }}"
        groups: webservers
      loop: "{{ address.results|json_query('[*].address') }}"
    - debug:
        msg: "{{ groups['webservers'] }}"

- hosts: webservers
  tasks:
    - name: Configure cluster
      ...

下面的任务将主机分为两组

- set_fact:
    my_hosts: "{{ address.results|json_query('[*].address') }}"
- add_host:
    name: "{{ item }}"
    groups: webservers1
  loop: "{{ my_hosts[0:(my_hosts|length / 2)|int] }}"
- add_host:
    name: "{{ item }}"
    groups: webservers2
  loop: "{{ my_hosts[(my_hosts|length / 2)|int:my_hosts|length] }}"
- debug:
    msg: "{{ groups['webservers1'] }}"
- debug:
    msg: "{{ groups['webservers2'] }}"

还有GCE 动态清单和其他 100 多个gcp 模块。您可能想从Google Cloud Platform Guide开始。


FWIW, Ansible 2 Cloud Automation Cookbook涵盖了领先的供应商,包括。GCP。


推荐阅读