Ansible實現主備模式的高可用(Keepalived)

来源:https://www.cnblogs.com/walk1314/archive/2018/10/29/9836624.html
-Advertisement-
Play Games

前言 Ansible是一款極其簡單的IT自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。Ansible是基於模塊工作的,本身沒有批量部署的能力,真正具有批量部署的 ...


前言

  Ansible是一款極其簡單的IT自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。Ansible是基於模塊工作的,本身沒有批量部署的能力,真正具有批量部署的是Ansible所運行的模塊,Ansible只是提供一種框架。Ansible主要承擔的工作包括:配置管理、服務即時開通、應用部署、流程編排、監控告警、日誌記錄等。

  Ansible的基本架構:

  • 核心模塊(Core Module):在模塊庫(Module Library)中分為兩塊,一個是核心模塊,另外一個就是自定義模塊(Custom Modules)。核心模塊中都是Ansible自帶的模塊,模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態;
  • 自定義模塊(Custom Modules):如果Ansible滿足不了你所需求的模塊,則在此處添加自定義化的模塊;
  • 插件(Plugins):協助模塊來完成某個功能;
  • 劇本(Playbooks):定義需要給遠程主機執行的一系列任務;
  • 連接插件(Connectior Plugins):Ansible預設基於SSH連接到目標機器上執行操作的,但也支持不同的連接方法,此時需要連接插件來幫助我們完成連接;
  • 主機清單(Host Inventory):定義需要管理的主機,小型環境中我們只需要在host文件中寫入主機的IP地址即可,但到了中大型環境我們有可能需要使用靜態inventory或者動態主機清單來生成我們所需要執行的目標主機。

實驗拓撲圖

  兩台Nginx作為Web Proxy,配置實現KeepAlived做主備;後端兩台Apache,一臺部署Apache+PHP,一臺部署Apache+MySQL。

搭建Ansible

[root@ansible ~]# systemctl stop firewalld.service
[root@ansible ~]# systemctl disable firewalld.serive
[root@ansible ~]# vim /etc/selinux/config
    ...
    SELINUX=disabled
    ...
[root@ansible ~]# init 6
[root@ansible ~]# ntpdate ntp1.aliyun.com
[root@ansible ~]# yum -y install ansible
[root@ansible ~]# vim /etc/ansible/hosts
    ...
    [hasrvs]
    192.168.4.117
    192.168.4.118
    [websrvs]
    192.168.4.119
    192.168.4.120
  [php]
  192.168.4.119
  [mysql]
  192.168.4.120 [root@ansible ~]# vim /etc/hosts ... 192.168.4.117 nginx1 192.168.4.118 nginx2 192.168.4.119 apache1 192.168.4.120 apache2 [root@ansible ~]# ssh-keygen -t rsa -N '' #生成密鑰對,實現ssh免密碼登錄 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub [root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] #複製公鑰到各遠程主機 [root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] [root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected] [root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]

 測試連通性

[root@ansible ~]# ansible all -m ping
    192.168.4.117 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.4.118 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.4.120 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.4.119 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }

同步時間,關閉firewalld及selinux

[root@ansible ~]# ansible all -m shell -a 'echo "TZ='Asia/Shanghai'; export TZ" >> /etc/profile'
[root@ansible ~]# ansible all -m cron -a 'minute=*/5 job="/usr/sbin/ntpdate ntp1.aliyun.com &> /dev/null" name=UpdateTime'  #每隔3分鐘同步一次時間
[root@ansible ~]# ansible all -m shell -a 'systemctl stop firewalld.service; systemctl disable firewalld.service; setenfore 0'

 配置Apache服務的roles

[root@ansible ~]# mkdir -pv /etc/ansible/roles/apache/{files,templates,tasks,handlers,vars,meta,default}  #創建相關目錄
[root@ansible ~]# vim /etc/ansible/roles/apache/templates/vhost.conf.j2  #Apache主機模板
    <virtualhost *:80>
        ServerName www.test.org
        DirectoryIndex index.html index.php
        DocumentRoot /var/www/html
        ProxyRequests off
        ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.4.119:9000/var/www/html/$1
        ProxyPassMatch ^/(ping|status)$ fcgi://192.168.4.119:9000/$1
        <Directory />
        options FollowSymlinks
        Allowoverride None
        Require all granted
        </Directory>
    </virtualhost>
[root@ansible ~]# vim /etc/ansible/roles/apache/templates/index.html  #Apache主頁
    <h1> This is {{ ansible_hostname }} </h1>
[root@ansible ~]# vim /etc/ansible/roles/apache/files/index.php
    <?php
        phpinfo();
    ?>
[root@ansible ~]# vim /etc/ansible/roles/apache/tasks/main.yml  #定義實現Apache的task
    - name: install apache
      yum: name=httpd state=latest
    - name: copy conf
      template: src=vhost.conf.j2 dest=/etc/httpd/conf.d/vhost.conf
    - name: copy index.html
      template: src=index.html dest=/var/www/html/index.html
    - name: copy index.php
      copy: src=index.php dest=/var/www/html/index.php
    - name: start httpd
      service: name=httpd state=started

