我创建了两个剧本:
- 将VM(centos8(部署到ESX中
- 将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
所需的所有变量,并填写剧本中的字段,然后运行剧本。
或者,如果可能的话,只在ansible
的可能性范围内。
有很多方法可以将变量发送到playbook。
让我们从这3个最受欢迎的选项开始:
env
变量ansible-playbook
CLI自变量- var文件
另请参阅所有22个选项:了解变量优先级
选项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