原文:https://www.cnblogs.com/keerya/p/7987886.html#_label0,有改動html
1、Ansible簡介python
一、ansible是什麼mysql
a、ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、chef、func、fabric)的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。nginx
b、ansible是基於 paramiko 開發的,而且基於模塊化工做,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不須要在遠程主機上安裝client/agents,由於它們是基於ssh來和遠程主機通信的。ansible目前已經已經被紅帽官方收購,是自動化運維工具中你們承認度最高的,而且上手容易,學習簡單。sql
二、ansible特色shell
a、部署簡單,只需在主控端部署Ansible環境,被控端無需作任何操做;
b、默認使用SSH協議對設備進行管理;
c、有大量常規運維操做模塊,可實現平常絕大部分操做;
d、配置簡單、功能強大、擴展性強;
e、支持API及自定義模塊,可經過Python輕鬆擴展;
f、經過Playbooks來定製強大的配置、狀態管理;
g、輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;
h、提供一個功能強大、操做性強的Web管理界面和REST API接口——AWX平臺。數據庫
三、ansible架構主要模塊vim
a、Ansible:Ansible核心程序。
b、HostInventory:記錄由Ansible管理的主機信息,包括端口、密碼、ip等。
c、Playbooks:「劇本」YAML格式文件,多個任務定義在一個文件中,定義主機須要調用哪些模塊來完成的功能。
d、CoreModules:核心模塊,主要操做是經過調用核心模塊來完成管理任務。
e、CustomModules:自定義模塊,完成核心模塊沒法完成的功能,支持多種語言。
f、ConnectionPlugins:鏈接插件,Ansible和Host通訊使用centos
四、ansible任務執行模式緩存
Ansible 系統由控制主機對被管節點的操做方式可分爲兩類,即adhoc
和playbook
:
a、ad-hoc模式(點對點模式)
使用單個模塊,支持批量執行單條命令。ad-hoc 命令是一種能夠快速輸入的命令,並且不須要保存起來的命令。就至關於bash中的一句話shell。
b、playbook模式(劇本模式)
是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook經過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。能夠簡單地把playbook理解爲經過組合多條ad-hoc操做的配置文件。
五、ansible命令執行過程
Ansible在運行時, 首先讀取ansible.cfg中的配置, 根據規則獲取Inventory中的管理主機列表, 並行的在這些主機中執行配置的任務, 最後等待執行返回的結果。
a、加載本身的配置文件,默認/etc/ansible/ansible.cfg;
b、查找對應的主機配置文件,找到要執行的主機或者組;
c、加載本身對應的模塊文件,如 command;
d、經過ansible將模塊或命令生成對應的臨時py文件(python腳本), 並將該文件傳輸至遠程服務器;
e、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件;
f、給文件 +x 執行權限;
g、執行並返回結果;
h、刪除臨時py文件,sleep 0退出;
2、ansible配置詳解
一、安裝
a、添加yum源 vim /etc/yum.repos.d/ansible.repo 添加以下內容
[epel]
name = all source for ansible
baseurl = https://mirrors.aliyun.com/epel/7/x86_64/
enabled = 1
gpgcheck = 0
[ansible]
name = all source for ansible
baseurl = http://mirrors.aliyun.com/centos/7.3.1611/os/x86_64/
enabled = 1
gpgcheck = 0
b、安裝ansible
yum clean all
yum install ansible -y
二、ansible 的配置文件爲/etc/ansible/ansible.cfg,ansible 有許多參數,下面咱們列出一些常見的參數
inventory = /etc/ansible/hosts #這個參數表示資源清單inventory文件的位置 library = /usr/share/ansible #指向存放Ansible模塊的目錄,支持多個目錄方式,只要用冒號(:)隔開就能夠 forks = 5 #併發鏈接數,默認爲5 sudo_user = root #設置默認執行命令的用戶 remote_port = 22 #指定鏈接被管節點的管理端口,默認爲22端口,建議修改,可以更加安全 host_key_checking = False #設置是否檢查SSH主機的密鑰,值爲True/False。關閉後第一次鏈接不會提示配置實例 timeout = 60 #設置SSH鏈接的超時時間,單位爲秒 log_path = /var/log/ansible.log #指定一個存儲ansible日誌的文件(默認不記錄日誌)
三、ansible主機清單
a、在配置文件中,咱們提到了資源清單,這個清單就是咱們的主機清單,裏面保存的是一些 ansible 須要鏈接管理的主機列表。定義方式以下
1、 直接指明主機地址或主機名: wohaoshuai1 wohaoshuai2 192.168.30.42 192.168.30.43 2、 定義一個主機組[組名]把地址或主機名加進去 [mysql_test] wohaoshuai2 192.168.30.43
b、須要注意的是,這裏的組成員可使用通配符來匹配,這樣對於一些標準化的管理來講就很輕鬆方便了。
[dbservers] wohaoshuai[1:3] 選擇dbservers組時就會同時選擇到wohaoshuai1 wohaoshuai2 wohaoshuai3 [databases] db-[a:f].wohaoshuai.com
選擇databases組時至關於選擇db-a.wohaoshuai.com 到 db-f.wohaoshuai.com全部主機
四、作免密登陸
a. 配置祕鑰
ssh-keygen
說明:執行ssh-keygen後所有按回車;配置祕鑰可免密碼控制受管節點
ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.30.42
sed -i '35a StrictHostKeyChecking no' /etc/ssh/ssh_config
說明: ssh-copy-id -i指定公鑰文件;避免ssh登陸須要肯定,須要添加StrictHostKeyChecking no到etc/ssh/ssh_config中
b. 使用sshpass
sshpass -p 123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.30.43
說明: 使用sshpass避免手工介入輸入ssh密碼;安裝ansible會安裝sshpass
c. 大量IP配置祕鑰
for i in $(seq 71 80)
do
sshpass -p '123456' ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.30.$i
done
說明:大量ip能夠作腳本循環;seq 71 80表示71到80之間的數
3、ansible經常使用命令
一、咱們比較經常使用的是/usr/bin/ansible和/usr/bin/ansible-playbook
二、命令具體格式以下
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
經常使用命令解釋以下
-a MODULE_ARGS #模塊的參數,若是執行默認COMMAND的模塊,便是命令參數,如: 「date」,「pwd」等等 -k,--ask-pass #ask for SSH password。登陸密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證 --ask-su-pass #ask for su password。su切換密碼 -K,--ask-sudo-pass #ask for sudo password。提示密碼使用sudo,sudo表示提權操做 --ask-vault-pass #ask for vault password。假設咱們設定了加密的密碼,則用該選項進行訪問 -B SECONDS #後臺運行超時時間 -C #模擬運行環境並進行預運行,能夠進行查錯測試 -c CONNECTION #鏈接類型使用 -f FORKS #並行任務數,默認爲5 -i INVENTORY #指定主機清單的路徑,默認爲/etc/ansible/hosts --list-hosts #查看有哪些主機組 -m MODULE_NAME #執行模塊的名字,默認使用 command 模塊,因此若是是隻執行單一命令能夠不用 -m參數 -o #壓縮輸出,嘗試將全部結果在一行輸出,通常針對收集工具使用 -S #用 su 命令 -R SU_USER #指定 su 的用戶,默認爲 root 用戶 -s #用 sudo 命令 -U SUDO_USER #指定 sudo 到哪一個用戶,默認爲 root 用戶 -T TIMEOUT #指定 ssh 默認超時時間,默認爲10s,也可在配置文件中修改 -u REMOTE_USER #遠程用戶,默認爲 root 用戶 -v #查看詳細信息,同時支持-vvv,-vvvv可查看更詳細信息
4、ansible經常使用模塊
一、主機連通性測試
ansible all(或某個hosts中的主機或組,若爲all則爲全部) -m ping
二、command 模塊
a、這個模塊能夠直接在遠程主機上執行命令,並將結果返回本主機。
b、命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在全部選定的節點上執行。它不會經過shell進行處理,好比$HOME和操做如"<",">","|",";","&" 工做(須要使用(shell)模塊實現這些功能)。注意,該命令不支持| 管道命令。
c、該模塊經常使用的命令以下
chdir # 在執行命令以前,先切換到該目錄 executable # 切換shell來執行命令,須要使用命令的絕對路徑 free_form # 要執行的Linux指令,通常使用Ansible的-a參數代替。 creates # 一個文件名,當這個文件存在,則該命令不執行,能夠 用來作判斷 removes # 一個文件名,這個文件不存在,則該命令不執行
d、通常說來用shell模塊就能夠了,基本此模塊能幹的事情shell都能幹,下面是這個模塊的幾個實例
1)、執行經常使用命令
2)、先進入到/application/elk路徑下再執行ls命令
3)、在相應文件夾下建立文件,若是文件已經存在那麼就再也不執行後面的命令
4)、刪除相應文件夾下的文件,不論文件是否存在都會執行後面的命令
三、shell模塊
a、shell模塊能夠在遠程主機上調用shell解釋器運行命令,支持shell的各類功能,例如管道
b、只要是咱們的shell命令,均可以經過這個模塊在遠程主機上運行,這裏就不一一舉例了,所以能用shell的儘可能就用shell好了。
四、copy模塊
a、這個模塊用於將文件複製到遠程主機,同時支持給定內容生成文件和修改權限等,相關選項以下
src #被複制到遠程主機的本地文件。能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,則會遞歸複製,用法相似於"rsync" content #用於替換"src",能夠直接指定文件的值 dest #必選項,將源文件複製到的遠程主機的絕對路徑 backup #當文件內容發生改變後,在覆蓋以前把源文件備份,備份文件包含時間信息 directory_mode #遞歸設定目錄的權限,默認爲系統默認權限 force #當目標主機包含該文件,但內容不一樣時,設爲"yes",表示強制覆蓋;設爲"no",表示目標主機的目標位置不存在該文件才複製。默認爲"yes" others #全部的 file 模塊中的選項能夠在這裏使用
b、用法舉例以下
1)、複製文件
2)、給定內容生成文件,並制定權限。
3)、關於覆蓋和備份
默認只會覆蓋而不會備份,設置backup=yes後就會備份後再覆蓋
五、file模塊
a、該模塊主要用於設置文件的屬性,好比建立文件、建立連接文件、刪除文件等,常見的命令以下
force #須要在兩種狀況下強制建立軟連接,一種是源文件不存在,但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no group #定義文件/目錄的屬組。後面能夠加上mode:定義文件/目錄的權限 owner #定義文件/目錄的屬主。後面必須跟上path:定義文件/目錄的路徑 recurse #遞歸設置文件的屬性,只對目錄有效,後面跟上src:被連接的源文件路徑,只應用於state=link的狀況 dest #被連接到的路徑,只應用於state=link的狀況 state #狀態,有如下選項: directory:若是目錄不存在,就建立目錄 file:即便文件不存在,也不會被建立 link:建立軟連接 hard:建立硬連接 touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間 absent:刪除目錄、文件或者取消連接文件
b、建立目錄
c、建立連接文件,將/application/222.txt 軟鏈接到/application/333.txt
d、刪除文件
六、fetch模塊
a、該模塊用於從遠程某主機獲取(複製)文件到本地,有兩個選項
dest:用來存放文件的目錄
src:在遠程拉取的文件,而且必須是一個file,不能是目錄
b、要注意,文件保存的路徑是咱們設置的接收目錄下的被管制主機ip目錄下
七、cron模塊
a、該模塊適用於管理cron計劃任務的,其使用的語法跟咱們的crontab文件中的語法一致,同時,能夠指定如下選項
day= #日應該運行的工做( 1-31, , /2, ) hour= # 小時 ( 0-23, , /2, ) minute= #分鐘( 0-59, , /2, ) month= # 月( 1-12, *, /2, ) weekday= # 周 ( 0-6 for Sunday-Saturday,, ) job= #指明運行的命令是什麼 name= #定時任務描述 reboot # 任務在重啓時運行,不建議使用,建議使用special_time special_time #特殊的時間範圍,參數:reboot(重啓時),annually(每一年),monthly(每個月),weekly(每週),daily(天天),hourly(每小時) state #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務 user # 以哪一個用戶的身份執行
b、添加計劃任務
c、刪除計劃任務
八、yum 模塊
a、模塊主要用於軟件的安裝,選項以下
name= #所安裝的包的名稱 state= #present--->安裝, latest--->安裝最新的, absent---> 卸載軟件。 update_cache #強制更新yum的緩存 conf_file #指定遠程yum安裝時所依賴的配置文件(安裝本地已有的包)。 disable_pgp_check #是否禁止GPG checking,只用於presentor latest。 disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時。 enablerepo #臨時使用的yum庫。只用於安裝或更新時。
b、ansible all -m yum -a 'name=htop state=present'
九、service模塊
a、該模塊用於服務程序的管理,主要有以下選項
arguments #命令行提供額外的參數 enabled #設置開機啓動。 name= #服務名稱 runlevel #開機啓動的級別,通常不用指定。 sleep #在重啓服務的過程當中,是否等待。如在服務關閉之後等待2秒再啓動。(定義在劇本中。) state #有四種狀態,分別爲:started--->啓動服務, stopped--->中止服務, restarted--->重啓服務, reloaded--->重載配置
b、開啓服務並設置自啓動
由於wohaoshuai3沒有安裝nginx所以失敗
c、關閉服務
十、user模塊
a、該模塊主要是用來管理用戶帳號,主要選項以下
comment # 用戶的描述信息 createhome # 是否建立家目錄 force # 在使用state=absent時, 行爲與userdel –force一致. group # 指定基本組 groups # 指定附加組,若是指定爲(groups=)表示刪除全部組 home # 指定用戶家目錄 move_home # 若是設置爲home=時, 試圖將用戶主目錄移動到指定的目錄 name # 指定用戶名 non_unique # 該選項容許改變非惟一的用戶ID值 password # 指定用戶密碼 remove # 在使用state=absent時, 行爲是與userdel –remove一致 shell # 指定默認shell state # 設置賬號狀態,不指定爲建立,指定值爲absent表示刪除 system # 當建立一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶 uid # 指定用戶的uid
b、添加用戶
c、刪除用戶
十一、group模塊
a、該模塊主要用於添加或刪除組,經常使用選項以下
gid= #設置組的GID號 name= #指定組的名稱 state= #指定組的狀態,默認爲建立,設置值爲absent爲刪除 system= #設置值爲yes,表示建立爲系統組
b、建立組
c、刪除組
十二、script模塊
a、該模塊用於將本機的腳本在被管理端的機器上運行。
b、相應實例
首先編輯腳本並給予其執行權限
而後,咱們直接運行命令來實如今被管理端執行該腳本: