使用 Ansible,如何将字符串转换为整数以作为 uid 参数传递给用户内置函数?

使用 Ansible,如何将字符串转换为整数以作为 uid 参数传递给用户内置函数?

我正在使用 ansible 设置 docker 容器。一项任务是创建运行 ansible 脚本的用户副本。我的​​ YML 是这样的:

- hosts: all
  tasks:
    - name: Get username
      become: false
      delegate_to: localhost
      command: id -nru
      register: result
      when: docker_user is undefined
    - set_fact:
        docker_user: "{{ result.stdout }}"
      when: docker_user is undefined

    - name: Get userid
      become: false
      delegate_to: localhost
      command: id -ru
      register: result
      when: docker_uid is undefined
    - debug: var=result.stdout
    - set_fact:
        docker_uid: "{{ result.stdout }}"
      when: docker_uid is undefined
    - debug: var=docker_uid

    - name: create a docker user
      ansible.builtin.user:
        name: docker_user
        uid: docker_uid
        home: '/home/{{docker_user}}'
      when: ansible_connection == 'docker'

当我运行它时出现错误:FAILED! => {"changed": false, "msg": "argument 'uid' is of type <type 'str'> and we were unable to convert to int: <type 'str'> cannot be converted to an int"}

我尝试将“uid”行更改为:,uid: docker_uid | int但无济于事。调试行报告 docker_uid 为“1000”。如何将此值作为整数传递给用户 uid 参数?

答案1

你不必运行这些命令。Ansible设置为您提供变量

  • ansible_user_id
  • ansible_user_uid
  1. 使用它们
    - block:

        - setup:
            gather_subset: user
        - set_fact:
            docker_user: "{{ ansible_user_id }}"
          when: docker_user is undefined
        - set_fact:
            docker_uid: "{{ ansible_user_uid }}"
          when: docker_uid is undefined

      delegate_to: localhost
      run_once: true
      when: docker_user is undefined or
            docker_uid is undefined

给出(如果 docker_* 未定义)例如,

  msg: |-
    docker_user: admin
    docker_uid: 1000
    docker_uid|typ_debug: int
  1. 使代码更加健壮。‘实例化’(set_fact)docker_user定义时也从中获取 ID密码
    - block:

        - setup:
            gather_subset: user
        - set_fact:
            docker_user: "{{ docker_user|d(ansible_user_id) }}"
        - getent:
            database: passwd
        - set_fact:
            docker_uid: "{{ getent_passwd[docker_user].2 }}"

      delegate_to: localhost
      run_once: true

给出(如果 docker_* 未定义)例如,

  msg: |-
    docker_user: vlado
    docker_uid: 1000
    docker_uid|typ_debug: AnsibleUnsafeText

在这种情况下,docker_uid是一个字符串,因为金贾用于评估表达式。Jinja 结果的类型始终是字符串。Jinja 是一个模板设计器。

  docker_uid: "{{ getent_passwd[docker_user].2 }}"

类型docker_uid上一个表达式中的 是整数,因为 Jinja 不需要评估该表达式。这是一个简单的赋值,并且ansible_user_uid是一个整数

  docker_uid: "{{ ansible_user_uid }}"
  1. 如果分配变量,情况会变得更加复杂docker_uid在命令行上。在第一种情况下
shell> ansible-playbook pb.yml -e docker_uid=1000

  ...

  msg: |-
    docker_user: admin
    docker_uid: 1000
    docker_uid|typ_debug: str

类型docker_uid是一个字符串,因为 INI 格式“docker_uid=1000”总是转换为字符串

如果使用 YAML 格式,类型可以是整数

shell> ansible-playbook pb.yml -e "{docker_uid: 1000}"

    ...

    docker_user: admin
    docker_uid: 1000
    docker_uid|typ_debug: int

结论

当需要整数时,始终将变量转换为整数

    - name: create a docker user
      ansible.builtin.user:
        name: "{{ docker_user }}"
        uid: "{{ docker_uid|int }}"
        ...

答案2

docker_user 和 docker_uid 是变量。查看如何使用变量

这里你使用了一个变量 > home: '/home/{{docker_user}}'

相关内容