Ansible安裝和簡單的使用
主要內容:
一、ansible概述和運行機制
二、實戰-安裝並配置Ansible管理兩個節點
三、ansible常見模塊高級使用方法
四、實戰-使用Playbook批量部署多臺LAMP環境
一、ansible概述和運行機制
ansible概述
Ansible是一款爲類Unix系統開發的自由開源的配置和自動化工具。它用Python寫成,類似於saltstack和Puppet,但是有一個不同和優點是我們不需要在節點中安裝任何客戶端。它使用SSH來和節點進行通信。Ansible基於 Python paramiko 開發,分佈式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2模板語言,更強的遠程命令執行操作
ansiblle具有如下特點:
1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、默認使用SSH協議對設備進行管理;
3、主從集中化管理;
4、配置簡單、功能強大、擴展性強;
5、支持API及自定義模塊,可通過Python輕鬆擴展;
6、通過Playbooks來定製強大的配置、狀態管理
7、對雲計算平臺、大數據都有很好的支持;
Ansible 工作機制
Ansible 在管理節點將 Ansible 模塊通過 SSH 協議推送到被管理端執行,執行完之後自動刪除,可以使用 SVN 等來管理自定義模塊及編排。
由上面的圖可以看到 Ansible 的組成由 5 個部分組成:
Ansible : ansible核心
Modules : 包括 Ansible 自帶的核心模塊及自定義模塊
Plugins : 完成模塊功能的補充,包括連接插件、郵件插件等
Playbooks : 劇本;定義 Ansible 多任務配置文件,由Ansible
自動執行 Inventory : 定義 Ansible 管理主機的清單 [ˈɪnvəntri] 清單
二、安裝並配置Ansible管理兩個節點
實驗環境:
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
yum install ansib
ansible --version
ansible命令參數
我們首先寫一個ansible的命令,查看ansible的文檔
ansible-doc -s service
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 時候的密碼
例:
配置內容
192.168.2.88 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
然後執行命令
ansible -i /etc/ansible/hosts webservers -m ping
這個錯誤還是來源於ssh首次登陸陌生的主機,會校驗know_hosts
解決方法
1、 ssh一次就可以了
2、 關閉詢問
解決之後,效果如此
2、基於ssh密鑰來訪問定義主機清單
一般來說,使用明文密碼不安全,所以增加主機無密碼訪問。
在Ansible服務端生成密鑰,並且複製公鑰到節點中。
生成祕鑰
ssh-keygen
複製到客戶機
ssh-copy-id
ssh-copy-id [email protected]
ssh-copy-id [email protected]
然後修改hosts配置
注意:兩個#註釋,只是爲了和上面一致
進行測試
ansible 'web-servers' -m ping
例2:檢查Ansible節點的運行時間(uptime)
[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:檢查節點的內核版本
例4:將df命令在所有節點執行後,重定向輸出到本機的/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 ~]#
三、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" ] }
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 /]#
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