- name: Configure Kerberos for Hadoop Users
hosts: hadoop_servers
become: no
gather_facts: no
vars:
kerberos_server: hadoop1.xuexi.com
keytab_file_path: /home/hadoop/keys/hadoop.keytab
principals:
nn/
dn/
yarn/
starrock/
tasks:
- name: Ensure key directory exists
ansible.builtin.file:
path: /home/hadoop/hxy
state: directory
mode: '0755'
- name: Create Kerberos principals
ansible.builtin.command: >
kadmin.local -q 'addprinc -randkey { { item }}{ { inventory_hostname }}@XUEXI.COM'
register: addprinc_output
ignore_errors: yes
delegate_to: "{ { kerberos_server }}"
loop: "{ { principals }}"
loop_control:
extended: yes # Ensure extended loop variables are available
- name: Check principal creation status
ansible.builtin.fail:
msg: "Failed to create principal for { { item.item }}: { { item.stderr }}"
when: "'Principal already exists' not in item.stderr and item.rc != 0"
loop: "{ { addprinc_output.results }}"
loop_control:
label: "{ { item.item }}{ { inventory_hostname }}@XUEXI.COM"
- name: Generate keytab file for each principal
ansible.builtin.command: >
kadmin.local -q 'xst -k { { keytab_file_path }}.tmp -norandkey { { item }}{ { inventory_hostname }}@XUEXI.COM'
register: xst_output
delegate_to: "{ { kerberos_server }}"
loop: "{ { principals }}"
when: "'Principal already exists' in (addprinc_output.results | selectattr('item', 'equalto', item) | first).stderr or (addprinc_output.results | selectattr('item', 'equalto', item) | first).rc == 0"
Note: The above when condition is simplified and may need adjustment.
It assumes that if 'Principal already exists', it's okay to proceed.
However, a more robust solution would involve tracking success/failure per principal.
- name: Move keytab file to final location (on Kerberos server)
ansible.builtin.command: mv { { keytab_file_path }}.tmp { { keytab_file_path }}
delegate_to: "{ { kerberos_server }}"
when: xst_output is changed # This might not be perfect, as 'changed' depends on file existence, not Kerberos operation.
- name: Fetch the keytab file to the control machine
ansible.builtin.fetch:
src: "{ { keytab_file_path }}"
dest: "./hadoop.keytab"
flat: yes
delegate_to: "{ { kerberos_server }}"
run_once: yes # Ensure this task runs only once.
- name: Distribute keytab files to each target host
ansible.builtin.copy:
src: ./hadoop.keytab
dest: /data1/tmp/hadoop.keytab
loop: "{ { groups['hadoop_servers'] }}"
delegate_to: "{ { item }}"
- name: Clean up local keytab file
ansible.builtin.file:
path: ./hadoop.keytab
state: absent
run_once: yes
ansible批量生产kerberos票据,并批量分发到所有其他主机脚本
蘑菇丁2025-01-24 8:05
相关推荐
better_liang13 分钟前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战小江的记录本25 分钟前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)小马爱打代码1 小时前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理better_liang1 小时前
每日Java面试场景题知识点之-SpringBoot启动流程RyFit1 小时前
Java + AI 实战:Spring AI 从入门到企业级落地ZhengEnCi2 小时前
01-如何监听接口调用情况?JAVA面经实录9173 小时前
MyBatis学习体系java1234_小锋3 小时前
在 Spring AI 中如何实现函数调用(Function Calling)?请说明其基本原理和应用场景。小马爱打代码4 小时前
Spring源码 第九篇:Spring 5 源码深度拆解 - Spring 事件驱动模型ForgeAI码匠5 小时前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合