首先 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