Linux中國

使用 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 文件中的節的下一行是在部署過程中將使用的模塊。在下面的配置中,使用了 yumservice 模塊。yum 模塊用於在 CentOS 上安裝軟體包。service 模塊用於管理 UNIX 的服務。在這個節的最後一行或幾行指定了幾個模塊的參數(在本例中,這些行以 namestate 開始)。

在文件中輸入以下行。就像 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 使用指定的pathstate參數為 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 使用 yumservice 模塊下載並啟動 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國