21、Ansible 软件管理与用户管理实战

Ansible 软件管理与用户管理实战

1. 软件管理相关操作

1.1 获取新安装包信息

可以使用 debug 模块结合包事实来获取新安装包的信息,示例代码如下:

- name: show package facts for {{ my_package }}
  debug:
    var: ansible_facts.packages[my_package]
  when: my_package in ansible_facts.packages

在执行时,可使用命令 ansible-playbook exercise122-client.yaml -e my_package=redis 来覆盖 playbook 中设置的 my_package 变量。

1.2 配置新的 RHEL 托管节点

创建一个 playbook 来完全自动化新 RHEL 主机的设置,具体要求及步骤如下:
1. 安装 sshpass 包 :在控制主机上,使用 sudo yum install sshpass 安装该包,以实现非交互式使用 SSH 密码。
2. 设置控制主机信息 :创建 exercise123.yaml 文件,代码如下:

- name: add host to inventory
  hosts: localhost
  tasks:
  - fail:
      msg: "add the options -e newhost=hostname -e newhostip=ip.ad.dr.ess and try again"
    when: (newhost is undefined) or (newhostip is undefined)
  1. 修改本地库存文件和 /etc/hosts 文件
- name: add new host to inventory
  lineinfile:
    path: inventory
    state: present
    line: "{{ newhost }}"
- name: add new host to /etc/hosts
  lineinfile:
    path: /etc/hosts
    state: present
    line: "{{ newhostip }}  {{ newhost}}"
tags: addhost
  1. 测试 playbook
    • 使用 ansible-playbook -C exercise123.yaml 测试,由于未提供命令行参数,应会失败。
    • 使用 ansible-playbook -C exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205 再次测试。
  2. 配置第二个 play :在新主机上执行,play 头如下:
- name: configure a new RHEL host
  hosts: "{{ newhost }}"
  remote_user: root
  become: false
  tasks:
  1. 添加任务和标签
- name: configure user ansible
  user:
    name: ansible
    groups: wheel
    append: yes
    state: present
- name: set a password for this user
  shell: ’echo password | passwd --stdin ansible’
- name: enable sudo without passwords
  lineinfile:
    path: /etc/sudoers
    regexp: ’^%wheel’
    line: ’%wheel ALL=(ALL)  NOPASSWD: ALL’
    validate: /usr/sbin/visudo -cf %s
  1. 设置 SSH 相关
- name: create SSH directory in user ansible home
  file:
    path: /home/ansible/.ssh
    state: directory
    owner: ansible
    group: ansible
- name: copy SSH public key to remote host
  copy:
    src: /home/ansible/.ssh/id_rsa.pub
    dest: /home/ansible/.ssh/authorized_keys
tags: setuphost
  1. 测试第二个 play :使用 ansible-playbook -C -k exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205 进行测试。
  2. 创建 Vault 文件 :使用 ansible-vault create exercise123-vault.yaml 创建文件,并输入以下内容(使用真实的用户名和密码):
rhsm_user: XXXXXXXXXXX
rhsm_password: XXXXXXXXXXX
  1. 编写第三个 play 的头
- name: use subscription manager to register and set up repos
  hosts: "{{ newhost }}"
  vars_files:
  - exercise123-vault.yaml
  tasks:
  1. 完成 playbook 并添加剩余任务
- name: register and subscribe {{ newhost }}
  redhat_subscription:
    username: "{{ rhsm_user }}"
    password: "{{ rhsm_password }}"
    state: present
- name: configure additional repo access
  rhsm_repository:
    name:
    - rh-gluster-3-client-for-rhel-8-x86_64-rpms
    - rhel-8-for-x86_64-appstream-debug-rpms
    state: present
tags: registerhost
  1. 执行 playbook :使用 ansible-playbook -k --ask-vault-pass exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205 执行。若出现错误,可使用标签单独运行某个 play,如 ansible-playbook --tags=registerhost exercise123.yaml -e newhost=ansible5

1.3 相关表格

操作 命令或代码
安装 sshpass 包 sudo yum install sshpass
测试 playbook(无参数) ansible-playbook -C exercise123.yaml
测试 playbook(带参数) ansible-playbook -C exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205
执行 playbook ansible-playbook -k --ask-vault-pass exercise123.yaml -e newhost=ansible5 -e newhostip=192.168.4.205
单独运行某个 play ansible-playbook --tags=registerhost exercise123.yaml -e newhost=ansible5

1.4 流程图

graph TD;
    A[安装 sshpass 包] --> B[设置控制主机信息];
    B --> C[修改本地库存和 /etc/hosts 文件];
    C --> D[测试 playbook];
    D --> E[配置第二个 play];
    E --> F[添加任务和标签];
    F --> G[设置 SSH 相关];
    G --> H[测试第二个 play];
    H --> I[创建 Vault 文件];
    I --> J[编写第三个 play 的头];
    J --> K[完成 playbook 并添加剩余任务];
    K --> L[执行 playbook];

