基于主机名后缀的ansible变量

ansible variable basing on hostname's suffix

我需要根据系统的功能(测试或生产)在系统上创建一个用户 测试系统以后缀 -tXX 命名,而生产系统以 -pXX 命名(其中 XX 是两位数编号)。

在我设置的变量文件中:

auser: "{{ 'usertest' if {{ ansible_hostname|lower }} | regex_search('t[0-9]{2}$') else 'userprod' }}"

我在 playbook 运行 中遇到的错误是:

fatal: [192.168.1.10]: FAILED! => {"msg": "An unhandled exception occurred while templating '{{ 'usertest' if {{ ansible_hostname|lower }} | regex_search('t[0-9]{2}$') else 'userprod' }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: template error while templating string: expected token ':', got '}'. String: {{ 'usertest' if {{ ansible_hostname|lower }} | regex_search('t[0-9]{2}$') else 'userprod' }}"}

完整的剧本是:

---
- hosts: testgrp
  become: yes
  vars:
     - auser: "{{ 'usertest' if {{ ansible_hostname|lower }} | regex_search('t[0-9]{2}$') else 'userprod' }}"

  tasks:
  - name: Add groups
    group:
     name: "{{ item.name }}"
     gid: "{{ item.gid }}"
     state: present
    loop:
     - { name: 'group1', gid: '1101' }
     - { name: 'group2', gid: '1102' }
     - { name: 'group3', gid: '1103' }

  - name: Add users
    user:
     name: "{{ item.name }}"
     group: "{{ item.group }}"
     groups: "{{ item.groups }}"
     state: present
    loop:
     - { name: "{{ auser }}", group: 'group1', groups: 'group2,group3', uid: '1101' }

例如

- hosts: srv-t01,srv-p01
  gather_facts: false
  vars:
    auser: "{{ inventory_hostname | lower is match('^.*-t[0-9]{2}$') |
               ternary('usertest', 'userprod') }}"
  tasks:
    - debug:
        var: auser

给予

ok: [srv-t01] => 
  auser: usertest
ok: [srv-p01] => 
  auser: userprod

更稳健的解决方案是 select 索引,例如下面的游戏给出了相同的结果

- hosts: srv-t01,srv-p01
  gather_facts: false
  vars:
    auser_dict:
      t: usertest
      p: userprod
    aindex: "{{ inventory_hostname | lower |
                regex_replace('^.*-(.+)[0-9]{2}$', '\1') }}"
    auser: "{{ auser_dict[aindex] }}"
  tasks:
    - debug:
        var: auser