Ansible 搭建多臺lamp架構

ansible概述

  • Ansible是一款爲類Unix系統開發的自由開源的配置和自動化工具。
  • 它用Python成,類似於saltstackPuppet,但是有一個不同和優點是我們不需要在節點中安裝任何客戶端。
  • 它使用SSH來和節點進行通信。
  • Ansible基於 Python paramiko 開發,分佈式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操作

官方網站:

https://www.ansible.com/

技術背景

  • 2015年10月,紅帽(Red Hat)宣佈收購軟件開發公司 Ansible,消息稱此次收購耗資逾 1億美元,也有消息稱接近 1.5億美元。
  • Ansible 成立於 2013年,總部設在北卡羅來納州達勒姆,聯合創始人 aïd Ziouani高級副總裁 Todd Barr 都是紅帽的老員工。
  • Ansible 旗下的開源軟件 Ansible 十分流行。這家公司還提供 Tower 軟件和諮詢服務,這個款軟件能使開發者輕鬆地建立和管理規模化應用程序的 IT 基礎架構

ansible 可以做什麼

  • 系統初始化

  • 中間件部署

  • 應用發佈

  • 日常維護

ansiblle特點

1.部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2. 默認使用SSH協議對設備進行管理
3. 主從集中化管理
4. 配置簡單、功能強大、擴展性強;
5. 支持API及自定義模塊,可通過Python輕鬆擴展;
6. 通過Playbooks來定製強大的配置、狀態管理
7. 對雲計算平臺、大數據都有很好的支持;

Ansible 工作機制

Ansible 在管理節點將 Ansible 模塊通過 SSH 協議推送到被管理端執行,執行完之後自動刪除,可以使用 SVN 等來管理自定義模塊及編排。
在這裏插入圖片描述

在這裏插入圖片描述

安裝並配置Ansible管理兩個節點

安裝ansible服務

  1. 設置EPEL倉庫
    Ansible倉庫默認不在yum倉庫中,因此我們需要使用下面的命令啓用epel倉庫。
    [root@ansible ~]# yum install epel-release -y

  2. 使用yum安裝Ansible
    [root@ansible ~]# yum -y install ansible -y

  3. 查看ansible 版本
    [root@ansible ~]# ansible --version

  • 實驗拓撲
    在這裏插入圖片描述
  • ansible 服務端 192.168.43.121
  • ansible節點1 192.168.43.167
  • ansible節點2 192.168.43.168

ansible命令參數

  • anisble命令語法:
    ansible -i (主機文件) -f (批次) 組名 -m 模塊名稱 -a 模塊參數

  • ansible詳細參數:

-v,-verbose # 詳細模式,如果命令執行成功,輸出詳細的結果 (-vv –vvv -vvvv)

-i PATH, -inventory=PATH # 指定 host 文件的路徑,默認是在/etc/ansible/hosts
inventory [ˈɪnvəntri] 庫存

-f NUM,-forks=NUM # NUM 是指定一個整數,默認是 5 ,指定 fork 開啓同步進程的個數。

-m NAME,-module-name=NAME # 指定使用的 module 名稱,默認使用 command模塊

-a,MODULE_ARGS #指定 module 模塊的參數

-k, ask-pass #提示輸入 ssh 的密碼,而不是使用基於 ssh 的密鑰認證

-sudo # 指定使用 sudo 獲得 root 權限

-K,-ask-sudo-pass #提示輸入 sudo 密碼,與 -sudo 一起使用

-u USERNAME,-user=USERNAME # 指定移動端的執行用戶

-C,-check #測試此命令執行會改變什麼內容,不會真正的去執行

ansible-doc詳細參數
ansible-doc -l #列出所有的模塊列表
ansible-doc -s 模塊名 #查看指定模塊的參數 -s, snippet 片斷