2. 用户管理相关操作

2.1 “Do I Know This Already?” 测验

问题 选项 答案
管理现有或新用户的 SSH 已知主机文件应使用哪个 Ansible 模块? a. lineinfile
b. ssh_key
c. ssh_config
d. known_hosts
d
要使现有用户成为额外组的成员而不覆盖任何当前组分配,应使用 user 模块的哪些参数?(选两个) a. group
b. groups
c. append
d. newgroups
b、c
可以使用哪些 Ansible 模块来管理 sudoers 配置文件?(选两个) a. lineinfile
b. template
c. sudoers
d. sudo
a、b
管理服务器的 SSH 公钥应使用哪个模块? a. authorized_key
b. authorized_hosts
c. known_keys
d. known_hosts
a
查找特定文件并将其复制到托管主机应使用什么? a. The copy module
b. The lookup module
c. The copy plug - in
d. The lookup plug - in
b
authorized_keys 模块有以下哪个限制? a. 它不能从隐藏目录读取文件。
b. 它仅适用于默认 Ansible 用户。
c. 它需要将目标文件的权限模式设置为 644。
d. 它不能在 sudo shell 中工作。
c
存储在 /etc/shadow 中的加密密码由不同部分组成,以下哪个不是其中之一? a. 使用的哈希算法
b. 用于加密密码的随机盐
c. 用户名
d. 用户密码的加密哈希
c
可以使用不同的解决方案为 Ansible 用户模块生成加密密码,以下哪个不是其中之一? a. 使用 shell 模块和 passwd --stdin 命令将加密密码存储在变量中。
b. 使用 command 模块和 passwd --stdin 命令将加密密码存储在变量中。
c. 使用带有 debug 模块的临时命令生成加密密码字符串。
d. 创建一个使用 debug 模块生成加密密码字符串的任务。
a
在 playbook 中使用加密密码时,以下哪种解决方案最能确保安全性? a. 将密码存储在 Vault 文件中。
b. 让 playbook 提示输入要使用的密码。
c. 将密码存储在仅 root 用户可访问的文件中。
d. 使用库存变量文件读取密码。
a
创建多个用户账户的最佳方法是什么? a. 使用 loop 迭代用户列表。
b. 在变量中定义用户并使用 loop 迭代该变量。
c. 定义一个变量文件,其中用户定义为列表,并从 playbook 中使用 loop 迭代该列表。
d. 使用 vars_prompt 让 playbook 提示输入要使用的变量名。
c

2.2 管理用户和组的模块概述

不同模块用于管理用户、组及其重要属性,具体如下表所示:
| 操作 | 模块 |
| ---- | ---- |
| 管理用户 | user |
| 管理组 | group |
| 管理 sudo 配置(推荐) | template |
| 管理 sudo 配置(替代) | lineinfile |

2.3 管理用户和组示例

---
- name: creating a user and group
  hosts: ansible2
  tasks:
  - name: setup the group account
    group:
      name: students
      state: present
  - name: setup the user account
    user:
      name: anna
      create_home: yes
      groups: wheel,students
      append: yes
      generate_ssh_key: yes
      ssh_key_bits: 2048
      ssh_key_file: .ssh/id_rsa

在使用 user 模块时, group 参数用于指定用户的主组, groups 参数用于使用户成为额外组的成员,对于现有用户使用 groups 参数时,需同时包含 append 参数,以避免覆盖当前的次要组分配。

2.4 管理 sudo

可使用 template 模块在 /etc/sudoers.d 目录中创建 sudo 配置文件,或使用 lineinfile 模块直接管理 /etc/sudoers 主配置文件。示例代码如下:

变量文件 vars/sudo
sudo_groups:
  - name: developers
    groupid: 5000
    sudo: false
  - name: admins
    groupid: 5001
    sudo: true
  - name: dbas
    groupid: 5002
    sudo: false
  - name: sales
    groupid: 5003
    sudo: true
  - name: account
    groupid: 5004
    sudo: false
变量文件 vars/users
users:
  - username: linda
    groups: sales
  - username: lori
    groups: sales
  - username: lisa
    groups: account
  - username: lucy
    groups: account
模板文件 listing133.j2
{% for item in sudo_groups %}
{% if item.sudo %}
%{{ item.name}} ALL=(ALL:ALL) NOPASSWD:ALL
{% endif %}
{% endfor %}
playbook exercise131.yaml
---
- name: configure sudo
  hosts: ansible2
  vars_files:
    - vars/sudo
    - vars/users
  tasks:
  - name: add groups
    group:
      name: "{{ item.name }}"
    loop: "{{ sudo_groups }}"
  - name: add users
    user:
      name: "{{ item.username }}"
      groups: "{{ item.groups }}"
    loop: "{{ users }}"
  - name: allow group members in sudo
    template:
      src: listing133.j2
      dest: /etc/sudoers.d/sudogroups
      validate: ‘visudo -cf %s’
      mode: 0440

2.5 练习 13 - 1 管理用户和组

  1. 使用 mkdir host_vars 创建 host_vars 目录。
  2. 创建 host_vars/ansible1 文件,内容如下:
users:
- username: zeina
  groups: admins
- username: marlet
  groups: admins
- username: victoria
  groups: students
- username: emma
  groups: students
  1. 创建 exercise131.yaml 文件,编写 play 头:
---
- name: create user accounts
  hosts: ansible1
  tasks:
  1. 添加创建所需组的任务:
- name: create groups
  group:
    name: "{{ item.groups }}"
    state: present
  loop: "{{ users }}"
  1. 添加创建用户账户的任务:
- name: create users
  user:
    name: "{{ item.username }}"

2.6 流程图

graph TD;
    A[创建 host_vars 目录] --> B[创建 host_vars/ansible1 文件];
    B --> C[创建 exercise131.yaml 文件并编写 play 头];
    C --> D[添加创建组的任务];
    D --> E[添加创建用户账户的任务];

2.7 相关总结

在用户管理方面,我们了解了多个重要的知识点:
- 模块使用 user 模块和 group 模块是管理用户和组的基础,通过合理设置参数可以满足不同的需求。例如 user 模块中的 group groups 参数,以及 append 参数的使用。
- sudo 管理 :可以使用 template 模块或 lineinfile 模块来管理 sudo 配置,前者通过模板文件生成 sudo 配置文件,后者直接修改主配置文件。
- 加密密码 :在使用加密密码时,将密码存储在 Vault 文件中是最安全的做法。
- 多用户创建 :定义变量文件并结合 loop 迭代是创建多个用户账户的最佳方法。

2.8 知识对比表格

管理内容 模块 优点 缺点
用户 user 功能丰富,可设置多种属性,如生成 SSH 密钥 部分参数使用需注意,如 groups append 配合
group 简单直接,用于创建和管理组 功能相对单一
sudo 配置(template) template 独立管理,避免被 RPM 更新覆盖 需要编写模板文件
sudo 配置(lineinfile) lineinfile 直接修改主配置文件,操作简单 有被 RPM 更新覆盖的风险

2.9 流程图

graph LR;
    A[用户管理] --> B[用户和组管理];
    A --> C[sudo 管理];
    A --> D[加密密码管理];
    A --> E[多用户创建];
    B --> B1[user 模块];
    B --> B2[group 模块];
    C --> C1[template 模块];
    C --> C2[lineinfile 模块];
    D --> D1[Vault 文件存储];
    E --> E1[变量文件 + loop 迭代];

3. 总结与回顾

3.1 软件管理总结

在软件管理部分,我们学习了如何使用 Ansible 进行软件包的信息获取、新 RHEL 托管节点的配置等操作。通过一系列的步骤,包括安装必要的包、设置控制主机信息、修改配置文件、测试 playbook 等,我们可以实现软件管理的自动化。同时,使用标签可以方便地单独运行 playbook 的某个部分,提高了操作的灵活性。

3.2 用户管理总结

用户管理方面,我们了解了不同的 Ansible 模块在用户和组管理、sudo 配置、SSH 管理以及加密密码管理等方面的应用。通过测验和示例代码,我们对各个模块的使用有了更深入的理解,并且掌握了创建多个用户账户的最佳实践。

3.3 关键知识点回顾表格

管理领域 关键知识点
软件管理 debug 模块获取包信息、lineinfile 模块修改配置文件、Red Hat 订阅管理、Ansible Vault 存储敏感信息
用户管理 user 和 group 模块管理用户和组、template 和 lineinfile 模块管理 sudo 配置、authorized_key 模块管理 SSH 公钥、Vault 文件存储加密密码

3.4 整体流程图

graph LR;
    A[Ansible 管理] --> B[软件管理];
    A --> C[用户管理];
    B --> B1[获取包信息];
    B --> B2[配置新 RHEL 节点];
    B --> B3[订阅管理];
    C --> C1[用户和组管理];
    C --> C2[sudo 管理];
    C --> C3[SSH 管理];
    C --> C4[加密密码管理];

通过以上的学习和实践,我们可以更好地利用 Ansible 进行软件和用户的管理,提高工作效率和系统的安全性。在实际应用中,我们可以根据具体的需求选择合适的模块和方法,灵活运用这些知识来解决各种问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值