配置php-fpm服務的roles

[root@ansible ~]# mkdir -pv /etc/ansible/roles/php-fpm/{files,templates,tasks,handlers,vars,meta,default}  #創建相關目錄
[root@ansible ~]# cp /etc/php-fpm.d/www.conf /etc/ansible/roles/php-fpm/templates/www.conf.j2  #直接複製事先準備的配置模板
[root@ansible ~]# vim /etc/ansible/roles/php-fpm/templates/www.conf.j2
    #修改如下配置
    listem = 0.0.0.0:9000
    ;listen.allowed_clients = 127.0.0.1
    pm.status_path = /status
    ping.path = /ping
    ping.response = pong
[root@ansible ~]# vim /etc/ansible/roles/php-fpm/tasks/main.yml  #定義實現php-fpm的task
    - name: install php
      yum: name={{ item }} state=latest
      with_items:
      - php-fpm
      - php-mysql
      - php-mbstring
      - php-mcrypt
    - name: copy config
      template: src=www.conf.j2 dest=/etc/php-fpm.d/www.conf
    - name: create directory
      file: path=/var/lib/php/session group=apache owner=apache state=directory
    - name: start php-fpm
      service: name=php-fpm state=started

 配置MySQL服務的roles

[root@ansible ~]# mkdir -pv /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,meta,default}  #創建相關目錄
[root@ansible ~]# cp /etc/my.cnf /etc/ansible/roles/mysql/templates/my.cnf.j2  #複製事先準備的模板
[root@ansible ~]# vim /etc/ansible/roles/mysql/templates/my.cnf.j2
    #添加如下配置
    skip-name-resolve=ON
    innodb-file-per-table=ON
[root@ansible ~]# vim /etc/ansible/roles/mysql/tasks/main.yml  #定義實現MySQL的task
    - name: install mysql
      yum: name=mariadb-server state=latest
    - name: copy config
      template: src=my.cnf.j2 dest=/etc/my.cnf
    - name: start mysql
      service: name=mariadb state=started

配置Nginx服務的roles

[root@ansible ~]# mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,meta,default}  #創建相關目錄
[root@ansible ~]# cp /etc/nginx/nginx.conf /etc/ansible/roles/nginx/templates/nginx.conf.j2  #複製事先準備的模板
[root@ansible ~]# vim /etc/ansible/roles/nginx/templates/nginx.conf.j2
  #修改配置 http { ... upstream websrvs { server 192.168.4.119:80; server 192.168.4.120:80; server 127.0.0.1:80 backup; } server { listen 80; include /etc/nginx/default.d/*.conf; location / { proxy_pass http://websrvs; proxy_set_header host $http_host; proxy_set_header X-Forward-For $remote_addr; } ... } ... } [root@ansible ~]# vim /etc/ansible/roles/nginx/templates/localhost.conf.j2 #定義本地的Nginx服務 server { listen 127.0.0.1:80; root /usr/share/nginx/html; index index.html; } [root@ansible ~]# vim /etc/ansible/roles/nginx/templates/index.html <h1> Balance Server {{ ansible_hostname }} </h1> [root@ansible ~]# vim /etc/ansible/roles/nginx/tasks/main.yml #定義實現Nginx的task - name: install nginx yum: name=nginx state=latest - name: copy nginx conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: copy local conf template: src=localhost.conf.j2 dest=/etc/nginx/conf.d/localhost.conf - name: copy index template: src=index.html dest=/usr/share/nginx/html/index.html - name: start nginx service: name=nginx state=started

 配置KeepAlived服務的roles

[root@ansible keepalived]# mkdir -pv /etc/ansible/roles/keepalived/{files,templates,tasks,handlers,vars,meta,default}  #創建相關目錄
[root@ansible keepalived]# vim /etc/ansible/roles/keepalived/templates/keepalived.conf.j2  #KeepAlived配置文件
    global_defs {
           notification_email {
             root@localhost
           }
           notification_email_from keepalived@localhost
           smtp_server 127.0.0.1
           smtp_connect_timeout 30
           router_id {{ ansible_nodename }}
           vrrp_skip_check_adv_addr
           vrrp_mcast_group4 224.0.0.10
    }
    
    vrrp_instance VIP_1 {
        state {{ keepalived_role }}
        interface eno16777736
        virtual_router_id 1
        priority {{ keepalived_pri }}
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass %&hhjj99
        }
        virtual_ipaddress {
          192.168.4.155/24 dev eno16777736 label eno16777736:0
        }
    }
[root@ansible keepalived]# vim /etc/ansible/hosts  #添加變數
        ...
    [hasrvs]
    192.168.4.117 keepalived_role=MASTER keepalived_pri=100
    192.168.4.118 keepalived_role=BACKUP keepalived_pri=99
    ...
