爲了運行Ansible的第一個命令,我們前期做了大量的配置工作, 在controller主機和各個node主機上。爲什麼這麼做,就是爲了能夠直接使用ansible,遠程指揮一堆一堆的服務器,copy文件,安裝軟件包,更新軟件,更改配置文件等等等等。。。
如果你查看了ansible官方文檔,人家也是要讓你從最最基礎的命令開始,就像你學任何編程語言,第一個例子永遠都是打印一句:hello world!
對於ansible而言,我查了一些教程,也聽同事介紹過,那第一條命令就是ping。要想使用任何工具,那第一個動作就是要查看一下help,就是看看使用說明書,以確保你的打開姿勢是正確的。
輸入:ansible --help,就會出來很多信息,主要看Usage這一行,其實這個usage個人覺得寫的不是太好,如果有個實例就更完美了。
針對ansible的參數,簡單的說明一下 吧,也參考了網上的說明
ansible -h 參數解析
Usage: ansible <host-pattern> [options]
Options:
** -a MODULE_ARGS, --args=MODULE_ARGS 下面-m模塊的參數,這個參數很重要,這個參數很重要,這個參數很重要!重要的事情說三遍。如果執行默認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, --background=SECONDS 後臺運行超時時間
run asynchronously, failing after X seconds
(default=N/A)
-C, --check don't make any changes; instead, try to predict some
只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化
of the changes that may occur
-c CONNECTION, --connection=CONNECTION 連接類型使用。可能的選項是paramiko(SSH),SSH和地方。當地主要是用於crontab或啓動。
connection type to use (default=smart)
-f FORKS, --forks=FORKS 並行任務數。NUM被指定爲一個整數,默認是5
specify number of parallel processes to use
(default=5)
-h, --help show this help message and exit 打開幫助文檔API
-i INVENTORY, --inventory-file=INVENTORY 指定庫存主機文件的路徑,默認爲/etc/ansible/hosts
specify inventory host file
(default=/etc/ansible/hosts)
-l SUBSET, --limit=SUBSET 進一步限制所選主機/組模式 --limit=192.168.91.135 只對這個ip執行
further limit selected hosts to an additional pattern
--list-hosts outputs a list of matching hosts; does not execute
anything else
** -m MODULE_NAME, --module-name=MODULE_NAME 執行模塊的名字,默認使用 command 模塊,所以如果是隻執行單一命令可以不用 -m參數。這個參數很重要,這個參數很重要!重要的事情說三遍。**
module name to execute (default=command)
-M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認爲/usr/share/ansible/
specify path(s) to module library
(default=/usr/share/ansible/)
-o, --one-line condense output 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
-P POLL_INTERVAL, --poll=POLL_INTERVAL 調查背景工作每隔數秒。需要- b
set the poll interval if using -B (default=15)
--private-key=PRIVATE_KEY_FILE 私鑰路徑,使用這個文件來驗證連接
use this file to authenticate the connection
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用戶,默認是root用戶
run operations with su as this user (default=root)
-s, --sudo run operations with sudo (nopasswd)
-U SUDO_USER, --sudo-user=SUDO_USER sudo到哪個用戶,默認爲 root
desired sudo user (default=root)
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默認超時時間, 默認是10S
override the SSH timeout in seconds (default=10)
-t TREE, --tree=TREE log output to this directory 將日誌內容保存在該輸出目錄,結果保存在一個文件中在每臺主機上。
-u REMOTE_USER, --user=REMOTE_USER 遠程用戶, 默認是root用戶
connect as this user (default=root)
--vault-password-file=VAULT_PASSWORD_FILE
vault password file
-v, --verbose verbose mode (-vvv for more, -vvvv to enable 如果命令執行成功,輸出詳細的結果。輸出執行過程的詳細信息:-v<-vv<-vvv<-vvvv,單間的說就是v越多,輸出的信息就越詳細。
connection debugging)(
-
vv –vvv
-
vvvv)
--version show program's version number and exit 輸出ansible的版本
好了,上面的幫助信息,看看就好,知道大概怎麼用了,但是還不夠具體。要想運行ansible命令,還有一個前提條件,就是要把受控的主機,加到ansible的hosts文件裏,這樣ansible才知道它受控的主機有哪些。hosts文件路徑在:/etc/ansible/hosts下。我們來cat一下,看看裏面的內容:
如上圖所示,這個hosts文件裏已經給出了3個例子,怎麼寫受控主機你應該知道了吧。
第一種:簡單粗暴,直接寫受控主機的hostname或者IP地址。
第二種和第三種:類似,都是以分組的方式——[組名],這個組名就是可以跟在ansible命令行後的。所以,可以這麼理解:
- ansible命令後面必須要跟目標主機
- 這個目標主機的寫法有多種,可以是目標主機的hostname,也可以是IP,也可以是你定義在ansible hosts文件裏的組名。
- 但是無論是什麼名字,那都要加入到ansible的hosts文件裏,否則是沒用的,ansible是不識別的。所以這個hosts文件,是ansile的倉庫,你讓ansible做什麼事情,它得先找到目標,那它每次都是先去這個倉庫裏找目標,然後再下手。
所以我現在先用簡單第一種簡單粗暴的方式,把node1,node2和node3都加進去,而且只加他們的主機名,更改之後保存,退出。
由於我們沒有分組,所以直接執行下面的命令:
ansible node1 -m ping
ansible:命令關鍵字,必須要有
node1:就是你要遠程控制的主機名稱,這裏也可以使用IP地址,效果相同
-m:這個就是指你想用ansible的哪個模塊,後面跟上就行,現在這個 例子是用ping的模塊。注意這個是Linux上面的ping模塊,如果目前主機是Windows,是有一個Win_ping對應的模塊。最好帶上吧!如果不帶這個-m參數,默認是使用command這個模塊。
以上就是一個最簡單的ansible ad-hoc命令了。
下面我們在執行ansible命令時,把node1這個主機名稱,換成IP地址看看:
從上圖可以看到,是不行滴。爲什麼呢?回顧一下ansible執行的過程,它會先去倉庫裏找目標啊,很顯然,我們沒有 把這個IP地址加入到hosts這個倉庫裏,它當然就找不到了。那我們現在把這個IP地址加入進去,然後再運行一下:ansible 192.168.137.101 -m ping,看看會不會報錯。
加入IP地址到ansible hosts文件中:
再運行命令:ansible 192.168.137.101 -m ping
完美,你發起了ping,它給你個pong。沒毛病。
那現在我們用第二、第三種方法,把不同的server,分成不同的組。
假如node1和node2是web服務器,那我就把這兩臺主機放到[webservers]組,那node3就當做database服務器吧,放到[dbservers]
調整ansible的hosts文件如下:
注意一下,我在[dbservers]這個組下,放了node3主機名和node1的IP地址。
讓我們來ansible一下,對象是我們新建的組,先來webservers組吧:
兩個ping,連個pong,都顯示SUCCESS,沒毛病。
那我們再來看看dbservers這個組,因爲這個組裏包含了主機名和主機IP地址兩種格式:
如上圖所示,兩個ping,連個pong,都顯示SUCCESS,沒毛病。
好了,這個就先扯到這裏吧!下篇再加個參數,你猜是哪個?