在Ansible中注册和使用多个变量

时间:2019-08-05 16:44:29

标签: ansible

我正在尝试弹出VM实例,将它们放入不同的主机组(例如Web服务器和devops /管理机),并在一个单一的手册中安装它们所需的内容。

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

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

哪一个失败了。

请帮助?如何使用我创建的地址范围? 我为此感到发疯

1 个答案:

答案 0 :(得分:2)

可以add_host加入组 webservers 并进行下一个播放

    - 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 Dynamic Inventory和另外100多个gcp modules。您可能要从Google Cloud Platform Guide开始。


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