一种用ansible实现多主机互信的方法
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"
热门帖子
- 12025-12-01浏览数:182764
- 22023-05-09浏览数:25062
- 42023-09-25浏览数:18526
- 52020-05-11浏览数:17529