Ansible是什么
Ansible 簡(jiǎn)單的說(shuō)是一個(gè)配置管理系統(tǒng)(configuration management system)。你只需要可以使用 ssh 訪問你的服務(wù)器或設(shè)備就行。它也不同于其他工具,因?yàn)樗褂猛扑偷姆绞?,而不是?puppet 等 那樣使用拉取安裝agent的方式。你可以將代碼部署到任意數(shù)量的服務(wù)器上。
Ansible能做什么
ansible可以幫助我們完成一些批量任務(wù),或者完成一些需要經(jīng)常重復(fù)的工作。
比如:同時(shí)在100臺(tái)服務(wù)器上安裝nginx服務(wù),并在安裝后啟動(dòng)它們。
比如:將某個(gè)文件一次性拷貝到100臺(tái)服務(wù)器上。
比如:每當(dāng)有新服務(wù)器加入工作環(huán)境時(shí),你都要為新服務(wù)器部署某個(gè)服務(wù),也就是說(shuō)你需要經(jīng)常重復(fù)的完成相同的工作。 這些場(chǎng)景中我們都可以使用到ansible。
Ansible特性
? 模塊化:調(diào)用特定的模塊,完成特定任務(wù)
? 有Paramiko,PyYAML,Jinja2(模板語(yǔ)言)三個(gè)關(guān)鍵模塊
? 支持自定義模塊
? 基于Python語(yǔ)言實(shí)現(xiàn)
? 部署簡(jiǎn)單,基于python和SSH(默認(rèn)已安裝),agentless
? 安全,基于OpenSSH
? 支持playbook編排任務(wù)
? 冪等性:一個(gè)任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣,不因重復(fù)執(zhí)行帶來(lái)意外情況
? 無(wú)需代理不依賴PKI(無(wú)需ssl)
? 可使用任何編程語(yǔ)言寫模塊
? YAML格式,編排任務(wù),支持豐富的數(shù)據(jù)結(jié)構(gòu)
? 較強(qiáng)大的多層解決方案
Ansible架構(gòu)
Ansible工作原理
Ansible主要組成部分功能說(shuō)明
? PLAYBOOKS:
任務(wù)劇本(任務(wù)集),編排定義Ansible任務(wù)集的配置文件,由Ansible順序依次執(zhí)行,通常是JSON格式的YML文件
? INVENTORY:
Ansible管理主機(jī)的清單/etc/anaible/hosts
? MODULES:
Ansible執(zhí)行命令的功能模塊,多數(shù)為內(nèi)置的核心模塊,也可自定義,ansible-doc –l 可查看模塊
? PLUGINS:
模塊功能的補(bǔ)充,如連接類型插件、循環(huán)插件、變量插件、過濾插件等,該功能不常用
? API:
供第三方程序調(diào)用的應(yīng)用程序編程接口
? ANSIBLE:
組合INVENTORY、 API、 MODULES、PLUGINS的綠框,可以理解為是ansible命令工具,其為核心執(zhí)行工具
注意事項(xiàng)
? 執(zhí)行ansible的主機(jī)一般稱為主控端,中控,master或堡壘機(jī)
? 主控端Python版本需要2.6或以上
? 被控端Python版本小于2.4需要安裝python-simplejson
? 被控端如開啟SELinux需要安裝libselinux-python
? windows不能做為主控端
安裝Ansible
以CentOS為例
安裝環(huán)境查看
安裝
yum -y install ansible
查看版本
Ansible 功能詳解
配置文件
配置文件或指令 描述
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機(jī)清單
/etc/ansible/roles/ 存放角色的目錄
/usr/bin/ansible 主程序,臨時(shí)命令執(zhí)行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺(tái)
/usr/bin/ansible-playbook 定制自動(dòng)化任務(wù),編排劇本工具
/usr/bin/ansible-pull 遠(yuǎn)程執(zhí)行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面與用戶交互的執(zhí)行工具
Ansible 配置文件
Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認(rèn))
? [defaults]
? #inventory = /etc/ansible/hosts # 主機(jī)列表配置文件
? #library = /usr/share/my_modules/ # 庫(kù)文件存放目錄
? #remote_tmp = $HOME/.ansible/tmp #臨時(shí)py命令文件存放在遠(yuǎn)程主機(jī)目錄
? #local_tmp = $HOME/.ansible/tmp # 本機(jī)的臨時(shí)命令執(zhí)行目錄
? #forks = 5 # 默認(rèn)并發(fā)數(shù)
? #sudo_user = root # 默認(rèn)sudo 用戶
? #ask_sudo_pass = True #每次執(zhí)行ansible命令是否詢問ssh密碼
? #ask_pass = True #連接時(shí)提示輸入ssh密碼
? #remote_port = 22 #遠(yuǎn)程主機(jī)的默認(rèn)端口,生產(chǎn)中這個(gè)端口應(yīng)該會(huì)不同
? #log_path = /var/log/ansible.log #日志
? #host_key_checking = False # 檢查對(duì)應(yīng)服務(wù)器的host_key,建議取消注釋。也就是不會(huì)彈出
試驗(yàn)規(guī)劃,兩臺(tái)主機(jī)192.168.56.11作為主控端,192.168.56.12被控端
修改配置文件/etc/ansible/hosts
[webservers]
192.168.56.11
192.168.56.12
webserves代表一個(gè)組,下面有兩臺(tái)主機(jī)
執(zhí)行命令
ansible 192.168.56.11 -m ping
執(zhí)行失敗
非常抱歉哦,竟然是失敗的。為什么呢?Ansible是基于ssh進(jìn)行工作的,那么當(dāng)ssh一臺(tái)遠(yuǎn)程主要的時(shí)候,是不是需要輸入密碼呢?可是這一條指令并沒有提示輸入口令呢
加參數(shù)-k輸入密碼
設(shè)置免密碼登錄(參考如下)
—————————-參考如下—————————-
兩臺(tái)Linux主機(jī)需要從其中一臺(tái)ssh至另外一臺(tái)需要手動(dòng)輸入密碼,通過以下設(shè)置免密碼登錄
生成秘鑰
ssh-keygen -t rsa
會(huì)在文件夾/root/.ssh下面生產(chǎn)公鑰和私鑰
把秘鑰復(fù)制至需要免密登錄的主機(jī),第一次拷貝需要輸入一次密碼
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.3.4
會(huì)在遠(yuǎn)程主機(jī)的文件夾/root/.ssh下面自動(dòng)生成文件authorized_keys 文件內(nèi)容為公鑰id_ras.pub一樣
也可以直接把公鑰復(fù)制編輯需要遠(yuǎn)程登錄的主機(jī)的/root/.ssh/authorized_keys文件
驗(yàn)證能否免密登錄
ssh 10.1.3.4
—————————-到此位置—————————-
就不會(huì)提示需要輸入密碼了
Ansible常用命令語(yǔ)法
ansible <host-pattern> [-m module_name] [options]
指令 匹配規(guī)則的主機(jī)清單 -m 模塊名 選項(xiàng)
–version 顯示版本
-a 模塊參數(shù)(如果有)
-m module 指定模塊,默認(rèn)為command
-v 詳細(xì)過程 –vv -vvv更詳細(xì)
–list-hosts 顯示主機(jī)列表,可簡(jiǎn)寫–list
-k, –ask-pass 提示連接密碼,默認(rèn)Key驗(yàn)證
-K,–ask-become-pass 提示使用sudo密碼
-C, –check 檢查,并不執(zhí)行
-T, –timeout=TIMEOUT 執(zhí)行命令的超時(shí)時(shí)間,默認(rèn)10s
-u, –user=REMOTE_USER 執(zhí)行遠(yuǎn)程執(zhí)行的用戶
-U, SUDO_USER, –sudo-user 指定sudu用戶
-b, –become 代替舊版的sudo 切換
ansible-doc: 顯示模塊幫助
ansible-doc [options] [module…]
-a 顯示所有模塊的文檔
-l, –list 列出可用模塊
-s, –snippet 顯示指定模塊的簡(jiǎn)要說(shuō)明
例子:#ansible-doc ping
由于ansible的模塊有1378個(gè)(2.4.2.0),并且一直在持續(xù)更新。因此,這個(gè)指令必須要掌握的。
#ansible-doc -l |wc -l
1378
Ansible 的命令執(zhí)行過程以 ansible all -m command -a ‘ls -l /’ -vvv 這條命令為例,根據(jù)顯示的信息時(shí)行解讀
1. 加載自己的配置文件,默認(rèn)/etc/ansible/ansible.cfg
Using /etc/ansible/ansible.cfg as config file
2.匹配主機(jī)清單
Parsed /etc/ansible/hosts inventory source with ini plugin
3. 加載指令對(duì)應(yīng)的模塊文件,如command,生成.py的文件到本機(jī)的臨時(shí)目錄,這個(gè)目錄就是在/etc/ansible/ansible.cfg定義的
Using module file /usr/lib/python2.7/site-packages/ansible/modules/commands/command.py
PUT /tmp/tmp4JvsLH TO /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py
4. 通過ansible將模塊或命令生成對(duì)應(yīng)的臨時(shí)py文件,并將該文件傳輸至遠(yuǎn)程服務(wù)器的對(duì)應(yīng)執(zhí)行用戶$HOME/.ansible/tmp/ansible-tmp-數(shù)字/XXX.PY文件,
這個(gè)目錄就是在/etc/ansible/ansible.cfg定義的
( umask 77 && mkdir -p “` echo /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861 `” ….)
sftp> put /tmp/tmp4JvsLH /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.pyn’
5. 給文件+x 權(quán)限
‘chmod u+x /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/ /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py && sleep 0’
6. 執(zhí)行并返回結(jié)果
‘/usr/bin/python /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py;
7. 刪除臨時(shí)py文件,sleep 0退出
rm -rf “/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/” > /dev/null 2>&1 && sleep 0
8.斷開遠(yuǎn)程主機(jī)連接
‘Shared connection to 7-db-3.hunk.tech closed.rn’)
執(zhí)行結(jié)果狀態(tài)
? 綠色:執(zhí)行成功并且不需要做改變的操作
? ×××:執(zhí)行成功并且對(duì)目標(biāo)主機(jī)做變更
? 紅色:執(zhí)行失敗