bash - Ansible 从 bash 读取变量
问题描述
我创建了 2 个剧本:
- 将 VM(centos8) 部署到 ESX
- 将 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
可能性范围内进行。
解决方案
选项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
args传递 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