RHCE-B14. 基于Ansible密码库创建用户帐户

Posted 白-胖-子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RHCE-B14. 基于Ansible密码库创建用户帐户相关的知识,希望对你有一定的参考价值。

红帽RHCE考试下午-RHCE(RH294)

RH294任务概览

  • 考试时间4个小时,6台虚拟机,15道题
  • 原来通过脚本或者集群做的题现在都需要使用playbook实现
  • 考试时大概有6台虚拟服务器,都已经做好了互相的免密
  • 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
  • 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
  • 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
  1. 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
  2. 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分

14. 基于Ansible密码库创建用户帐户

  • 从 http://172.25.250.250/ansible2.8/user_list.yml 下载要创建的用户的列表,并将它保存到/home/student/ansible
  • 在本次考试中使用在其他位置创建的密码库 /home/student/ansible/locker.yml,
  • 创建名为/home/student/ansible/users.yml 的 playbook,
  • 从而按以下所述创建用户帐户:

任务要求

  • 职位描述为 developer 的用户应当:
  1. 在 dev 和 test 主机组中的受管节点上创建
  2. 从 pw_developer 变量分配密码
  3. 是附加组 student 的成员
  4. 新增要求设置密码有效期为30天
  • 职位描述为 manager 的用户应当:
  1. 在 prod 主机组中的受管节点上创建
  2. 从 pw_manager 变量分配密码
  3. 是附加组 devops 的成员
  4. 新增要求设置密码有效期为30天
  • 密码应采用 SHA512 哈希格式。
  • 您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件/home/student/ansible/secret.txt 正常运行

注意:

准备个工作

  • 考试期间不需要做
设置密码有效期30天的参数跟ansible版本呢有关系
使用shell模块运行chage -M 30来修改用户密码的有效期吧
如果是设定用户的有效期,使用参数expires:指定用户的的过期时间,看清楚题中的要求

完成步骤

  1. 下载并查看文件
  • 先从服务器上下载并查看用户yml
[student@workstationansible]$ wget http://172.25.250.250/ansible2.8//usr_list.yml
[student@workstationansible]$cat user_list.yml
users:
- name: bob
  job: developer
- name: sally 
  job: manager
- name: fred 
  job: developer
  1. 分两个任务创建组
    2.1 根据要求创建developer组用户和manager组用户
    2.1.1 先按题中要求确定在那个主机组执行
    2.1.2 再定义变量,指定密码文件和用户列表
    2.1.3 写创建用户的任务tasks,包含三个子任务:创建组、创建用户、使用shell命令修改密码有效期
    2.1.4 先使用group模块创建用户组,状态为present
    2.1.5 再写个循环使用user模块创建用户,用when判断题中要求的分组job注释,用loop循环users变量列表,用password设定密码来自变量,同时用password_hash指定哈希算法为sha512
    2.1.6 最后使用一个shell模块执行chage -M命令来修改用户密码有效期
  • 根据要求编写创建对应playbook
[student@workstation ansible]$ vim users.yml
---
- name: Create developer user 
  hosts: dev,test 
  vars_files:
    - locker.yml ## 密码来自于上一个任务加密的文件
    - user_list.yml ## 用户来自于下载的文件
  tasks:
    - name: Ensure group "student" exists 
      group:
        name: student ## 考试时候要求是什么组就创建什么组
        state: present
    - name: Create user in developer 
      user:
        name: "{{ item.name }}"  ## 从user_list.yml里取name的值作为用户名
        groups: student ## 指定题目中要求的组组
        password: "{{ pw_developer | password_hash('sha512') }}"  ## 从locker.yml密码文件中取pw_developer后面的内容作为密码,并指定密码应采用 SHA512 哈希格式
      loop: "{{ users }}" ## 用loop调用user_list.yml中的uesrs变量,就是头上那个变量名,user是个列表
      when: item.job == "developer" ## 判断job是不是题中要求的分类,另一种写法 "'developer' in item.job" 
    ## 下面这个对应新加的修改用户密码有效期为30的内容
    - name:
      shell: chage -M 30 "{{ item.name}}"
      loop: "{{ users }}"
      when: item.job == "developer" 
## 写一半先测试一下,成功了再复制一些做下一半      
- name: Create manager user 
  hosts: prod
  vars_files:
    - locker.yml ## 密码来自于上一个任务加密的文件
    - user_list.yml  ## 用户来自于下载的文件
  tasks:
    - name: Ensure group "opsmgr" exists 
      group:
        name: opsmgr 
        state: present
    - name: Create user in manager 
      user:
        name: "{{ item.name }}" 
        groups: opsmgr
        password: "{{ pw_manager | password_hash('sha512') }}" 
      loop: "{{ users }}"
      when: item.job == "manager" ## 另一种写法 "'manager' in item.job"
    ## 下面这个对应新加的修改用户密码有效期为30的内容
    - name:
      shell: chage -M 30 "{{ item.name}}"
      loop: "{{ users }}"
      when: item.job == "manager"   
