可从bash读取变量

问题描述 投票:0回答:1

早上好,

我想寻求帮助,

我创建了2本剧本:1.将VM(centos8)部署到ESX2.将VM加入AD

其中有很多变量,仅对一个特定的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的所有必要变量,并填充剧本中的字段,然后运行剧本。 (或者是否有可能使它尽可能地有限)

非常感谢。

variables cmd ansible playbook
1个回答
0
投票

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

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

针对您的情况:

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

用法

  • 运行带有staging变量的剧本:ansible-playbook playbook.yml --extra-vars=staging

  • 运行带有prod变量的剧本:ansible-playbook playbook.yml --extra-vars=prod

© www.soinside.com 2019 - 2024. All rights reserved.