ansible的安裝與簡單的使用

Ansible安裝和簡單的使用

主要內容:

一、ansible概述和運行機制

二、實戰-安裝並配置Ansible管理兩個節點

三、ansible常見模塊高級使用方法

四、實戰-使用Playbook批量部署多臺LAMP環境

一、ansible概述和運行機制

ansible概述

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

image.png

官方網站:https://www.ansible.com/


ansiblle具有如下特點:

    1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;

    2、默認使用SSH協議對設備進行管理;

    3、主從集中化管理;

    4、配置簡單、功能強大、擴展性強;

    5、支持API及自定義模塊,可通過Python輕鬆擴展;

    6、通過Playbooks來定製強大的配置、狀態管理

    7、對雲計算平臺、大數據都有很好的支持;

Ansible 工作機制

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

image.png 

由上面的圖可以看到 Ansible 的組成由 5 個部分組成:

Ansible      ansible核心

Modules     包括 Ansible 自帶的核心模塊及自定義模塊

Plugins       完成模塊功能的補充,包括連接插件、郵件插件等

Playbooks    劇本;定義 Ansible 多任務配置文件,由Ansible 

自動執行 Inventory     定義 Ansible 管理主機的清單  [ˈɪnvəntri] 清單

image.png

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

實驗環境:

image.png 

Ansible server 192.168.2.88

Simple service 192.168.2.88

Simple service 192.168.2.69

server 192.168.2.88安裝ansible

1、 設置EPEL倉庫

Ansible倉庫默認不在yum倉庫中,因此我們需要使用下面的命令啓用epel倉庫。

yum -y install epel-release.noarch 

image.png

yum install ansib 

image.png

ansible --version

image.png

ansible命令參數

我們首先寫一個ansible的命令查看ansible的文檔

ansible-doc -s service

image.png

anisble命令語法: ansible [-i 主機文件] [-f 批次] [組名] [-m 模塊名稱] [-a 模塊參數]
ansible  object  method   argument
環境變量  對象      方法    調用方法需要的參數
-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  [ˈsnɪpɪt]   片斷


定義主機清單

1、基於端口,用戶,密碼定義主機清單

ansible基於ssh連接-i (inventory)參數後指定的遠程主機時,也可以寫端口,用戶,密碼。

格式:ansible_ssh_port:指定ssh端口   ansible_ssh_user:指定 ssh 用戶 ansible_ssh_pass:指定 ssh 用戶登錄是認證密碼(明文密碼不安全)  ansible_sudo_pass:指明 sudo 時候的密碼

 例:

image.png

image.png     

    配置內容

        192.168.2.88 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123

     然後執行命令

   ansible -i /etc/ansible/hosts webservers -m ping

     image.png

    這個錯誤還是來源於ssh首次登陸陌生的主機,會校驗know_hosts

     解決方法

1、 ssh一次就可以了

 image.png

2、 關閉詢問

image.png

image.png

    解決之後,效果如此

   image.png

2、基於ssh密鑰來訪問定義主機清單

一般來說,使用明文密碼不安全,所以增加主機無密碼訪問。

Ansible服務端生成密鑰,並且複製公鑰到節點中。

生成祕鑰

ssh-keygen

 image.png

複製到客戶機

ssh-copy-id

ssh-copy-id [email protected]

 image.png

ssh-copy-id [email protected]

 image.png

然後修改hosts配置

image.png

image.png

注意:兩個#註釋只是爲了和上面一

進行測試

ansible 'web-servers'  -m ping

 image.png

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

 image.png

[root@saltMaster ~]# uptime
 21:48:39 up  2:20,  5 users,  load average: 0.15, 0.09, 0.07
[root@saltMaster ~]# ansible -m command -a "uptime" "webservers"
192.168.2.88 | CHANGED | rc=0 >>
 21:49:09 up  2:21,  6 users,  load average: 0.57, 0.19, 0.10
192.168.2.69 | CHANGED | rc=0 >>
 08:49:09 up  2:01,  4 users,  load average: 0.00, 0.01, 0.05
[root@saltMaster ~]#


3:檢查節點的內核版本

 image.png


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

[root@saltMaster ~]# ansible -m command -a "df -Th" "webservers" > /tmp/command-output.txt
[root@saltMaster ~]# cat /tmp/command-output.txt 
192.168.2.88 | CHANGED | rc=0 >>
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        17G  5.5G   12G  33% /
devtmpfs                devtmpfs  897M     0  897M   0% /dev
tmpfs                   tmpfs     912M  124K  912M   1% /dev/shm
tmpfs                   tmpfs     912M   18M  895M   2% /run
tmpfs                   tmpfs     912M     0  912M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M  18% /boot
tmpfs                   tmpfs     183M   32K  183M   1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0 100% /run/media/root/CentOS 7 x86_64
192.168.2.69 | CHANGED | rc=0 >>
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        17G  4.6G   13G  27% /
devtmpfs                devtmpfs  471M     0  471M   0% /dev
tmpfs                   tmpfs     488M     0  488M   0% /dev/shm
tmpfs                   tmpfs     488M   15M  473M   4% /run
tmpfs                   tmpfs     488M     0  488M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  201M  814M  20% /boot
tmpfs                   tmpfs      98M   44K   98M   1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0 100% /run/media/root/CentOS 7 x86_64
[root@saltMaster ~]#

image.png


三、ansible常見模塊高級使用方法

ansible常用模塊

ansible 已經給開發者定義了好多可用的模塊,我們除了拓展之外,大部分模塊可以直接使用

1、3個遠程命令模塊的區別

1)、command模塊爲ansible默認模塊,不指定-m參數時,使用的就是command模塊; comand模塊比較簡單,常見的命令都可以使用,但其命令的執行不是通過shell執行的,所以,像這些 "<", ">", "|", and "&"操作都不可以,當然,也就不支持管道; 缺點:不支持管道,沒法批量執行命令;

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

1:運行free -m 命令

[root@saltMaster ~]# ansible webservers -m shell -a "free -m"
192.168.2.88 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           1823         781          82          12         959         783
Swap:          2047           6        2041
 
192.168.2.69 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:            974         686          60           6         227          63
Swap:          2047         383        1664



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

1) 如果待執行的語句少,可以直接寫在一句話中,上例

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

3)、scripts模塊

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

[root@saltMaster ~]# vim /etc/ansible/net.sh
#!/bin/bash
date
hostname
[root@saltMaster ~]# ansible webservers -m script -a "/etc/ansible/net.sh"
192.168.2.88 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.2.88 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.2.88 closed."
    ], 
    "stdout": "Mon Dec  3 22:08:55 CST 2018\r\nsaltMaster\r\n", 
    "stdout_lines": [
        "Mon Dec  3 22:08:55 CST 2018", 
        "saltMaster"
    ]
}
192.168.2.69 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.2.69 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.2.69 closed."
    ], 
    "stdout": "Mon Dec  3 09:09:06 EST 2018\r\nlocalhost.localdomain\r\n", 
    "stdout_lines": [
        "Mon Dec  3 09:09:06 EST 2018", 
        "localhost.localdomain"
    ]
}

image.png

 

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

1:把ansible主機上的/etc/hosts文件複製到主機組中機器的/tmp目錄下

[root@saltMaster /]# ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755" 
192.168.2.88 | CHANGED => {
    "changed": true, 
    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", 
    "dest": "/tmp/hosts", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "54fb6627dbaa37721048e4549db3224d", 
    "mode": "0755", 
    "owner": "root", 
    "size": 158, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543846330.63-199478885009462/source", 
    "state": "file", 
    "uid": 0
}
192.168.2.69 | CHANGED => {
    "changed": true, 
    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", 
    "dest": "/tmp/hosts", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "54fb6627dbaa37721048e4549db3224d", 
    "mode": "0755", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
    "size": 158, 
    "src": "/root/.ansible/tmp/ansible-tmp-1543846330.65-125711974784987/source", 
    "state": "file", 
    "uid": 0
}
[root@saltMaster /]#

image.png

image.png

3、file模塊設置文件屬性。

例如:

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


驗證:

[root@63 ~]# ll /tmp/hosts 
-rwxrwxrwx 1 root root 158 11月 14 22:39 /tmp/hosts


 

4、stat模塊獲取遠程文件信息

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


 

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

例如:下載epel-release-latest-7.noarch.rpm到主機清單中的/tmp/目錄下

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

注:url=https://xxx  的等號=前後不能有空格

擴展:查看force=yes的作用

[root@xuegod63 ~]# ansible-doc -s get_url    #在彈出的信息中找到force

如果force=yes,當下載文件時,如果所下的內容和原目錄下的文件內容不一樣,則替換原文件,如果一樣,就不下載了。

如果爲“否”,則僅在目標不存在時才下載文件。 一般來說,只有小型本地文件才應該爲“是”。 在0.6之前,該模塊表現爲默認爲“是”。

 

查看下載的文件:

[root@63 ~]# ll /tmp/epel-release-latest-7.noarch.rpm 
-r--r----- 1 root root 15080 11月 14 22:43 /tmp/epel-release-latest-7.noarch.rpm


 

測試:下載文件時,當文件不一樣時,會替換原來的文件

[root@64 ~]# cp /etc/passwd /tmp/epel-release-latest-7.noarch.rpm
[root@63 ~]# ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  dest=/tmp/ mode=0440 force=yes"
192.168.1.63 | SUCCESS => {
    "changed": false,   #63上原來的文件和當前的文件一樣,就沒有改變。執行成功,但沒有發生改變,那麼顯示綠色
}
192.168.1.64 | SUCCESS => {
    "changed": true,   #64上的文件名字一樣,但是內容變,就會重新下載。執行成功,且發生改變,那麼顯示×××


 

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

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

例子:安裝httpd軟件

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

 

7、cron模塊遠程主機crontab配置。

例如:增加每30分鐘執行ls /tmp

# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"
在xuegod63上查看
# crontab  -l
#Ansible: list dir
*/30 * * * * ls /tmp

 

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

service模塊常用參數:

1)、name參數:此參數用於指定需要操作的服務名稱,比如 nginx,httpd。

2)、state參數:此參數用於指定服務的狀態,比如,我們想要啓動遠程主機中的httpd,則可以將 state 的值設置爲 started;如果想要停止遠程主機中的服務,則可以將 state 的值設置爲 stopped。此參數的可用值有 started、stopped、restarted(重啓)、reloaded。

enabled參數:此參數用於指定是否將服務設置爲開機 啓動項,設置爲 yes 表示將對應服務設置爲開機啓動,設置爲 no 表示不會開機啓動。

注:想使用service模塊啓動服務,被啓動的服務,必須可以使用service 命令啓動或關閉

 

例如:遠程啓動Apache服務


# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"

 

9、sysctl模塊遠程主機sysctl配置。

例:開啓路由轉發功能


# ansible -i /etc/ansible/hosts web-servers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"

驗證:


# cat /proc/sys/net/ipv4/ip_forward
1


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