首页 > 解决方案 > Ansible 从 bash 读取变量

问题描述

我创建了 2 个剧本:

  1. 将 VM(centos8) 部署到 ESX
  2. 将 VM 加入 AD

它们里面有很多变量,这些变量只对一个特定的虚拟机有用(除了关于 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从命令行部署所需的所有必要变量,并在剧本中填写字段,然后运行剧本。

或者,如果可能的话,只能在ansible可能性范围内进行。

标签: bashvariablescmdansible

解决方案


选项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:通过CLIargs传递 var

--extra-vars CLI您可以使用参数传递 Env var 值

对于您的情况:

剧本.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在剧本中使用

对于您的情况:

剧本.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 }}"

变量/变量.yml:

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

让我们把它们全部结合起来:

假设您有两个不同的环境:

  • staging用于暂存环境
  • prod用于生产环境

然后我们创建两个不同的vars文件:

变量/staging.yml

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

变量/prod.yml

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

剧本.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 }}"

用法

  • staging使用vars 运行剧本:ansible-playbook playbook.yml --extra-vars=staging

  • prod使用vars 运行剧本:ansible-playbook playbook.yml --extra-vars=prod


推荐阅读