(1).Ansible具有如下特點:
部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
默認使用SSH協議對設備進行管理;
主從集中化管理;
配置簡單、功能強大、擴展性強;
支持API及自定義模塊,可通過Python輕松擴展;
通過Playbooks來定制強大的配置、狀態管理
對雲計算平台、大數據都有很好的支持;
(2).實驗環境
youxi1 192.168.1.6 Ansible主控端
youxi2 192.168.1.7 被控端
youxi3 192.168.1.8 被控端
(3).在youxi1上部署Ansible,並配置環境變量
yum安裝Ansible需要epel源,安裝完成后查看下版本
[root@youxi1 ~]# yum -y install ansible [root@youxi1 ~]# ansible --version ansible 2.8.1 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
配置Ansible主機清單
[root@youxi1 ~]# vim /etc/ansible/hosts //默認全是注釋 [webservers] //定義模塊 192.168.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456 192.168.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456 [root@youxi1 ~]# ssh root@192.168.1.7 //配置完成后使用ssh先測試一下,要確保不能有yes操作,否則報錯。 The authenticity of host '192.168.1.7 (192.168.1.7)' can't be established. ECDSA key fingerprint is SHA256:j3ee8eoTo2XEv0QxCYmxphMipcNRxC+IONPmt1HwRLg. ECDSA key fingerprint is MD5:25:e2:b4:08:f2:79:7d:6e:42:84:b5:78:3d:6a:81:20. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.7' (ECDSA) to the list of known hosts. root@192.168.1.7's password: Last login: Sun Jul 7 23:06:22 2019 from xuefei-pc [root@youxi2 ~]# exit 登出 Connection to 192.168.1.7 closed. [root@youxi1 ~]# ssh root@192.168.1.8 //測試ssh,理由同上 Connection to 192.168.1.8 closed. [root@youxi1 ~]# ansible -i /etc/ansible/hosts webservers -m ping //最后使用一個簡單的ping命令測試一下ansible是否配置正常 192.168.1.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.8 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
由於Ansible是基於ssh對設備進行管理,所以可以使用秘鑰進行訪問,以此來優化配置文件。先來做免密登錄
[root@youxi1 ~]# ssh-keygen //生成秘鑰 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:aOpFP3BWmgXReDuxqgGZk27LnphjgjLZfJUmcITe/Rw root@youxi1 The key's randomart image is: +---[RSA 2048]----+ | . o+ | | . . ..+ | | . o = .o+ | | o O ..E=+ | | + o=+So . | | ++==+ | |.+ o.=.oo | |* =++o. . | |.+o++ | +----[SHA256]-----+ [root@youxi1 ~]# ssh-copy-id root@192.168.1.7 //將秘鑰拷貝到192.168.1.7 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.1.7's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.1.7'" and check to make sure that only the key(s) you wanted were added. [root@youxi1 ~]# ssh-copy-id root@192.168.1.8 //將秘鑰拷貝到192.168.1.8 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.1.8's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.1.8'" and check to make sure that only the key(s) you wanted were added. [root@youxi1 ~]# ssh root@192.168.1.7 //測試是否可以免密登錄 Last login: Sun Jul 7 23:16:05 2019 from youxi1.cn [root@youxi2 ~]# exit 登出 Connection to 192.168.1.7 closed. [root@youxi1 ~]# ssh root@192.168.1.8 Last login: Sun Jul 7 23:16:05 2019 from youxi1.cn [root@youxi3 ~]# exit 登出 Connection to 192.168.1.8 closed.
免密登錄做完后,來優化配置文件
[root@youxi1 ~]# vim /etc/ansible/hosts [webservers] //將原本的配置之留下IP地址(也可以是域名) 192.168.1.7 192.168.1.8 [root@youxi1 ~]# !ansible //測試,調用最近的ansible開頭的命令 ansible -i /etc/ansible/hosts webservers -m ping //完整的命令 192.168.1.8 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
(4).Ansible的使用方法以及常用的選項
使用方法:ansible <主機模式> [選項]。一般不會定義主機模式。
常用選項:
-v,--verbose 詳細模式 -i PATH, --inventory=PATH 指定host文件的路徑,默認是在/etc/ansible/hosts -f NUM,--forks=NUM 指定fork開啟同步進程數的個數,默認為5個。 -m NAME,-module-name=NAME 指定使用的module,默認使用command -a MODULE_ARGS,--args=MODULE_ARGS 指定module的參數 -k,--ask-pass 提示輸入ssh密碼,而不是使用秘鑰認證 -b,--become 請求權限升級的用戶名,需要和-K選項聯合使用 -K, --ask-become-pass 請求權限升級的用戶密碼,需要和-b選項聯合使用 -u REMOTE_USER, --user=REMOTE_USER 指定移動端的執行用戶 -C, --check 測試命令執行會改變什么,而不會真正的執行
其中-m選項非常復雜,可以使用ansible-doc命令查看,主要使用的幾個選項可以看(6).常見的高級模塊
ansible-doc -l 查看所有module ansible-doc -s [MODULE_NAME] 查看指定模塊的參數
(5).實例
使用ping檢查連通性
[root@youxi1 ~]# ansible -i /etc/ansible/hosts 'webservers' -m ping 192.168.1.8 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [root@youxi1 ~]# ansible 'webservers' -m ping //如果不指定host文件,默認指向/etc/ansible/hosts文件 192.168.1.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.1.8 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
檢查節點運行時間
[root@youxi1 ~]# ansible 'webservers' -m command -a "uptime" 192.168.1.7 | CHANGED | rc=0 >> 21:32:19 up 13 min, 2 users, load average: 0.00, 0.04, 0.06 192.168.1.8 | CHANGED | rc=0 >> 21:32:19 up 13 min, 2 users, load average: 0.00, 0.05, 0.09
檢查節點內核版本
[root@youxi1 ~]# ansible 'webservers' -m command -a "uname -r" 192.168.1.8 | CHANGED | rc=0 >> 3.10.0-957.el7.x86_64 192.168.1.7 | CHANGED | rc=0 >> 3.10.0-957.el7.x86_64
查看節點文件系統使用情況並重定向到指定文件
[root@youxi1 ~]# ansible 'webservers' -m command -a "df -Th" > command-output [root@youxi1 ~]# cat command-output 192.168.1.7 | CHANGED | rc=0 >> 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root xfs 17G 1.3G 16G 8% / devtmpfs devtmpfs 979M 0 979M 0% /dev tmpfs tmpfs 991M 0 991M 0% /dev/shm tmpfs tmpfs 991M 9.6M 981M 1% /run tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 133M 882M 14% /boot tmpfs tmpfs 199M 0 199M 0% /run/user/0 192.168.1.8 | CHANGED | rc=0 >> 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root xfs 17G 1.5G 16G 9% / devtmpfs devtmpfs 979M 0 979M 0% /dev tmpfs tmpfs 991M 0 991M 0% /dev/shm tmpfs tmpfs 991M 9.6M 981M 1% /run tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 133M 882M 14% /boot tmpfs tmpfs 199M 0 199M 0% /run/user/0
(6).常用模塊
command模塊,也是ansible的默認模塊。不指定-m選項時,使用的就是command模塊,常見的命令都可以使用,但由於不是通過shell執行的,所以<、>、|、&都是不可以的。當然也不支持管道,沒法批量執行命令。
shell模塊,遠程命令通過/bin/sh來執行,所以在終端輸入的各種命令方式都可以使用。如果自定義在~/.bashrc或~/.bash_profile中的環境變量shell模塊由於沒有加載,而導致的無法識別,可以在最開始執行加載自定義腳本的語句。例如ansible webservers -m shell -a "source ~/.bash_profile && free -m"。如果待執行語句過多,可以編寫腳本通過copy模塊傳到遠端,再執行,但會用到兩次ansible,這士就可以使用script模塊。
script模塊,在本地編寫腳本后,直接使用該模塊,可以自動將腳本傳到遠端並執行,執行完成后刪除遠端腳本。
copy模塊,將本地文件復制到遠端,例如ansible webserver -m copy -a "src=[本地文件地址] dest=[遠端目錄] owner=[遠端所屬主] group=[遠端所屬組] mode=[4位數字權限,例0755]"
file模塊,設置文件屬性,例如ansible webservers -m file -a "path=[遠端文件地址] mode=[4位數字權限,例0755]"
stat模塊,獲取遠程文件信息,例如ansible webservers -m stat -a "path=[遠端文件地址]"
get_url模塊,實現遠程主機下載指定url,例如ansible webservers -m get_url -a "url=[url地址] dest=[遠端存放目錄] mode=[4位數字權限,例0755] force=yes"。其中force=yes表示當下載文件存在時,如果所下的內容和原目錄下的文件內容不一樣則替換,如果一樣則不下載。另外force=no表示僅目標不存在時才下載。
yum模塊,軟件包管理,例如ansible webservers -m yum -a "name=[軟件包名] state=[軟件包狀態]"。其中state有五個可選值,latest、present、installed代表安裝;removed, absent代表卸載。
cron模塊,遠程主機計划任務(crontab)配置,例如ansible webservers -m cron -a "name='list dir' minute=*/30 job='ls /root'",這是每30分鍾查看root目錄下文件。
service模塊,遠程主機系統服務管理,常用的就是name、state和enabled三個參數,name指定服務名稱,state指定服務狀態(started、stopped、restarted、reloaded)、enabled設置為yes則開機自啟,設置為no則開機不啟動。例如ansible webservers -m service -a "name=httpd state=restarted"
sysctl模塊,遠程主機sysctl配置。例如ansible webservers -m sysctl -a "name=net.ipv4.ipforward value=1 reload=yes”,此時查看遠程主機的/proc/sys/net/ipv4/ip_forward文件內容就是1。
user模塊,遠程主機用戶管理,例如ansible webservers -m user -a "name=test1 state=present",state表示賬戶是否應該存在,如果與申明狀態不同,則采取措施。
(7).使用Playbook(劇本)
沒用過,記錄一個參考文檔吧:https://www.cnblogs.com/bananaaa/archive/2017/12/29/8143345.html