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(centos8)部署到ESX中
  • 将虚拟机加入广告
  • 其中有大量的变量,这些变量只对一个特定的VM有用(除了有关ESX的信息)

    我的问题是:

    是否有一种方法可以制作一个脚本,从命令行读取部署
    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 }}"
    
    用法
    • 使用
      staging
      vars运行剧本:
      ansible playbook playbook.yml——额外变量=暂存

    • 使用
      prod
      vars运行剧本:
      ansible playbook playbook.yml——额外变量=prod

    选项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 }}"
    
    用法
    • 使用
      staging
      vars运行剧本:
      ansible playbook playbook.yml——额外变量=暂存

    • 使用
      prod
      vars运行剧本:
      ansible playbook playbook.yml——额外变量=prod


    hi Yasen,非常感谢,现在已经很清楚了,所以我只需要使用另一个带有变量的yml文件,,,我想要的是,我可以通过脚本编辑这些yml变量,,,你知道,假设请求了新的VM,我执行脚本时将更改var.yml文件中的变量,然后运行deploy playbook,,,所以我根本不接触var.yml文件(仅当出现新变量时)…然后我可以运行:例如#./edit_prod.sh(它更改prod_var.yml中的变量)&&deploy.yml,,您认为这种方法正确吗?thxConsider
    选项2
    而不是您的方法:它应该更简单一点。hi Yasen,非常感谢,现在已经很清楚了,所以我只需要使用另一个带有变量的yml文件,,,我想要的是,我可以通过脚本编辑这些yml变量,您知道,假设新VM是根据请求,我执行脚本时将更改var.yml文件中的变量,然后运行deploy playbook,,,因此我根本不接触var.yml文件(仅当出现一些新变量时)…然后我可以运行:例如#./edit_prod.sh(它更改prod_var.yml中的变量)&&deploy.yml,,您认为这种方法正确吗?thxConsider
    选项2
    而不是您的方法:它应该更简单一点。