GBase 8a
运维管理
文章

一种用ansible实现多主机互信的方法

发表于2024-07-17 16:00:5935次浏览1个评论

1、课题概述

在GBase 8a集群项目实施过程中,为了便于集群部署及运维工作的开展,配置集群主机互信是一项必不可少的前置任务。备注:此次的主机互信指在Linux系统中,无需输入密码就可以通过SSH(Secure Shell)从一台主机访问另一台主机。

通常情况下,我们会使用SSH密钥对实现Linux主机互信,以下是建立主机互信的一般步骤:

1、在源主机上,首先确保有SSH公钥和私钥。如果还没有,使用ssh-keygen命令生成:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这将生成一个4096位的RSA密钥对,并存储在~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)中。

2、上传公钥到需要无密码登陆的远程服务器(目录~/.ssh/)上并改名为authorized_keys

将公钥复制到目标主机上。可以使用ssh-copy-id命令自动完成这个过程:

1ssh-copy-id user@target_host

上述步骤后,即能够从源主机无密码登录到目标主机。

在主机数量不多的情况下,上述操作并没有什么问题,但如果主机数量较大,配置多主机互信就成为了一个负担。

笔者根据项目实施的需要,总结了一种用ansible实现多主机互信的方法及脚本,只需要在第一台主机安装ansible软件,通过ansible脚本实现自动配置多主机互信,避免了上述手动配置互信的繁琐操作。该脚本已在实践中运用,提高了项目实施及运维的工作效率。

2、设计实现

验证场景:

CentOS7.6,ansible-2.2.1.0-1.el7

openEuler-20.03-LTS-SP3-x86_64,ansible-2.5.5-5.oe1

脚本名称:

trust_hosts_all.yml

---
- hosts: data
 tasks:
  - name:  删除首次登录检查的临时文件
    file: dest={{inventory_dir}}/sshconfig.tmp state=absent

  - name:  生成关闭首次登录检查的临时文件
    lineinfile: dest={{inventory_dir}}/sshconfig.tmp state=present line="Host \"{{item}}\" \n   StrictHostKeyChecking no" create=yes
    with_items:
        - "{{groups['all']}}"

  - name: 删除互信公钥临时文件
    file: dest="{{inventory_dir}}/sshpubs.rslt" state=absent
  
  - name: 将home目录保存到注册变量home_dir
    become: true
    become_user: "{{ user_name }}"
    shell: echo $HOME  
    register: home_dir
  
#   - debug:
#       msg: "{{ home_dir.stdout }}"
      
  - name: 创建保存ssh key的目录~/.ssh
    #become: true
    file: path=/{{home_dir.stdout}}/.ssh/ state=directory owner={{ user_name }} group={{ user_group }} mode=0700
  
  - name: 创建互信文件authorized_keys
    #become: true
    file: path=/{{home_dir.stdout}}/.ssh/authorized_keys state=touch  owner={{ user_name }} group={{ user_group }} mode=0600

  - name: 当key文件不存在时,产生SSH keys
    #如果hosts文件中的ssh账户使用root,配置gbase账户互信,此处使用su,产生的ssh_key属主是root
    become: true
    become_user: "{{ user_name }}"
    shell: ssh-keygen -b 2048 -t rsa -q -N '' -f "/{{home_dir.stdout}}/.ssh/id_rsa"
    args:
      creates: "/{{home_dir.stdout}}/.ssh/id_rsa"
      
  - name: 将公钥保存到注册变量ssh_pub
    #become: true
    shell: cat "/{{home_dir.stdout}}/.ssh/id_rsa.pub"  
    register: ssh_pub

  - name: 将公钥汇总到管理节点文件sshpubs.rslt
    local_action: command bash -c 'echo {{ ssh_pub.stdout }} >> {{inventory_dir}}/sshpubs.rslt'

  - name: 生成各节点authorized_key
    #become: true
    #become_user: "{{ user_name }}"
    authorized_key:
       user: "{{ user_name }}"
       key: "{{ lookup('file', inventory_dir + '/sshpubs.rslt') }}"
       key_options: ""
       state: present
       exclusive: no

  - name: 创建~/.ssh/config文件
    file: path=/{{home_dir.stdout}}/.ssh/config state=touch  owner={{ user_name }} group={{ user_group }} mode=0600
    
  - name: 修改~/.ssh/config文件,关闭互信首次登录的检查
    #become: true
    #become_user: "{{ user_name }}"
    blockinfile:
     dest: "/{{home_dir.stdout}}/.ssh/config"
     marker: "# {mark} BLOCK ssh trust"
     insertafter: EOF
     create: yes
     block: |
       {{ lookup('file', inventory_dir + '/sshconfig.tmp') }}

  - name: 删除互信临时文件
    file: dest="{{inventory_dir}}/sshpubs.rslt" state=absent

  - name: 删除互信首次登录检查临时文件
    file: dest="{{inventory_dir}}/sshconfig.tmp" state=absent

前置条件:

1、各节点创建待配置互信账户,并获取root账户密码

2、各节点ssh服务开启、待配置互信账户的ssh权限打开

3、在第1个节点安装ansible软件

操作步骤:

1、在脚本目录编辑hosts文件,指定主机列表、ssh账户root密码,例如:

[data]

172.16.243.31 ansible_ssh_user="root" ansible_ssh_pass=""

172.16.243.21 ansible_ssh_user="root" ansible_ssh_pass=""

172.16.243.22 ansible_ssh_user="root" ansible_ssh_pass=""

2、初次配置互信需要设置/etc/ansible/ansible.cfg参数host_key_checking = False

3、执行ansible-playbook配置互信

配置root账户互信:

ansible-playbook -i ./hosts trust_hosts_all.yml -e "user_name=root user_group=root"

配置gbase账户互信:

ansible-playbook -i ./hosts trust_hosts_all.yml -e "user_name=gbase user_group=gbase"

评论

登录后才可以发表评论
用户头像
levvel发表于 6个月前
干货满满!