我正在使用 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
- 使用它们
- 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
- 使代码更加健壮。‘实例化’(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 }}"
- 如果分配变量,情况会变得更加复杂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}}'