離線環境安裝使用 Ansible

之前寫了一篇介紹 Ansible 的文章 ,今天回顧看來寫的有些匆忙,一些具體的操作步驟都沒有講明白,不利於讀者復現學習。最近又申請了一個幾百台機器的環境,正好藉此機會把如何在離線環境中使用 Ansible 詳細記錄一下。

使用前準備

本機環境是 Python 2.7,作業系統版本是 Red Hat Enterprise Linux Server release 7.6 (Maipo)。

  • 系統必須安裝了 gcc,找一個內網的 yum 源安裝 yum install gcc 或使用 rpm 包進行安裝
  • 有些依賴包編譯需要依賴 python 庫,因此必須安裝 python-devel ,安裝方法同上
  • 安裝 cffi 需要依賴 libffi-devel,安裝方法同上
  • 安裝 cryptography-2.6.1.tar.gz 依賴 openssl-devel

總結下來,必須使用本地 yum 源安裝幾個必須的依賴。

$ yum install -y python-devel openssl-devel gcc libffi-devel

安裝過程

ansible 安裝需要先將 18 個依賴包安裝完成,依賴包的安裝過程大同小異,都是解壓文件後,通過 python setup.py install 命令進行安裝。

  • 安裝 setuptools-41.1.0.zip
  • 安裝 pycrypto-2.6.1.tar.gz
  • 安裝 PyYAML-5.1.tar.gz ,這個編譯安裝依賴 _yaml.h ,如果沒有會轉為純 python 模式
  • 安裝 MarkupSafe-1.1.1.tar.gz
  • 安裝 Jinja2-2.10.1.tar.gz
  • 安裝 simplejson-3.16.0.tar.gz
  • 安裝 pycparser-2.19.tar.gz
  • 安裝 cffi-1.12.3.tar.gz
  • 安裝 ipaddress-1.0.22.tar.gz
  • 安裝 six-1.12.0.tar.gz
  • 安裝 asn1crypto-0.24.0.tar.gz
  • 安裝 idna-2.8.tar.gz
  • 安裝 pyasn1-0.4.5.tar.gz
  • 安裝 PyNaCl-1.3.0.tar.gz
  • 安裝 enum34-1.1.8.tar.gz
  • 安裝 cryptography-2.6.1.tar.gz
  • 安裝 bcrypt-3.1.6.tar.gz
  • 安裝 paramiko-2.4.2.tar.gz
  • 安裝 ansible-2.9.7.tar.gz

完成後,驗證安裝結果。推薦大家使用 Github 上 ghl1024 整理的一個安裝腳本來自動化這個過程,如果需要特定的版本,自己修改腳本內容就可以。

$ ansible --version

配置與使用

使用 ansible 操作目標主機的方式有兩種,一種是通過配置主機列表後在命令行中通過主機列表名稱選擇設備。例如:

$ ansible machinelist -m command -a 'cat /etc/redhat-release'

這裡的 machinelist 對應 /etc/ansible/hosts 文件中的一組機器列表

[machinelist]
10.2.1.1
10.2.1.2

使用這種方式配置的機器列表,需要安裝了 ansible 的這台機器與列表中的主機都做了 ssh 互信。

我們可以利用 sshpass 這個應用來實現使用用戶密碼登錄,這種方式要求安裝了 ansible 的機器上先要安裝 sshpass 。在離線環境下,推薦大家通過 rpm 包進行安裝或者編譯安裝。

安裝完成後,修改 hosts 文件配置如下。

[machinelist]
10.2.1.1 ansible_ssh_user=root ansible_ssh_pass=xxxxxx
10.2.1.2 ansible_ssh_user=root ansible_ssh_pass=xxxxxx

兩種方式的配置可以混合使用。

  • 配置主機列表
  • 利用 sshpass 快速登錄主機
  • 批量設置主機間的互信

題外話

在使用 ansible 向多台主機發送命令的過程中,有些主機有以下的 WARNING 提示。

[WARNING]: Platform linux on host -.-.-.- is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See //docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.

看文字的大意是某些機器上的 python 是在 /usr/bin/python 下的,未來可能會被替換。

忽略這個錯誤的辦法是在 /etc/ansible/ansible.cfg 中添加以下配置。

[defaults]
interpreter_python = auto_legacy_silent

參考資料

  1. Ansible 離線安裝
  2. ansible的安裝配置和配合sshpass的使用
  3. sshpass 繞過ssh 密碼互動式驗證
  4. Ansible 實現批量建立互信
  5. Platform linux on host is using the discovered Python interpreter
Tags: