Ansible чтение переменных из bash - PullRequest
1 голос
/ 06 апреля 2020

Я создал 2 пьесы:

  1. развертывание ВМ (centos8) в ESX
  2. присоединение ВМ к AD

Внутри них множество переменных, которые полезны только для одной конкретной c VM (кроме информации о ESX)

---
- name: create vm from template on ESX
  hosts: localhost
  gather_facts: no
  become: yes

  tasks:

  - name: clone the template
    vmware_guest:
      hostname:  "IP.."
      username: "user"
      password: "password"
      validate_certs: false
      name: ll-ansible
      template: ll
      datacenter: "LAB KE"
      folder: "OIR"
      resource_pool: "pool"
      cluster: "PROD cluster"
      networks:
        - name: IS-VLAN1102
          device_type: vmxnet3
          vlan: IS-VLAN1102
          ip: ip.ip.ip.ip
          netmask: 255.255.255.0
          gateway: gw.gw.gw.gw
      customization:
          hostname: ll-ansible
          timezone: timezone
          domain: domain
          dns_servers:
            - ip.ip.ip.ip
            - ip.ip.ip.ip
      disk:
        - size: 60gb
          type: default
          datastore: Dell-OIR
        - size: 10gb
          type: default
          datastore: Dell-OIR
      hardware:
        memory_mb: 4096
        num_cpus: 4
        num_cpu_cores_per_socket: 2
        boot-firmware: efi

      state: poweredon
      wait_for_ip_address: yes
    register: vm
  - debug: msg "{{ vm }}"

Мой вопрос:

Есть ли способ создать скрипт, который будет читать все необходимые переменные для разверните VM из командной строки и заполните поля в playbook, а затем запустите playbook.

Или, если возможно, сделать это только в пределах ansible возможностей.

1 Ответ

0 голосов
/ 06 апреля 2020

Вариант 1: используйте lookup('env') в пьесе

Просто используйте "{{ lookup('env', 'ENV_VAR_NAME')}}"

Например, для вашего случая:

---
- name: create vm from template on ESX
  hosts: localhost
  gather_facts: no
  become: yes

  tasks:

  - name: clone the template
    vmware_guest:
      hostname: "{{ lookup('env', 'IP_ADDRESS')}}"

Вариант 2: pass var через CLI args

Вы можете передать значение Env var, используя --extra-vars CLI аргумент

Для вашего случая:

playbook.yml

...
  - name: clone the template
    vmware_guest:
      hostname: "{{ ip_address }}"
      user: "{{ user }}"

использование:

 ansible-playbook playbook.yml --extra-vars="user={{ lookup('env', 'USER') }}, ip_address='10.10.10.10'" 

Вариант 3: используйте vars_files в playbook

Для вашего случая:

playbook.yml:

---
- name: create vm from template on ESX
  hosts: localhost
  gather_facts: no
  become: yes
  vars_files:
    - "vars/vars.yml"

  tasks:

  - name: clone the template
    vmware_guest:
      hostname: "{{ hostname }}"

vars / vars.yml:

---
hostname: "host.example.com"

Давайте объединим их все:

Предположим, у вас есть два разных окружения:

  • staging для постановки среда
  • prod для продуктивной среды

Затем мы создаем два разных vars файла:

vars / staging.yml

---
hostname: "staging.domain.com"

vars / prod.yml

---
hostname: "prod.domain.com"

playbook.yml:

---
- name: create vm from template on ESX
 y6uu hosts: localhost
  gather_facts: no
  become: yes
  vars_files:
    - "vars/{{ env }}.yml"

  tasks:

  - name: clone the template
    vmware_guest:
      hostname: "{{ hostname }}"

Использование

  • запустить playbook с staging vars: ansible-playbook playbook.yml --extra-vars=staging

  • запустить playbook с prod переменными: ansible-playbook playbook.yml --extra-vars=prod

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...