[root@ansible keepalived]# vim /etc/ansible/roles/keepalived/tasks/main.yml  #定義實現Keepalived的task
    - name: install keepalived
      yum: name=keepalived state=latest
    - name: copy config
      template: src=keepalived.conf.j2 dest=/etc/keepalived/keepalived.conf
    - name: start keepalived
      service: name=keepalived state=started

 配置Apache+PHP服務的playbook

[root@ansible keepalived]# mkdir /etc/ansible/playbooks  #創建playbook存放目錄
[root@ansible roles]# vim /etc/ansible/playbooks/ap1.yml  定義實現Apache+php-fpm的playbook
    - hosts: php
      remote_user: root
      roles:
      - apache
      - php-fpm
[root@ansible roles]# ansible-playbook --syntax-check /etc/ansible/playbooks/ap1.yml  #檢查是否有語法錯誤
[root@ansible roles]# ansible-playbook /etc/ansible/playbooks/ap1.yml  #執行

配置Apache+MySQL服務的playbook

[root@ansible ~]# vim /etc/ansible/playbooks/ap2.yml
    - hosts: mysql
      remote_user: root
      roles:
      - apache
      - mysql
[root@ansible ~]# ansible-playbook --syntax-check /etc/ansibleplaybooks/ap2.yml
[root@ansible ~]# ansible-playbook /etc/ansibleplaybooks/ap2.yml

 配置Nginx+Keepalived服務的playbook

[root@ansible ~]# vim /etc/ansible/playbooks/ha.yml
    - hosts: hasrvs
      remote_user: root
      roles:
      - nginx
      - keepalived 
[root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/playbooks/ha.yml 
[root@ansible ~]# ansible-playbook /etc/ansible/playbooks/ha.yml

 客戶端測試訪問

[root@client ~]# vim /etc/hosts
    ...
    192.168.4.155 www.test.org
    ...
[root@client ~]# for i in {1..10};do curl http://www.test.org;done
    <h1> This is apache2 </h1>
    <h1> This is apache1 </h1>
    <h1> This is apache2 </h1>
    <h1> This is apache1 </h1>
    <h1> This is apache2 </h1>
    <h1> This is apache1 </h1>
    <h1> This is apache2 </h1>
    <h1> This is apache1 </h1>
    <h1> This is apache2 </h1>
    <h1> This is apache1 </h1>

小插曲:

  [root@ansible ~]# ansible all -m ping --list-hosts
  ERROR! Unexpected Exception, this is probably a bug: (cryptography 0.8.2 (/usr/lib64/python2.7/site-packages), Requirement.parse('cryptography>=1.1'))

  運行ansible命令時報錯,python的cryptography版本必須>=1.1。

  解決辦法:

  [root@ansible ~]# yum -y install python-pip

  [root@ansible ~]# pip install --upgrade cryptography


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用Visual Studio Installer2015打包WPF程式 ...
  • 前言 通過後臺,想刪除C盤下”C:\\Windows\\winsxs\\Backup“的緩存文件。 然後提示對路徑“C:\\Windows\\winsxs\\Backup\\amd64_hid-user.resources_31bf3856ad364e35_10.0.17134.1_zh-cn_aa ...
  • C# -- 隨機數產生的字母金字塔 1. 代碼實現: 2. 運行結果: ...
  • 摘要: 寫在前面:此隨筆僅僅是作為個人學習總結,有不對的地方,請各位前輩指正O(∩_∩)O........ 一: 引入 在學習集合之前我們都學習過數組.可以知道數組的長度在聲明的時候就已經被固定了,不可以增加或者修改.這個時候我們想要有數組的效果,又可以隨意的改變長度,那怎麼辦呢?此時我們的集合就出 ...
  • 以前一直搞的centos配置開機啟動腳本,但是相同方法用在ubuntu系統上就不管用了,非常傷腦筋. 非常感謝 https://www.linuxidc.com/Linux/2017-09/147178.htm http://www.linuxdiyf.com/linux/26896.html 這兩 ...
  • mkswap 在Linux設備或者文件中創建交換分區,創建完成之後必須使用swapon來使用它。一般在“/etc/fstab”中有一個交換分區列表,這樣開機的時候就可以使用它。 此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 1、語法 ...
  • 入門總結 Awk簡介 awk不僅僅時linux系統中的一個命令,而且是一種編程語言,可以用來處理數據和生成報告。處理的數據可以是一個或多個文件,可以是來自標準輸入,也可以通過管道獲取標準輸入,awk可以在命令行上直接編輯命令進行操作,也可以編寫成awk程式來進行更為複雜的運用。 ※查看awk的版本 ...
  • rmdir是常用的命令,該命令的功能是刪除空目錄,一個目錄被刪除之前必須是空的。(註意,rm r dir命令可代替rmdir,但是有很大危險性。)刪除某目錄時也必須具有對父目錄的寫許可權。 一.命令格式 rmdir [參數] 目錄 二.命令功能: 該命令從一個目錄中刪除一個或多個子目錄項,刪除某目錄時 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...