Ansible从bash读取变量
我创建了两个剧本:Ansible从bash读取变量,bash,variables,cmd,ansible,Bash,Variables,Cmd,Ansible,我创建了两个剧本: 将VM(centos8)部署到ESX中 将虚拟机加入广告 其中有大量的变量,这些变量只对一个特定的VM有用(除了有关ESX的信息) 我的问题是: 是否有一种方法可以制作一个脚本,从命令行读取部署VM所需的所有变量,并填充playbook中的字段,然后运行playbook 或者,如果可能,则仅在ansible可能性范围内进行 选项1:在剧本中使用lookup('env') 只需使用“{{lookup('env','env_VAR_NAME')}” 例如,对于您的情况: ---
VM
所需的所有变量,并填充playbook中的字段,然后运行playbook
或者,如果可能,则仅在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
参数传递环境变量值
对于您的情况:
---
- 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')}}"
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\u文件
对于您的情况:
---
- 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')}}"
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 }}"
---
- 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 }}"
vars/vars.yml:
---
hostname: "host.example.com"
让我们把它们结合起来:
假设您有两个不同的环境:
用于暂存环境暂存
用于生产环境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
hosts: localhost
gather_facts: no
become: yes
vars_files:
- "vars/vars.yml"
tasks:
- name: clone the template
vmware_guest:
hostname: "{{ hostname }}"
---
- 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 }}"
用法
- 使用
vars运行剧本:staging
ansible playbook playbook.yml——额外变量=暂存
- 使用
vars运行剧本:prod
ansible playbook playbook.yml——额外变量=prod
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
参数传递环境变量值
对于您的情况:
---
- 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')}}"
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\u文件
对于您的情况:
---
- 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')}}"
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 }}"
---
- 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 }}"
vars/vars.yml:
---
hostname: "host.example.com"
让我们把它们结合起来:
假设您有两个不同的环境:
用于暂存环境暂存
用于生产环境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
hosts: localhost
gather_facts: no
become: yes
vars_files:
- "vars/vars.yml"
tasks:
- name: clone the template
vmware_guest:
hostname: "{{ hostname }}"
---
- 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 }}"
用法
- 使用
vars运行剧本:staging
ansible playbook playbook.yml——额外变量=暂存
- 使用
vars运行剧本:prod
ansible playbook playbook.yml——额外变量=prod
选项2
而不是您的方法:它应该更简单一点。hi Yasen,非常感谢,现在已经很清楚了,所以我只需要使用另一个带有变量的yml文件,,,我想要的是,我可以通过脚本编辑这些yml变量,您知道,假设新VM是根据请求,我执行脚本时将更改var.yml文件中的变量,然后运行deploy playbook,,,因此我根本不接触var.yml文件(仅当出现一些新变量时)…然后我可以运行:例如#./edit_prod.sh(它更改prod_var.yml中的变量)&&deploy.yml,,您认为这种方法正确吗?thxConsider选项2
而不是您的方法:它应该更简单一点。