使用 ansible 安裝 NGINX 和 NGINX Plus
在本教程中我將使用 Ansible 1.9.2 版本,並在 CentOS 7.1 伺服器上部署運行。
$ ansible --version
ansible 1.9.2
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
如果你還沒有 Ansible,可以在 Ansible 網站 查看說明並安裝它。
如果你使用的是 CentOS,安裝 Ansible 十分簡單,只要輸入以下命令。如果你想使用源碼編譯安裝或使用其他發行版,請參閱上面 Ansible 鏈接中的說明。
$ sudo yum install -y epel-release && sudo yum install -y ansible
根據環境的不同,在本教程中的命令有的可能需要 sudo 許可權。文件路徑,用戶名和目標伺服器取決於你的環境的情況。
創建一個 Ansible Playbook 來安裝 NGINX (CentOS)
首先,我們要為 NGINX 的部署創建一個工作目錄,包括子目錄和部署配置文件。我通常建議在你的主目錄中創建該目錄,在文章的所有例子中都會有說明。
$ cd $HOME
$ mkdir -p ansible-nginx/tasks/
$ touch ansible-nginx/deploy.yml
$ touch ansible-nginx/tasks/install_nginx.yml
目錄結構看起來是這樣的。你可以使用 tree 命令來查看。
$ tree $HOME/ansible-nginx/
/home/kjones/ansible-nginx/
├── deploy.yml
└── tasks
└── install_nginx.yml
1 directory, 2 files
如果你沒有安裝 tree 命令,使用以下命令去安裝。
$ sudo yum install -y tree
創建主部署文件
接下來,我們在文本編輯器中打開 deploy.yml。我喜歡在命令行上使用 vim 來編輯配置文件,在整個教程中也都將使用它。
$ vim $HOME/ansible-nginx/deploy.yml
deploy.yml 文件是 Ansible 部署的主要文件,在「使用 Ansible 部署 NGINX」小節中,我們運行 ansible‑playbook 命令時會使用此文件。在這個文件中,我們指定 Ansible 運行時使用的庫以及其它配置文件。
在這個例子中,我使用 include 模塊來指定配置文件一步一步來安裝NGINX。雖然可以創建一個非常大的 playbook 文件,我建議你將其分割為小文件,讓它們更有條理。include 的示例中可以複製靜態內容,複製配置文件,為更高級的部署使用邏輯配置設定變數。
在文件中輸入以下行。我在頂部的注釋包含了文件名用於參考。
# ./ansible-nginx/deploy.yml
- hosts: nginx
tasks:
- include: 'tasks/install_nginx.yml'
hosts 語句說明 Ansible 部署 nginx 組的所有伺服器,伺服器在 /etc/ansible/hosts 中指定。我們會在下面的「創建 NGINX 伺服器列表」小節編輯此文件。
include 語句說明 Ansible 在部署過程中從 tasks 目錄下讀取並執行 install_nginx.yml 文件中的內容。該文件包括以下幾步:下載,安裝,並啟動 NGINX。我們將在下一節創建此文件。
為 NGINX 創建部署文件
現在,先保存 deploy.yml 文件,並在編輯器中打開 install_nginx.yml 。
$ vim $HOME/ansible-nginx/tasks/install_nginx.yml
該文件包含有指令(使用 YAML 格式寫的), Ansible 會按照指令安裝和配置我們的 NGINX 部署過程。每個節(過程中的步驟)起始於一個描述此步驟的 name
語句(前面有連字元)。 name
後的字元串是 Ansible 部署過程中輸出到標準輸出的,可以根據你的意願來修改。YAML 文件中的節的下一行是在部署過程中將使用的模塊。在下面的配置中,使用了 yum
和 service
模塊。yum
模塊用於在 CentOS 上安裝軟體包。service
模塊用於管理 UNIX 的服務。在這個節的最後一行或幾行指定了幾個模塊的參數(在本例中,這些行以 name
和 state
開始)。
在文件中輸入以下行。就像 deploy.yml,在我們文件的第一行是用於參考的文件名的注釋。第一個節告訴 Ansible 在CentOS 7 上從 NGINX 倉庫安裝該 .rpm 文件。這讓軟體包管理器直接從 NGINX 倉庫安裝最新最穩定的版本。根據你的 CentOS 版本修改路徑。所有可用的包的列表可以在 開源 NGINX 網站 上找到。接下來的兩節告訴 Ansible 使用 yum
模塊安裝最新的 NGINX 版本,然後使用 service
模塊啟動 NGINX。
注意: 在第一個節中,CentOS 包中的路徑名可能由於寬度顯示為連著的兩行。請在一行上輸入其完整路徑。
# ./ansible-nginx/tasks/install_nginx.yml
- name: NGINX | Installing NGINX repo rpm
yum:
name: http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- name: NGINX | Installing NGINX
yum:
name: nginx
state: latest
- name: NGINX | Starting NGINX
service:
name: nginx
state: started
創建 NGINX 伺服器列表
現在,我們設置好了 Ansible 部署的所有配置文件,我們需要告訴 Ansible 部署哪個伺服器。我們需要在 Ansible 中指定 hosts 文件。先備份現有的文件,並新建一個新文件來部署。
$ sudo mv /etc/ansible/hosts /etc/ansible/hosts.backup
$ sudo vim /etc/ansible/hosts
在文件中輸入(或編輯)以下行來創建一個名為 nginx 的組並列出安裝 NGINX 的伺服器。你可以通過主機名、IP 地址、或者在一個範圍,例如 server[1-3].domain.com 來指定伺服器。在這裡,我通過 IP 地址指定一台伺服器。
# /etc/ansible/hosts
[nginx]
172.16.239.140
設置安全性
接近完成了,但在部署之前,我們需要確保 Ansible 已被授權通過 SSH 訪問我們的目標伺服器。
首選並且最安全的方法是添加 Ansible 所要部署伺服器的 RSA SSH 密鑰到目標伺服器的 authorized_keys 文件中,這給予 Ansible 在目標伺服器上的不受限制 SSH 許可權。要了解更多關於此配置,請參閱 wiki.centos.org 上 安全加固 OpenSSH。這樣,你就可以自動部署而無需用戶交互。
另外,你也可以在部署過程中要求輸入密碼。我強烈建議你只在測試過程中使用這種方法,因為它是不安全的,沒有辦法跟蹤目標主機的身份(fingerprint)變化。如果你想這樣做,將每個目標主機 /etc/ssh/ssh_config 文件中 StrictHostKeyChecking 的默認值 yes 改為 no。然後在 ansible-playbook 命令中添加 --ask-pass 參數來讓 Ansible 提示輸入 SSH 密碼。
在這裡,我將舉例說明如何編輯 ssh_config 文件來禁用在目標伺服器上嚴格的主機密鑰檢查。我們手動連接 SSH 到我們將部署 NGINX 的伺服器,並將 StrictHostKeyChecking 的值更改為 no。
$ ssh kjones@172.16.239.140
kjones@172.16.239.140's password:***********
[kjones@nginx ]$ sudo vim /etc/ssh/ssh_config
當你更改後,保存 ssh_config,並通過 SSH 連接到你的 Ansible 伺服器。保存後的設置應該如下所示。
# /etc/ssh/ssh_config
StrictHostKeyChecking no
運行 Ansible 部署 NGINX
如果你一直照本教程的步驟來做,你可以運行下面的命令來使用 Ansible 部署 NGINX。(再次提示,如果你設置了 RSA SSH 密鑰認證,那麼 --ask-pass 參數是不需要的。)在 Ansible 伺服器運行命令,並使用我們上面創建的配置文件。
$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx/deploy.yml
Ansible 提示輸入 SSH 密碼,輸出如下。recap 中顯示 failed=0 這條信息,意味著部署成功了。
$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx/deploy.yml
SSH password:
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.239.140]
TASK: [NGINX | Installing NGINX repo rpm] *************************************
changed: [172.16.239.140]
TASK: [NGINX | Installing NGINX] **********************************************
changed: [172.16.239.140]
TASK: [NGINX | Starting NGINX] ************************************************
changed: [172.16.239.140]
PLAY RECAP ********************************************************************
172.16.239.140 : ok=4 changed=3 unreachable=0 failed=0
如果你沒有得到一個成功的 play recap,你可以嘗試用 -vvvv 參數(帶連接調試的詳細信息)再次運行 ansible-playbook 命令來解決部署過程的問題。
當部署成功(假如我們是第一次部署)後,你可以在遠程伺服器上運行基本的 cURL 命令驗證 NGINX 。在這裡,它會返回 200 OK。Yes!我們使用 Ansible 成功安裝了 NGINX。
$ curl -Is 172.16.239.140 | grep HTTP
HTTP/1.1 200 OK
創建 Ansible Playbook 來安裝 NGINX Plus (CentOS)
現在,我已經展示了如何安裝 NGINX 的開源版本,我將帶你完成安裝 NGINX Plus。這需要更改一些額外的部署配置,並展示了一些 Ansible 的其他功能。
複製 NGINX Plus 上的證書和密鑰到 Ansible 伺服器
使用 Ansible 安裝和配置 NGINX Plus 時,首先我們需要將 NGINX Plus Customer Portal NGINX Plus 訂閱的密鑰和證書複製到 Ansible 部署伺服器上的標準位置。
購買了 NGINX Plus 或正在試用的客戶也可以訪問 NGINX Plus Customer Portal。如果你有興趣測試 NGINX Plus,你可以申請免費試用30天,點擊這裡。在你註冊後不久你將收到一個試用證書和密鑰的鏈接。
在 Mac 或 Linux 主機上,我在這裡使用 scp 工具演示。在 Microsoft Windows 主機,可以使用 WinSCP。在本教程中,先下載文件到我的 Mac 筆記本電腦上,然後使用 scp 將其複製到 Ansible 伺服器。密鑰和證書的位置都在我的家目錄下。
$ cd /path/to/nginx-repo-files/
$ scp nginx-repo.* user@destination-server:.
接下來,我們通過 SSH 連接到 Ansible 伺服器,確保 NGINX Plus 的 SSL 目錄存在,移動文件到這兒。
$ ssh user@destination-server
$ sudo mkdir -p /etc/ssl/nginx/
$ sudo mv nginx-repo.* /etc/ssl/nginx/
驗證你的 /etc/ssl/nginx 目錄包含了證書(.crt)和密鑰(.key)文件。你可以使用 tree 命令檢查。
$ tree /etc/ssl/nginx
/etc/ssl/nginx
├── nginx-repo.crt
└── nginx-repo.key
0 directories, 2 files
如果你沒有安裝 tree,可以使用下面的命令去安裝。
$ sudo yum install -y tree
創建 Ansible 目錄結構
以下執行的步驟和我們的「創建 Ansible Playbook 來安裝 NGINX(CentOS)」小節中部署開源 NGINX 的非常相似。首先,我們建一個工作目錄用於部署 NGINX Plus 使用。我喜歡將它創建為我主目錄的子目錄。
$ cd $HOME
$ mkdir -p ansible-nginx-plus/tasks/
$ touch ansible-nginx-plus/deploy.yml
$ touch ansible-nginx-plus/tasks/install_nginx_plus.yml
目錄結構看起來像這樣。
$ tree $HOME/ansible-nginx-plus/
/home/kjones/ansible-nginx-plus/
├── deploy.yml
└── tasks
└── install_nginx_plus.yml
1 directory, 2 files
創建主部署文件
接下來,像開源的 NGINX 一樣,我們使用 vim 創建 deploy.yml 文件。
$ vim ansible-nginx-plus/deploy.yml
和開源 NGINX 的部署唯一的區別是,我們將包含文件的名稱修改為 install_nginx_plus.yml。該文件告訴 Ansible 在 nginx 組中的所有伺服器(/etc/ansible/hosts 中定義的)上部署 NGINX Plus ,然後在部署過程中從 tasks 目錄讀取並執行 install_nginx_plus.yml 的內容。
# ./ansible-nginx-plus/deploy.yml
- hosts: nginx
tasks:
- include: 'tasks/install_nginx_plus.yml'
如果你之前沒有安裝過的話,你需要創建 hosts 文件,詳細說明在上面的「創建 NGINX 伺服器的列表」小節。
為 NGINX Plus 創建部署文件
在文本編輯器中打開 install_nginx_plus.yml。該文件包含了使用 Ansible 來安裝和配置 NGINX Plus 部署過程中的指令。這些命令和模塊僅針對 CentOS,有些是 NGINX Plus 獨有的。
$ vim ansible-nginx-plus/tasks/install_nginx_plus.yml
第一節使用 file
模塊,告訴 Ansible 使用指定的path
和state
參數為 NGINX Plus 創建特定的 SSL 目錄,設置屬主為 root,將許可權 mode
更改為0700。
# ./ansible-nginx-plus/tasks/install_nginx_plus.yml
- name: NGINX Plus | 創建 NGINX Plus ssl 證書目錄
file: path=/etc/ssl/nginx state=directory group=root mode=0700
接下來的兩節使用 copy 模塊從 Ansible 部署伺服器上將 NGINX Plus 的證書和密鑰複製到 NGINX Plus 伺服器上,再修改屬主為 root,許可權 mode
為0700。
- name: NGINX Plus | 複製 NGINX Plus repo 證書
copy: src=/etc/ssl/nginx/nginx-repo.crt dest=/etc/ssl/nginx/nginx-repo.crt owner=root group=root mode=0700
- name: NGINX Plus | 複製 NGINX Plus 密鑰
copy: src=/etc/ssl/nginx/nginx-repo.key dest=/etc/ssl/nginx/nginx-repo.key owner=root group=root mode=0700
接下來,我們告訴 Ansible 使用 get_url
模塊在 url 參數指定的遠程位置從 NGINX Plus 倉庫下載 CA 證書,通過 dest
參數把它放在指定的目錄 dest
,並設置許可權 mode
為 0700。
- name: NGINX Plus | 下載 NGINX Plus CA 證書
get_url: url=https://cs.nginx.com/static/files/CA.crt dest=/etc/ssl/nginx/CA.crt mode=0700
同樣,我們告訴 Ansible 使用 get_url
模塊下載 NGINX Plus repo 文件,並將其複製到 NGINX Plus 伺服器上的 /etc/yum.repos.d 目錄下。
- name: NGINX Plus | 下載 yum NGINX Plus 倉庫
get_url: url=https://cs.nginx.com/static/files/nginx-plus-7.repo dest=/etc/yum.repos.d/nginx-plus-7.repo mode=0700
最後兩節的 name
告訴 Ansible 使用 yum
和 service
模塊下載並啟動 NGINX Plus。
- name: NGINX Plus | 安裝 NGINX Plus
yum:
name: nginx-plus
state: latest
- name: NGINX Plus | 啟動 NGINX Plus
service:
name: nginx
state: started
運行 Ansible 來部署 NGINX Plus
在保存 install_nginx_plus.yml 文件後,運行 ansible-playbook 命令來部署 NGINX Plus。同樣在這裡,我們使用 --ask-pass 參數使用 Ansible 提示輸入 SSH 密碼並把它傳遞給每個 NGINX Plus 伺服器,並指定主配置文件路徑 deploy.yml 文件。
$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx-plus/deploy.yml
PLAY [nginx] ******************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.239.140]
TASK: [NGINX Plus | Creating NGINX Plus ssl cert repo directory] **************
changed: [172.16.239.140]
TASK: [NGINX Plus | Copying NGINX Plus repository certificate] ****************
changed: [172.16.239.140]
TASK: [NGINX Plus | Copying NGINX Plus repository key] ************************
changed: [172.16.239.140]
TASK: [NGINX Plus | Downloading NGINX Plus CA certificate] ********************
changed: [172.16.239.140]
TASK: [NGINX Plus | Downloading yum NGINX Plus repository] ********************
changed: [172.16.239.140]
TASK: [NGINX Plus | Installing NGINX Plus] ************************************
changed: [172.16.239.140]
TASK: [NGINX Plus | Starting NGINX Plus] **************************************
changed: [172.16.239.140]
PLAY RECAP ********************************************************************
172.16.239.140 : ok=8 changed=7 unreachable=0 failed=0
playbook 的 recap 成功完成。現在,使用 curl 命令來驗證 NGINX Plus 是否在運行。太好了,我們得到的是 200 OK!成功了!我們使用 Ansible 成功地安裝了 NGINX Plus。
$ curl -Is http://172.16.239.140 | grep HTTP
HTTP/1.1 200 OK
在 Ubuntu 上創建 Ansible Playbook 來安裝 NGINX 和 NGINX Plus
在 Ubuntu 伺服器 上部署 NGINX 和 NGINX Plus 的過程與 CentOS 很相似,我將一步一步的指導來完成整個部署文件,並指出和 CentOS 的細微差異。
首先和 CentOS 一樣,創建 Ansible 目錄結構和 Ansible 主部署文件。也按「創建 NGINX 伺服器的列表」小節的描述創建 /etc/ansible/hosts 文件。對於 NGINX Plus,你也需要安裝「複製 NGINX Plus 證書和密鑰到 Ansible 伺服器」小節的描述複製證書和密鑰。
下面是開源 NGINX 的 install_nginx.yml 部署文件。在第一節,我們使用 apt_key
模塊導入 NGINX 的簽名密鑰。接下來的兩節使用 lineinfile
模塊來添加 Ubuntu 14.04 的軟體包 URL 到 sources.list 文件中。最後,我們使用 apt
模塊來更新緩存並安裝 NGINX(apt
取代了我們在 CentOS 中部署時的 yum
模塊)。
# ./ansible-nginx/tasks/install_nginx.yml
- name: NGINX | 添加 NGINX 簽名密鑰
apt_key: url=http://nginx.org/keys/nginx_signing.key state=present
- name: NGINX | 為 NGINX 添加 sources.list deb url
lineinfile: dest=/etc/apt/sources.list line="deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx"
- name: NGINX Plus | 為 NGINX 添加 sources.list deb-src url
lineinfile: dest=/etc/apt/sources.list line="deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx"
- name: NGINX | 更新 apt 緩存
apt:
update_cache: yes
- name: NGINX | 安裝 NGINX
apt:
pkg: nginx
state: latest
- name: NGINX | 啟動 NGINX
service:
name: nginx
state: started
下面是 NGINX Plus 的部署文件 install_nginx.yml。前四節設置了 NGINX Plus 密鑰和證書。然後,我們像開源的 NGINX 一樣用 apt_key
模塊導入簽名密鑰,get_url
模塊為 NGINX Plus 下載 apt
配置文件。shell
模塊使用 printf
命令寫下輸出到 sources.list.d 目錄中的 nginx-plus.list 文件。最終的 name
模塊和開源 NGINX 一樣。
# ./ansible-nginx-plus/tasks/install_nginx_plus.yml
- name: NGINX Plus | 創建 NGINX Plus ssl 證書 repo 目錄
file: path=/etc/ssl/nginx state=directory group=root mode=0700
- name: NGINX Plus | 複製 NGINX Plus 倉庫證書
copy: src=/etc/ssl/nginx/nginx-repo.crt dest=/etc/ssl/nginx/nginx-repo.crt owner=root group=root mode=0700
- name: NGINX Plus | 複製 NGINX Plus 倉庫密鑰
copy: src=/etc/ssl/nginx/nginx-repo.key dest=/etc/ssl/nginx/nginx-repo.key owner=root group=root mode=0700
- name: NGINX Plus | 安裝 NGINX Plus CA 證書
get_url: url=https://cs.nginx.com/static/files/CA.crt dest=/etc/ssl/nginx/CA.crt mode=0700
- name: NGINX Plus | 添加 NGINX Plus 簽名密鑰
apt_key: url=http://nginx.org/keys/nginx_signing.key state=present
- name: NGINX Plus | 安裝 Apt-Get NGINX Plus 倉庫
get_url: url=https://cs.nginx.com/static/files/90nginx dest=/etc/apt/apt.conf.d/90nginx mode=0700
- name: NGINX Plus | 為 NGINX Plus 添加 sources.list url
shell: printf "deb https://plus-pkgs.nginx.com/ubuntu `lsb_release -cs` nginx-plusn" >/etc/apt/sources.list.d/nginx-plus.list
- name: NGINX Plus | 運行 apt-get update
apt:
update_cache: yes
- name: NGINX Plus | 安裝 NGINX Plus 通過 apt-get
apt:
pkg: nginx-plus
state: latest
- name: NGINX Plus | 啟動 NGINX Plus
service:
name: nginx
state: started
現在我們已經準備好運行 ansible-playbook 命令:
$ sudo ansible-playbook --ask-pass $HOME/ansible-nginx-plus/deploy.yml
你應該得到一個成功的 play recap。如果你沒有成功,你可以使用冗餘參數,以幫助你解決出現的問題。
小結
我在這個教程中演示是什麼是 Ansible,可以做些什麼來幫助你自動部署 NGINX 或 NGINX Plus,這僅僅是個開始。還有許多有用的模塊,包括從用戶賬號管理到自定義配置模板等。如果你有興趣了解關於這些的更多信息,請訪問 Ansible 官方文檔。
via: https://www.nginx.com/blog/installing-nginx-nginx-plus-ansible/
作者:Kevin Jones 譯者:strugglingyouth 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive