Ansible 和 SaltStack、Puppet 等都是配置管理系統(configuration management system)
Ansible 和 SaltStack 都是 Python 編譯的自動化運維工具,都是使用模塊管理。不一樣的是Ansible沒有客戶端(使用的 SSH 通道傳輸)而 SaltStack 有客戶端(雖然 SaltStack 也能夠用 SSH通道,但和 Ansible 相比就是個笑話),這方面各有優勢吧,有客戶端的更穩定,沒有客戶端的更靈活可移植性強
相比 Puppet 來講 Ansible 沒有客戶端(使用的 SSH 通道傳輸)、簡單易用和日誌集中控管python
Ansible 能夠幫助咱們完成一些批量任務,或者完成一些須要常常重複的工做。
好比:同時在100臺服務器上安裝 NFS 服務,並在安裝後啓動服務。
好比:將某個文件一次性拷貝到100臺服務器上。
好比:每當有新服務器加入工做環境時,你都要爲新服務器部署某個服務,也就是說你須要常常重複的完成相同的工做。
這些場景中咱們均可以使用到 Ansible。web
Ansible 特色shell
Ansible 架構
Ansible 是用模塊來管理的,而模塊是 Python 寫的,這就須要控制端和受控端都須要有 Python,這對於 LInux 不是問題
vim
YUM 安裝 Ansiblecentos
Ansible 包在
epel
庫,部分依賴在base
庫緩存
[root@Ansible ~]# yum install ansible -y ## 查看Ansible版本信息(版本號低的,看看epel源有嗎) [root@Ansible ~]# ansible --version ansible 2.7.10 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, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
上面指定了 Ansible 的配置文件位置,不過 Ansible 爲了方便,也爲了可移植性,配置文件不是固定的,下面根據前後順序讀取:bash
$ANSIBLE_CONFIG
信息ansible.cfg
文件ansible.cfg
文件/etc/ansible/ansible.cfg
文件經常使用配置服務器
[defaults] #通用默認配置 inventory /etc/ansible/hosts #被控制端IP或者DNS列表 library = /usr/share/my_modules/ ##默認搜尋模塊的位置 remote_tmp = ~/.ansible/tmp #遠程執行臨時文件 local_tmp = ~/.ansible/tmp plugin_filters_cfg = /etc/ansible/plugin_filters.yml forks = 5 ##並行線程數 poll_interval = 15 ##回頻率或輪詢間隔時間 sudo_user = root ##sudo遠程執行用戶名 ask_sudo_pass = True ##使用sudo,是否須要輸入密碼 ask_pass = True ##是否須要輸入密碼 transport = smart ##通訊機制 remote_port = 22 ##遠程SSH端口 module_lang = C ##模塊和系統之間通訊的語言 module_set_locale = False gathering = implicit ##控制默認facts收集(遠程系統變量) gather_subset = all gather_timeout = 10 roles_path = /etc/ansible/roles ##使用playbook搜索Ansible roles host_key_checking = False ##是否檢查遠程公鑰指紋 sudo_exe = sudo ##sudo遠程執行命令 sudo_flags = -H -S -n ##傳遞sudo以外的參數 timeout = 10 ##SSH超時時間 remote_user = root ##遠程登陸用戶名 log_path = /var/log/ansible.log ##日誌文件存放路徑 module_name = command ##Ansible命令默認執行的模塊 executable = /bin/sh ##執行的shell環境,用戶shell模塊 hash_behaviour = replace ##特定的優先級覆蓋變量 jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 ##容許開啓jinja2擴展模塊 private_key_file = /path/to/file ##私鑰文件存儲位置 display_skipped_hosts = True ##顯示跳過任何任務的狀態 system_warnings = True ##禁用系統運行Ansible潛在問題警告 deprecation_warnings = True ##PlayBook輸出禁用「不建議使用」警告 command_warnings = False ##command模塊Ansible默認發出警告 nocolor = 1 ##輸出帶上顏色區別,0表示開啓,1表示關閉 pipelining = False ##開啓pipe SSH通道優化 [accelerate] ##accelerate緩存加速 accelerate_port = 5099 ##加速鏈接端口5099 accelerate_timeout = 30 ##命令執行超過期間,單位爲s accelerate_connect_timeout = 5.0 ##上一個活動鏈接的時間,單位爲min accelerate_daemon_timeout = 30 ##容許多個私鑰被加載到daemon accelerate_multi_key = yes ##任何客戶端想要鏈接daemon都要開啓這個選項
## 添加客戶主機信息,client清單下兩臺主機(IP,用戶,密碼,端口) [root@Ansible ~]# vim /etc/ansible/hosts [client] 192.168.1.2 ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22' 192.168.1.3 ansible_ssh_user='root' ansible_ssh_pass='redhat' ansible_ssh_port='22'
驗證 Ansible
能夠把配置文件中 host_key_checking = False
註釋去掉,防止第一次 SSH
連通須要公鑰指紋致使的 Ansible
的連通失敗架構
## 用ping模塊測試主機是否連通 [root@Ansible ~]# ansible client -m ping 192.168.1.2 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.1.3 | SUCCESS => { "changed": false, "ping": "pong" } ## -m:調用什麼模塊。-a:執行什麼動做 [root@Ansible ~]# ansible client -m command -a "df -h" 192.168.1.2 | CHANGED | rc=0 >> 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 17G 3.1G 14G 18% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.8M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 173M 842M 18% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.1.3 | CHANGED | rc=0 >> 文件系統 容量 已用 可用 已用% 掛載點 /dev/mapper/centos-root 17G 3.1G 14G 18% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 173M 842M 18% /boot tmpfs 98M 0 98M 0% /run/user/0
使用密鑰對鏈接app
## 建立密鑰對 [root@Ansible ~]# ssh-keygen -t rsa ## 發送到相應的主機上 [root@Ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.2 [root@Ansible ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.3 ## 刪除配置文件IP後面的帳號密碼 [root@Ansible ~]# vim /etc/ansible/hosts [client] 192.168.1.2 192.168.1.3 ## 鏈接測試 [root@Ansible ~]# ansible client -m command -a "hostname" 192.168.1.3 | CHANGED | rc=0 >> Client2 192.168.1.2 | CHANGED | rc=0 >> Client1
組能夠包括其餘組
## 從新定義主機清單(組調用其餘組在組名後面加上:children) [root@Ansible ~]# vim /etc/ansible/hosts [web] 192.168.1.2 [nfs] 192.168.1.3 [local] localhost ansible_connection=local [hosts:children] web nfs local ## 執行命令測試連通性 [root@Ansible ~]# ansible web --list-host hosts (1): 192.168.1.2 [root@Ansible ~]# ansible nfs --list-host hosts (1): 192.168.1.3 [root@Ansible ~]# ansible local --list-host hosts (1): localhost [root@Ansible ~]# ansible hosts --list-host hosts (3): 192.168.1.2 192.168.1.3 localhost ## Ansible自帶一個all組,爲所有主機 [root@Ansible ~]# ansible all --list-host hosts (3): 192.168.1.2 192.168.1.3 localhost
用別名代替IP
## 編輯文件 [root@Ansible ~]# vim /etc/ansible/hosts [web] web1 ansible_ssh_host=192.168.1.2 [nfs] nfs1 ansible_ssh_host=192.168.1.3 [local] localhost ansible_connection=local [hosts:children] web nfs local ## 列出全部主機 [root@Ansible ~]# ansible hosts --list-host hosts (3): web1 localhost nfs1
用 -i
指定文件
[root@Ansible ~]# vim hosts [client] 192.168.1.2 192.168.1.3 [root@Ansible ~]# ansible client -m command -a "w" -i ./hosts 192.168.1.2 | CHANGED | rc=0 >> 20:08:04 up 14:03, 2 users, load average: 0.00, 0.04, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.1 20:08 0.00s 0.14s 0.00s w root pts/1 192.168.1.254 14:04 6:28 0.38s 0.38s -bash 192.168.1.3 | CHANGED | rc=0 >> 20:08:04 up 14:02, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.1 20:08 0.00s 0.14s 0.00s w root pts/1 192.168.1.254 14:42 1:06m 0.43s 0.43s -bash