【问题标题】:How to override a playbook variable only for a single role如何仅针对单个角色覆盖剧本变量
【发布时间】:2019-12-22 21:47:35
【问题描述】:

我有一本这样的剧本:

- name: Install Services
  hosts: ['myhost']
  become: True

  environment: '{{ inventory__environment | d({})
                   | combine(inventory__group_environment | d({}))
                   | combine(inventory__host_environment  | d({})) }}'

  vars:
    # Use Python from Docker virtualenv on server
    ansible_python_interpreter: '/usr/bin/env docker-python'

  roles:
    - role: debops.netbase
      vars:
        # Use normal Python
        ansible_python_interpreter: '/usr/bin/env python'
      tags: [ 'role::netbase', 'skip::netbase' ]

  tasks:
    - name: Create Network for HTTP proxy
      docker_network:
        name: http-proxy
        internal: no
        ipam_config:
          - subnet: '172.42.0.0/24'
            gateway: '172.42.0.1'
        state: presen
    ...

如评论中所述,对于 docker 任务,我需要使用不同的 python 解释器。但是debops.netbase角色需要使用普通的python解释器。

通过上述设置,我希望实现这一目标。但是会发生什么:

  1. 角色使用/usr/bin/env python成功执行
  2. 第一个任务失败,因为它还使用/usr/bin/env python 而不是/usr/bin/env docker-python

我通过查看主机上的 tmp 文件检查了这一点。
从角色中删除 var 时,解释器成功设置为 /usr/bin/env docker-python(角色失败,任务可以成功运行)。

如何在不为每个任务(有很多)定义不同的 vars 部分的情况下获得我想要的结果?

【问题讨论】:

    标签: ansible debian


    【解决方案1】:

    为了测试这一点,我创建了一个简单的模块,它只返回当前使用的 Python 版本:

    #!/usr/bin/python
    
    from __future__ import absolute_import, division, print_function  # NOQA
    
    import sys
    
    from ansible.module_utils.basic import AnsibleModule
    
    
    def main():
        module = AnsibleModule(argument_spec={},
                               supports_check_mode=True)
    
        result = {'changed': False,
                  'python_version': sys.version}
    
        module.exit_json(**result)
    
    
    if __name__ == '__main__':
        main()
    

    我把上面的放在library/pythonversion.py,然后测试出你的问题。

    我的第一个测试尝试重现您问题中的行为,如下所示:

    ---
    - hosts: localhost
      gather_facts: true
      vars:
        ansible_python_interpreter: /usr/bin/python3
    
      roles:
        - role: example
          vars:
            ansible_python_interpreter: /usr/bin/python2
    
      tasks:
        - name: check python version
          pythonversion:
          register: pversion_playbook
    
        - debug:
            msg:
              - "{{ pversion_role }}"
              - "{{ pversion_playbook }}"
    

    example 角色如下所示:

    ---
    - name: in example role
      pythonversion:
      register: pversion_role
    

    确实,正如您所描述的,如果我在我的剧本中使用 roles 块,那么该变量将被永久设置。最终的debug 任务显示:

    TASK [debug] **************************************************************************
    ok: [localhost] => {
        "msg": [
            {
                "changed": false,
                "failed": false,
                "python_version": "2.7.17 (default, Oct 20 2019, 00:00:00) \n[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]"
            },
            {
                "changed": false,
                "failed": false,
                "python_version": "2.7.17 (default, Oct 20 2019, 00:00:00) \n[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]"
            }
        ]
    }
    
    

    但是,如果我不使用 roles 块,而是使用 include_role 任务,如下所示:

    ---
    - hosts: localhost
      gather_facts: true
      vars:
        ansible_python_interpreter: /usr/bin/python3
    
      tasks:
        - name: include example role
          include_role:
            name: example
          vars:
            ansible_python_interpreter: /usr/bin/python2
    
        - name: check python version
          pythonversion:
          register: pversion_playbook
    
        - debug:
            msg:
              - "{{ pversion_role }}"
              - "{{ pversion_playbook }}"
    

    然后我们看到ansible_python_interpreter的值只在example角色执行期间被设置为/usr/bin/python2,之后又恢复到原来的值:

    TASK [debug] **************************************************************************
    ok: [localhost] => {
        "msg": [
            {
                "changed": false,
                "failed": false,
                "python_version": "2.7.17 (default, Oct 20 2019, 00:00:00) \n[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]"
            },
            {
                "changed": false,
                "failed": false,
                "python_version": "3.7.5 (default, Dec 15 2019, 17:54:26) \n[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]"
            }
        ]
    }
    
    

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2011-01-16
      相关资源
      最近更新 更多