首先 rpmbuild 打出 OpenSSH 8.4 的 RPM 包,rpm -Uvh 升级,修改 /etc/pam.d/sshd
文件,重启 sshd 服务,升级完成。node
#!/bin/bash set -ex yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip -y mkdir -p /root/rpmbuild/{SOURCES,SPECS} cd /root/rpmbuild/SOURCES if [[ ! -f "openssh-8.4p1.tar.gz" ]];then wget -c http://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.4p1.tar.gz fi if [[ ! -f "x11-ssh-askpass-1.2.4.1.tar.gz" ]];then wget https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz fi tar zxvf openssh-8.4p1.tar.gz openssh-8.4p1/contrib/redhat/openssh.spec mv openssh-8.4p1/contrib/redhat/openssh.spec ../SPECS/ chown sshd:sshd /root/rpmbuild/SPECS/openssh.spec cp /root/rpmbuild/SPECS/openssh.spec /root/rpmbuild/SPECS/openssh.spec_def sed -i -e "s/%global no_gnome_askpass 0/%global no_gnome_askpass 1/g" /root/rpmbuild/SPECS/openssh.spec sed -i -e "s/%global no_x11_askpass 0/%global no_x11_askpass 1/g" /root/rpmbuild/SPECS/openssh.spec sed -i -e "s/^BuildRequires: openssl-devel < 1.1/#BuildRequires: openssl-devel < 1.1/g" /root/rpmbuild/SPECS/openssh.spec sed -i -e '/with-privsep-path/a\ --with-openssl-includes=/usr/local/openssl/include \\\n --with-ssl-dir=/usr/local/openssl \\' /root/rpmbuild/SPECS/openssh.spec cd /root/rpmbuild/SPECS/ rpmbuild -ba openssh.spec
使用上面的自动打包shell不会出现下面错误,由于已经自动处理。linux
构建依赖失败:openssl-devel < 1.1 被 openssh-8.4p1-1.el7.x86_64 须要 解决方法:shell
[root@localhost SPECS]# vim openssh.spec 注释掉 BuildRequires: openssl-devel < 1.1 这一行vim
Installed (but unpackaged) file(s) found:centos
RPM build errors: Installed (but unpackaged) file(s) found: /usr/libexec/openssh/ssh-sk-helper /usr/share/man/man8/ssh-sk-helper.8.gz
解决方法:bash
vi /usr/lib/rpm/macros #%__check_files %{_rpmconfigdir}/check-files %{buildroot} 注释改行
打包成功session
压缩打包到一个文件ssh
zip openssh84.zip openssh*.rpm openssl-1.1.1i-1.el7.x86_64.rpm
升级ide
# 升级,先升级openssl,由于打包的时候使用了OpenSSL 1.1.1i rpm -Uvh openssl-1.1.1i-1.el7.x86_64.rpm --nodeps --force && rpm -Uvh /tmp/openssh*.rpm # 修改权限,必须修改权限,不然重启sshd失败, cd /etc/ssh/ chmod 400 ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key # 容许 root登陆,可选 echo "PermitRootLogin yes" >> /etc/ssh/sshd_config # 不修改这个文件,会出现密码是对的,却没法登录。 cat <<EOF>/etc/pam.d/sshd #%PAM-1.0 auth required pam_sepermit.so auth include password-auth account required pam_nologin.so account include password-auth password include password-auth ## pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so ## pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session optional pam_keyinit.so force revoke session include password-auth EOF # 重启服务 systemctl restart sshd
当咱们刚开始学习运用 playbook 时,可能会把 playbook 写成一个很大的文件,到后来可能你会但愿这些文件是能够方便去重用的,因此须要从新去组织这些文件。Roles 意为角色,主要用于封装 playbook 实现复用性。在 ansible 中,roles 经过文件的组织结构来展示。学习
对于一个 role,它的文件组织结构以下图所示。
[root@ansible ansible]# ls openssh/* openssh/default: openssh/files: openssh84.zip sshd openssh/tasks: main.yaml openssh/templates: openssh/vars:
首先须要有一个 roles 目录。同时,在 roles 目录所在目录中,还要有一个 playbook 文件,此处为main.yaml,main.yaml 文件是 ansible-playbook 须要执行的文件,在此文件中定义了角色,当执行到角色时,将会到 roles中对应的角色目录中寻找相关文件。
roles 目录中的子目录是便是各个 role。例如,此处只有一个名为 openssh 的 role,在 role 目录中,有几个固定名称的目录(若是没有则忽略)。在这些目录中,还要有一些固定名称的文件,除了固定名称的文件,其余的文件能够随意命名。如下是各个目录的含义:
看到这些估计你是懵的,下面看例子就明白了。
这里演示的是使用 Ansible Roles 对 100 台 CentOS 7 批量升级 OpenSSH 到 8.4 版本。这是最初级的 Roles示例。
首先是文件结构。
[root@ansible ansible]# ls openssh/* openssh/default: openssh/files: openssh84.zip sshd openssh/tasks: main.yaml openssh/templates: openssh/vars:
入口文件为 tasks/main.yaml,看下内容
[root@ansible openssh]# cat tasks/main.yaml --- - name: Copy ssh to agent. unarchive: src: openssh84.zip dest: /tmp - name: Copy ssh file to agent. copy: src: sshd dest: /etc/pam.d/sshd backup: yes - name: update openssl openssh shell: | cd /tmp rpm -Uvh openssl-1.1.1i-1.el7.x86_64.rpm --nodeps --force && rpm -Uvh /tmp/openssh*.rpm cd /etc/ssh/ chmod 400 ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key # echo "PermitRootLogin no" >> /etc/ssh/sshd_config - name: Restart sshd systemd: state: restarted name: sshd
放在 files 目录下 openssh8.zip 是打包出来OpenSSH 8.4 的 rpm 包,再压缩为 zip 包。
sshd 是要修改的 /etc/pam.d/sshd
文件
因此这个 main.yaml 的意思就是把 openssh8.zip 解压到目标主机 /tmp 目录下,要修改的文件复制到目标主机目录下,而后执行升级,最后重启 sshd 服务。
要升级全部机器的时候就在最外层的 main.yaml 写上主机和 roles 执行便可,如图
- hosts: # - 10.11.19.4 - all gather_facts: no become: yes roles: - openssh