首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在剧本中调用主机名变量

不能在剧本中调用主机名变量
EN

Stack Overflow用户
提问于 2021-12-23 21:19:50
回答 1查看 180关注 0票数 1

我需要向多个Ubuntu服务器添加新用户。不幸的是,密码和用户名不一致。每台机器都有自己的用户名,密码不能相同。例如,主机-1将有一个用户帐户主机-1_用户名与密码主机-1_密码和主机-2将有一个用户帐户主机-2_用户名与密码主机-2_密码,等等。

我想用Ansible做这件事。我有一个list.yaml文件:

代码语言:javascript
复制
---
list:
  - hostname: host-1
    username: host-1_username
    password: host-1_password
  - hostname: host-2
    username: host-2_username
    password: host-2_password
  - hostname: host-3
    username: host-3_username
    password: host-3_password

这是我的游戏指南:

代码语言:javascript
复制
- name: Crate new user
  vars_files:
    - list.yml
  hosts: "{{ item.hostname }}"
  remote_user: root
  become: true

  tasks:
  - name: Create new user
    ansible.builtin.user:
      name: "{{ item.username }}"
      groups: sudo
      password: "{{ item.password | password_hash('sha512') }}"
      shell: /bin/bash

  - name: Modify sshd_config 
    ansible.builtin.lineinfile:
      dest: /etc/ssh/sshd_config
      line: 'AllowUsers {{ item.username }}'
    
    loop: "{{ list }}"

但是看起来Ansible不能调用变量来添加到主机列中:

代码语言:javascript
复制
ERROR! couldn't resolve module/action 'hosts'. This often indicates a misspelling, missing collection, or incorrect module path.

我对Ansible非常陌生,任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-23 22:02:06

给出数据

代码语言:javascript
复制
shell> cat list.yml 
users_list:
  - hostname: host-1
    username: host-1_username
    password: host-1_password
  - hostname: host-2
    username: host-2_username
    password: host-2_password
  - hostname: host-3
    username: host-3_username
    password: host-3_password

创建一个库存文件,例如:

代码语言:javascript
复制
shell> cat hosts
host-1
host-2
host-3

将数据转换为字典。

代码语言:javascript
复制
- hosts: all
  gather_facts: false
  vars_files:
    - list.yml
  tasks:
    - set_fact:
        users_dict: "{{ users_list|items2dict(key_name='hostname', value_name='username') }}"
        psswd_dict: "{{ users_list|items2dict(key_name='hostname', value_name='password') }}"
      run_once: true

给出

代码语言:javascript
复制
  users_dict:
    host-1: host-1_username
    host-2: host-2_username
    host-3: host-3_username

代码语言:javascript
复制
  psswd_dict:
    host-1: host-1_password
    host-2: host-2_password
    host-3: host-3_password

使用字典选择主机的特定用户和密码。

代码语言:javascript
复制
    - debug:
        msg: "Create user: {{ users_dict[inventory_hostname] }}
              password: {{ psswd_dict[inventory_hostname] }}"

给出

代码语言:javascript
复制
TASK [debug] ***************************************************************
ok: [host-1] => 
  msg: 'Create user: host-1_username password: host-1_password'
ok: [host-2] => 
  msg: 'Create user: host-2_username password: host-2_password'
ok: [host-3] => 
  msg: 'Create user: host-3_username password: host-3_password'

您可以省略库存文件,并创建一个完全由数据驱动的剧本。在第一次播放中创建动态组my_group,在第二次播放中使用它。下面的剧本给出了同样的结果。

代码语言:javascript
复制
- name: Create dynamic group of the hosts from users_list
  hosts: localhost
  gather_facts: false
  vars_files:
    - list.yml
  tasks:
    - add_host:
        name: "{{ item.hostname }}"
        groups: my_group
      loop: "{{ users_list }}"

- name: Create users
  hosts: my_group
  gather_facts: false
  vars_files:
    - list.yml
  tasks:
    - set_fact:
        users_dict: "{{ users_list|items2dict(key_name='hostname', value_name='username') }}"
        psswd_dict: "{{ users_list|items2dict(key_name='hostname', value_name='password') }}"
      run_once: true
    - debug:
        var: users_dict
      run_once: true
    - debug:
        var: psswd_dict
      run_once: true
    - debug:
        msg: "Create user: {{ users_dict[inventory_hostname] }}
              password: {{ psswd_dict[inventory_hostname] }}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70467487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档