[student@workstation ansible]$ ansible-playbook --vault-id secret.txt users.yml ## 运行的时候要使用--vault-id 指定加密的文件
  • 使用chage -l bob 查看新创建的用户的密码有效期,默认是99999
  • 直接使用命令 chage -M 30 bob 就可以更改用户密码的有效期了
  • 如果user模块没有更改用户密码有效期的选项,就需要另外想办法了
  • 在写好的playbook里写个shell命令,把用户的密码给改了好不好呢?
- name:
  shell: chage -M 30 "{{ item.name}}"
  loop: "{{ users }}"
  when: item.job == "manager" 

考察的知识点

Playbook中使用变量

  • 在独立的变量YAML文件中定义变量,并在playbook中通过文件的方式进行调用外部变量
  • 在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优先级高
- hosts: all
  vars_files:
    - vars.yml
vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb
vim var5.yml
---
#install package and start service
- hosts: dbsrvs
  remote_user: root
  vars_files:
    - vars.yml
  tasks:
    - name: install package
      yum: name={{ package_name }}
      tags: install
    - name: start service
      service: name={{ service_name }} state=started enabled=yes
  • 变量的优先级从高到低如下
-e 选项定义变量 -->
  playbook中vars_files --> 
    playbook中vars变量定义 -->
      host_vars/主机名文件 -->
        主机清单中主机变量--> 
          group_vars/主机组名文件-->
            group_vars/all文件--> 
              主机清单组变量

ansible group模块

  • group 模块可以帮助我们管理远程主机上的组。
name  必须参数,用于指定要操作的组名称。
state  用于指定组的状态,
  两个值可选,present,absent,
  默认为 present,设置为absent 表示删除组。
gid   用于指定组的gid。
#创建组
ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
---
- name: creat group
  hosts: websrvs
  tasks:
    group
      name: nginx
      gid: 88
      system: yes

#删除组
ansible websrvs -m group -a 'name=nginx state=absent'
---
- name: del group
  hosts: websrvs
  tasks:
    group
      name: nginx
      state: absent

ansible user模块

  • user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。

    user:指定要操作的用户名称
    uid:指定用户的uid
    comment:指定用户的注释信息
    expires:指定用户的的过期时间,相当于设置/etc/shadow文件中的第8列
    shell:指定用户的默认shell
    group:指定用户的基本组
    groups:指定用户的附加组,新加时会覆盖原有的附加组,默认append=no
    append:配合groups使用,在原有附加组的基础上追加组,append=yes
    state present|absent:默认present,表示添加用户或需要用户存在;absent表示删除用户
    remove:删除用户时,默认是不删除家目录,remove=no;remove=yes表示删除用户家目录
    password:指定用户的密码,需要是加密后的字符串,相当于/etc/shadow文件中的第2列
    update_password always|on_create:默认always
    generate_ssh_key no|yes:默认为no;yes表示生成ssh密钥对,在用户家目录.ssh/目录中生成id_rsa的私钥和id_rsa.pub的公钥;若已存在同名的密钥,不会覆盖
    ssh_key_file:前提是generate_ssh_key=yes,使用此参数生成ssh私钥的路径和名称,对应公钥会在同路径下生成,后缀名".pub"
    ssh_key_comment:前提是generate_ssh_key=yes,使用此参数定义公钥中的注释信息,若已存在同名的密钥,不会覆盖;不指定时默认注释信息为"ansible-generated on 远程主机的主机名"
    ssh_key_passphrase:前提是generate_ssh_key=yes,使用此参数设置私钥的密码,若已存在同名的密钥,不会覆盖
    ssh_key_type:前提是generate_ssh_key=yes,使用此参数设置密钥对的类型,默认为rsa,若已存在同名的密钥,不会覆盖

使用哈希算法加密密码

  • 要获取sha512密码哈希(随机盐):
    {{ 'passwordsaresecret' | password_hash('sha512') }}
  • 要获取具有特定salt的sha256密码哈希,请执行以下操作:
    {{ 'secretpassword' | password_hash('sha256', 'mysecretsalt') }}
  • 每个系统生成唯一散列的幂等方法是使用两次运行之间一致的salt:
    {{ 'secretpassword' | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}

以上是关于RHCE-B14. 基于Ansible密码库创建用户帐户的主要内容,如果未能解决你的问题,请参考以下文章

RHCE-B13. 创建Ansible密码库,使用文件内密码加密yml

RHCE-B13. 创建Ansible密码库,使用文件内密码加密yml

RHCE-B2. 创建和运行 Ansible 临时命令

RHCE-B7. 从 Ansible Galaxy 使用角色创建web负载均衡

ansible创建用户时,密码问题

RHCE-B15.更新 Ansible 库的密钥