Ansible从bash读取变量



我创建了两个剧本:

  1. 将VM(centos8(部署到ESX中
  2. 将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-playbookCLI自变量
  • 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-varsCLI参数传递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

最新更新