介绍
在运维 Playbook 中,用户和定时任务的自动化非常常见。Ansible 可以安全地创建账户、管理文件所有权并安装 cron 条目。
在本实验中,你将创建一个临时的服务用户,管理一个报告目录和文件,并为该用户安装一个定时任务。
创建用户自动化项目
在这一步中,你将创建一个用于管理名为 rhce_ops 的临时服务用户的项目。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
上述设置移除了之前可能存在的 rhce_ops 账户,因此第一次运行 Playbook 时将展示完整的创建过程。该账户是临时的,且与 LabEx 的 labex 用户相互独立。
定义账户和调度变量
在这一步中,你将为服务账户、报告目录和 cron 调度定义变量。 在执行本步骤的命令之前,请确保返回到 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
mkdir -p inventory/group_vars
cat > inventory/group_vars/managed.yml <<'EOF'
ops_user: rhce_ops
ops_comment: RHCE automation operator
ops_report_dir: /home/rhce_ops/reports
cron_minute: '*/15'
EOF
这些变量描述了账户和调度策略。对 */15 使用引号是有意为之,因为 YAML 可能会对 * 进行特殊处理;使用引号可以确保它被视为一个 cron 字符串。
cat inventory/group_vars/managed.yml
编写用户和文件 Playbook
在这一步中,你将编写一个 Playbook,用于创建用户、创建归属目录、写入托管文件并安装 cron 条目。 在执行本步骤的命令之前,请确保返回到 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > playbooks/users-files-cron.yml <<'EOF'
---
- name: Manage user files and scheduled task
hosts: managed
become: true
gather_facts: false
tasks:
- name: Ensure operations user exists
ansible.builtin.user:
name: "{{ ops_user }}"
comment: "{{ ops_comment }}"
shell: /bin/bash
state: present
- name: Ensure report directory exists
ansible.builtin.file:
path: "{{ ops_report_dir }}"
state: directory
owner: "{{ ops_user }}"
group: "{{ ops_user }}"
mode: '0750'
- name: Install managed report file
ansible.builtin.copy:
dest: "{{ ops_report_dir }}/status.txt"
content: |
managed_by=ansible
owner: "{{ ops_user }}"
group: "{{ ops_user }}"
mode: '0640'
- name: Install heartbeat cron job
ansible.builtin.cron:
name: RHCE heartbeat
user: "{{ ops_user }}"
minute: "{{ cron_minute }}"
job: "/usr/bin/date >> {{ ops_report_dir }}/heartbeat.log"
EOF
这些任务环环相扣:必须先存在用户才能分配所有权,必须先存在报告目录才能写入状态文件,且 cron 任务将以该用户身份运行。
ansible-playbook playbooks/users-files-cron.yml --syntax-check
运行用户自动化 Playbook
在这一步中,你将运行 Playbook 并检查账户、文件所有权和 cron 条目。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/users-files-cron.yml | tee reports/users-files-cron-run.txt
首次运行应创建用户、目录、状态文件和 cron 条目。保存输出有助于区分账户变更与文件及 cron 变更。
id rhce_ops
id 命令确认账户已存在,并显示其数字用户 ID 和组 ID。
sudo ls -ld /home/rhce_ops/reports && sudo ls -l /home/rhce_ops/reports/status.txt
目录和文件应归 rhce_ops 所有。状态文件应使用 0640 权限模式,即所有者拥有读写权限,组拥有读取权限。
sudo crontab -u rhce_ops -l
crontab 应包含名为 heartbeat 的条目以及将日期追加到 heartbeat.log 的命令。
确认 Playbook 的幂等性
在这一步中,你将重新运行 Playbook。由于账户、文件和 cron 条目已经符合预期状态,因此不应产生任何变更。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/users-files-cron.yml | tee reports/users-files-cron-second.txt
第二次运行应报告 changed=0,因为账户、文件状态和 crontab 已经与变量和任务定义保持一致。
grep -E 'host.*changed=0' reports/users-files-cron-second.txt
总结
你成功实现了临时用户、文件所有权、权限以及定时任务的自动化,并验证了 Playbook 的幂等性。