定義主機清單

  1. 基於端口,用戶,密碼定義主機清單
    ansible基於ssh連接-i (inventory)參數後指定的遠程主機時,也可以寫端口,用戶,密碼。
  2. 格式:
  3. ansible_ssh_port:指定ssh端口
  4. ansible_ssh_user:指定 ssh 用戶
  5. ansible_ssh_pass:指定 ssh 用戶登錄是認證密碼(明文密碼不安全)
  6. ansible_sudo_pass:指明 sudo 時候的密碼
  7. eg:
    [root@ansible ~]# vim /etc/ansible/hosts #文件 /etc/ansible/hosts 維護着Ansible中服務器的清單。在文件最後追加以下內容(或者主機組下面添加,默認是被註釋掉的)
    [webservers] #主機組名
    192.168.43.121 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
  • 簡單測試下主機的連通性
  • [root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m ping
    -i # 指定 host 文件的路徑,默認是在 /etc/ansible/hosts
    -m # 指定使用的ping模塊

報錯:
192.168.43.167 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host." }

  • 解決[root@ansible ~]# ssh [email protected] #手動連接一下/etc/ansible/hosts主機清單中的主機,這樣就可以在ansible服務器上保存目標主機的fingerprint指紋。後期可以正常連接了

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping #測試成功

192.168.43.167 | SUCCESS=> { #表示成測試。通信成功
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”:false, , #因爲ping命令不會改變被管理的服務器的狀態。所以是false正常
“ping”: “pong”
}
[root@ansible ~]#

  • 基於ssh密鑰來訪問定義主機清單
    一般來說,使用明文密碼不安全,所以增加主機無密碼訪問。
    在Ansible服務端生成密鑰,並且複製公鑰到節點中。

[root@ansible .ssh]#ssh-keygen #一直往下回車

使用ssh-copy-id命令來複制Ansible公鑰到節點:43.167和43.168

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   #直接回車
Enter passphrase (empty for no passphrase):   #直接回車
Enter same passphrase again:  #直接回車
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TeGAs3mkAh3sdu9A6B1Ia+/Pze9slz+JbTUdy1dR4Nw root@ansible
The key's randomart image is:
+---[RSA 2048]----+
|   o.. .. .   ..o|
|  . + o .o . o o |
|   + + *  o   o E|
|    O B .o     ..|
|   + * +S .   . =|
|    . + .      ++|
|     . o      o.=|
|      ...o ...o= |
|       .o o++...o|
+----[SHA256]-----+

[root@ansible .ssh]# ssh-copy-id [email protected]

在Ansible服務端運行命令

ping模塊檢查網絡連通性

command模塊執行shell命令,command:作爲ansible的默認模塊,可以運行遠程權限範圍內的所有shell命令

例1:使用ping檢查‘webservers’或者ansible節點的連通性。
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping
或:
[root@ansible ~]#ansible 'web-servers' -m ping#不指定,默認使用/etc/ansible/hosts文件

檢查Ansible節點的運行時間(uptime)

[root@ansible ~]# ansible -m command -a "uptime" webservers #在所以機器上執行uptime命令

檢查節點的內核版本

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "uname -r" webservers

給節點增加用戶

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "useradd wyh123" webservers #給所以節點增加一個用戶 wyh123

過濾下創建的用戶 wyh123

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "grep wyh123 /etc/passwd" webservers

將df命令在所有節點執行後,重定向輸出到本機的/tmp/wyh-output.txt文件中

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command - "df -Th" webservers >/tmp/wyh-output.txt

ansible常見模塊高級使用方法

- command模塊爲ansible默認模塊,不指定-m參數時,使用的就是command模塊; comand模塊比較簡單,常見的命令都可以使用,但其命令的執行不是通過shell執行的,所以,像這些"<", ">", "|", and "&"操作都不可以,當然,也就不支持管道; 缺點:不支持管道,沒法批量執行命令;
  • shell模塊:使用shell模塊,在遠程命令通過/bin/sh來執行;所以,我們在終端輸入的各種命令方式,都可以使用。
  • 對shell模塊的使用可以分成兩塊:shell 命令少,命令多

運行free -m 命令

[root@ansible ~]# ansible -i /etc/ansible/hosts -m shell -a "free -m" webservers

注:但是我們自己定義在/.bashrc或/.bash_profile中的環境變量shell模塊由於沒有加載,所以無法識別;如果需要使用自定義的環境變量,就需要在最開始,執行加載自定義腳本的語句;
[root@ansible ~]# source ~/.bash_profile

  1. 如果待執行的語句少,可以直接寫在一句話中:
    [root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m shell -a "source ~/.bash_profile && df -h | grep sda3"

  2. 如果在遠程待執行的語句比較多,可寫成一個腳本,通過copy模塊傳到遠端,然後再執行;但這樣就又涉及到兩次ansible調用;對於這種需求,ansible已經爲我們考慮到了,script模塊就是幹這事的;

3)、scripts模塊
使用scripts模塊可以在本地寫一個腳本,在遠程服務器上執行:

[root@ansible ~]# cat net.sh
#!bin/bash
date
hostname

[root@ansible ~]# mkdir /opt/script
[root@ansible ~]# mv net.sh /opt/script/
[root@ansible ~]# cd /opt/script/
[root@ansible script]# ls
net.sh

[root@ansible ~]# bash /opt/script/net.sh
Sun Feb 23 13:11:46 CST 2020
ansible
[root@ansible ~]#

[root@ansible ~]# ansible -i /etc/ansible/hosts -m script -a "/opt/script/net.sh" webservers

copy模塊:實現主控端向目標主機拷貝文件,類似scp功能

例1:把ansible主機上的/etc/hosts文件複製到主機組中機器的/tmp目錄下
root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=755" #屬性是可以不加的

file模塊設置文件屬性。

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m file -a "path=/opt/c.txt mode=0444"

區分:

黃色:發生改變,綠色:執行成功,但沒改變

stat模塊獲取遠程文件信息(在修改之前,先看下狀態)

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m stat -a "path=/opt/c.txt"

get_url模塊實現遠程主機下載指定url到本地,支持sha256sum文件校驗

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp mode=0404 force=yes" #下載epel-release-latest-7.noarch.rpm到主機清單中的/tmp/目錄下

擴展:查看force=yes的作用
[root@ansible ~]# ansible-doc -s get_url #在彈出的信息中找到force
如果force=yes,當下載文件時,如果所下的內容和原目錄下的文件內容不一樣,則替換原文件,如果一樣,就不下載了。
如果爲“否”,則僅在目標不存在時才下載文件。 一般來說,只有小型本地文件才應該爲“是”。 在0.6之前,該模塊表現爲默認爲“是”。

yum模塊linux平臺軟件包管理。

yum模塊可以提供的status狀態: latestpresentinstalled #這3個代表安裝;removed,absent #後面2個是卸載

例子:安裝httpd軟件
[root@ansible]# ansible -i /etc/ansible/hosts webservers -m yum -a "name=httpd state=latest"

cron模塊遠程主機crontab配置。
例如:增加每30分鐘執行ls /tmp

*/30 * * * * (分 時 日 月 周 )
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"

name #註釋,計劃任務的名字
minute #分鐘這一塊你怎麼寫
job 就是你具體執行的命令

service模塊遠程主機系統服務管理。(起服務的)

service模塊常用參數:
(1)、name參數:此參數用於指定需要操作的服務名稱,比如 nginx,httpd。
(2)、state參數:此參數用於指定服務的狀態,比如,我們想要啓動遠程主機中的httpd,則可以將 state 的值設置爲 started;如果想要停止遠程主機中的服務,則可以將 state 的值設置爲 stopped。此參數的可用值有 started、stopped、restarted(重啓)、reloaded。
enabled參數:此參數用於指定是否將服務設置爲開機 啓動項,設置爲 yes 表示將對應服務設置爲開機啓動,設置爲 no 表示不會開機啓動。
注:想使用service模塊啓動服務,被啓動的服務,必須可以使用service 命令啓動或關閉

例如:遠程啓動Apache服務
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m service -a "name=httpd state=restarted"

sysctl模塊遠程主機sysctl配置。

例:開啓路由轉發功能
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"

總結:

ansible語法:

ansible -i 主機清單 主機組 -m 模塊名 -a 模塊參數

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "uptime" webservers

  • shell模塊:使用shell模塊,在遠程命令通過/bin/sh來執行;所以,我們在終端輸入的各種命令方式,都可以使用。

  • 對shell模塊的使用可以分成兩塊:

  • shell:如果待執行的語句少,可以直接寫在一句話中:

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m shell -a "free -m"

  • script:果在遠程待執行的語句比較多,可寫成一個腳本

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m script -a "/opt/script/net.sh"

ansible -i /etc/ansible/hosts 主機清單 -m script -a "腳本路徑"

copy模塊:實現主控端向目標主機拷貝文件,類似scp功能

-a "src=/源路徑 dest=/目標路徑 +(屬性)"

[root@ansible opt]# ansible webservers -m copy -a "src=/opt/a.txt dest=/opt/wyh.txt owner=root group=root mode=0444"

file模塊設置文件屬性。

path=/路徑 mode =屬性

[root@ansible opt]# ansible webservers -m file -a "path=/opt/wyh.txt mode=0777"

stat模塊獲取遠程文件信息

[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/tmp/hosts"

**get_url模塊實現遠程主機下載指定url到本地,**支持sha256sum文件校驗。

get_url -a "url=xx dest=/下載到哪裏 mode 權限 force=yes|on"

  • eg:
    [root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp mode=0404 force=yes"

yum模塊linux平臺軟件包管理

  • yum模塊可以提供的status狀態:
    latest ,present,installed #這3個代表安裝;
    removed, absent #後面2個是卸載

yum -a "name=包名 state=安裝|刪除"

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m yum -a "name=httpd state=removed"

**cron模塊遠程主機crontab配置 **#配置計劃任務

corn -a "name=註釋 minute='計劃' job='執行命令'"

eg:
[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"

service模塊遠程主機系統服務管理。

service模塊常用參數
(1)、name參數:此參數用於指定需要操作的服務名稱,比如 nginx,httpd。
(2)、state參數:此參數用於指定服務的狀態,比如,我們想要啓動遠程主機中的httpd,則可以將 state 的值設置爲started;如果想要停止遠程主機中的服務,則可以將 state 的值設置爲 stopped。此參數的可用值有 started、stopped、restarted(重啓)、reloaded
(3)、enabled參數:此參數用於指定是否將服務設置爲開機 啓動項,設置爲 yes 表示將對應服務設置爲開機啓動,設置爲 no 表示不會開機啓動。
注:想使用service模塊啓動服務,被啓動的服務,必須可以使用service 命令啓動或關閉

[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章