Ansible:从json文件导入布尔值时出现问题

时间:2018-07-17 11:49:42

标签: json ansible jinja2

我想在ansible中使用json文件进行用户管理。因此,我创建了一个包含所有用户和组的json文件,如下所示(user_group_management.json):

{
  "linux_users": [
    {
      "name": "myuser",
      "uid": 1003,
      "group": "myuser",
      "groups": "users,sudo",
      "shell": "/bin/bash",
      "password": <password as sha-512>,
      "create_home": "yes",
      "home": "/home/rcug",
      "hosts": ["hostname1","hostname2","hostname3"]
    },
    {...},
    ...
  ],
  "linux_groups": [...],
}

现在,我编写了一个用于添加用户和组(user_group_management.yml)的ansible脚本:

- name: User and group management
  hosts: all
  vars_files:
    - user_group_management.json

  tasks:

  [part for adding groups (no problems here)]

  - name: Add users
    ignore_errors: yes
    user:
      name: item.name
      uid: item.uid
      group: item.group
      groups: item.groups
      shell: item.shell
      password: item.password
      create_home: item.create_home
      home: item.home
      state: present
    when: ansible_hostname in item.hosts
    loop: "{{ linux_users }}"

使用ansible-playbook --check user_management.yml运行ansible脚本时,我收到有关“添加用户”任务的以下错误消息:

"msg": "The value 'item.create_home' is not a valid boolean.  Valid booleans include: 0, 'on', 'f', 'false', 1, 'no', 'n', '1', '0', 't', 'y', 'off', 'yes', 'true'"

我尝试通过将"create_home": "yes",替换为"create_home": 1,来解决此问题,但没有任何改变。现在,我在变量(item.create_home-> "{{ item.create_home }}")周围添加了大括号,从而解决了该问题。因此,现在我不再收到任何错误消息。

可悲的是,我不明白为什么这对我有所帮助。我以为item.create_home首先是一个字符串(“是”),并且在编辑json文件后应该是整数(1)。但是两者都给了我错误。有这种现象的解释吗?

1 个答案:

答案 0 :(得分:3)

如果没有太多使用json操作的经验,那么您是否尝试过更改

"create_home": "yes",

"create_home": true,


另一种解决方案是在使用时使用jinja过滤器|bool来转换您期望为布尔值的值。

official documentation提供了

- debug:
    msg: test
  when: some_string_value | bool

when条件为例。

您的情况应该是

 create_home: item.create_home

应成为

 create_home: "{{ item.create_home | bool }}"

一般建议:您应将变量包含在"{{ }}"