CentOS7下搭建Ansible自動化運維工具,集中管理服務器


(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM