【问题标题】:ansible variable basing on hostname's suffix基于主机名后缀的ansible变量
【发布时间】:2021-05-23 13:19:36
【问题描述】:

我需要根据系统的功能(测试或生产)在系统上创建用户 测试系统以 -tXX 后缀命名,而 prod 系统以 -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' }

【问题讨论】:

    标签: ansible centos


    【解决方案1】:

    例如

    - 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
    

    一个更强大的解决方案是选择一个索引,例如下面的播放给出了相同的结果

    - 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
    

    【讨论】:

    • 谢谢!我只需要从您的代码中删除“gather_facts:false”并将“inventory_hostname”更改为“ansible_hostname”,否则当我有主机:组名时,它总是在创建“userprod”用户。我注意到的另一个问题是,当 uid 1101 已经被使用时,ansible 不会抱怨而是创建具有不同 uid 的用户......这是设计使然吗?
    • 这取决于平台,我想。见source。如果您有任何问题,请联系minimal reproducible example
    • 我的错误,uid 一切正常,我在任务中缺少 'uid',它只在循环的项目上。
    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多