java分散式系統部署學習(六)ansible Ad-hoc與commands模組
Ad-Hoc 是指ansible下臨時執行的一條命令,並且不需要儲存的命令,對於複雜的命令後面會說playbook。講到Ad-hoc 就要提到模組,所有的命令執行都要依賴於事先寫好的模組,預設安裝好的ansible 裡面已經自帶了很多模組,如:command、raw、shell、file、cron等,具體可以通過ansible-doc -l 進行檢視 。
一、Ad-hoc
1、直接執行
這裡還是先來一個上幾篇幅經常用到的一個例子:
# ansible localhost -a 'uptime'
localhost | SUCCESS | rc=0 >>
15:03 up 25 days, 3:30, 2 users, load averages: 1.68 2.35 2.23
一個ad-hoc命令的執行,需要按以下格式進行執行:
ansible 主機或組 -m 模組名 -a '模組引數' ansible引數
主機和組,是在/etc/ansible/hosts 裡進行指定的部分,當然動態Inventory 使用的是指令碼從外部應用裡獲取的主機,這部分具體可以參考Dynamic Inventory ;
模組名,可以通過ansible-doc -l 檢視目前安裝的模組,預設不指定時,使用的是command模組,具體可以檢視/etc/ansible/ansible.cfg 的“#module_name = command ” 部分,預設模組可以在該配置檔案中進行修改;
模組引數,可以通過 “ansible-doc 模組名” 檢視具體的用法及後面的引數;
ansible引數,可以通過ansible命令的幫忙資訊裡檢視到,這裡有很多引數可以供選擇,如是否需要輸入密碼、是否sudo等。
2、後臺執行
當命令執行時間比較長時,也可以放到後臺執行,這裡會用到-B、-P引數,如下:
ansible all -B 3600 -a "/usr/bin/long_running_operation --do-stuff" \\後臺執行命令 3600s,-B 表示後臺執行的時間
ansible all -m async_status -a "jid=123456789" \\檢查任務的狀態
ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff" \\後臺執行命令最大時間是 1800s 即 30 分鐘,-P 每 60 s 檢查下狀態預設 15s
示例如下:
# ansible 10.212.52.252 -B 3600 -P 0 -a 'watch ls'
background launch...
10.212.52.252 | success >> {
"ansible_job_id": "411650646689.13501",
"results_file": "/root/.ansible_async/411650646689.13501",
"started": 1
}
# ansible 10.212.52.252 -m async_status -a 'jid=411650646689.13501'
10.212.52.252 | success >> {
"ansible_job_id": "411650646689.13501",
"changed": false,
"finished": 0,
"results_file": "/root/.ansible_async/411650646689.13501",
"started": 1
}
不指定-P或-P引數為非0時,該任務就會按-P直接的引數一直重新整理下去,直到超出-B引數指定的時間或命令執行完成:
# ansible 10.212.52.252 -B 3600 -a 'watch ls'
background launch...
10.212.52.252 | success >> {
"ansible_job_id": "397200656414.15008",
"results_file": "/root/.ansible_async/397200656414.15008",
"started": 1
}
10.212.52.252 | success >> {
"ansible_job_id": "397200656414.15008",
"changed": false,
"finished": 0,
"results_file": "/root/.ansible_async/397200656414.15008",
"started": 1
}
<job 397200656414.15008> polling on 10.212.52.252, 3585s remaining
…………………………………………略
但是此處在我使用的ansible上是直接過期輸出失敗資訊,並不會定時列印狀態資訊,此處存疑。
# ansible localhost -B 60 -P 10 -a 'top'
localhost | FAILED | rc=-1 >>
async task did not complete within the requested time
二、commands模組
上面已經提到,ansbile自身已經自帶了很多模組,可以通過ansible-doc -l 進行檢視。這裡就結合command、shell、raw、script模組瞭解下其用法。
上面四個模組都屬於commands 類。
- command模組,該模組通過-a跟上要執行的命令可以直接執行,不過命令裡如果有帶有如下字元部分則執行不成功 “ so variables like $HOME and operations like “<”, “>”, “|”, and “&” will not work(use the shell module if you need these features).”;
- shell 模組,用法其本和command一樣,不過的是其是通過/bin/sh進行執行,所以shell模組可以執行任何命令,就像在本機執行一樣,“ It is almost exactly like the command module but runs the command through a shell (/bin/sh) on the remote node.”;
- raw模組,用法和shell 模組一樣 ,其也可以執行任意命令,就像在本機執行一樣,“Executes a low-down and dirty SSH command, not going through the module subsystem. There is no change handler support for this module. This module does not require python on the remote system”
- script模組,其是將管理端的shell 在被管理主機上執行,其原理是先將shell複製到遠端主機,再在遠端主機上執行,原理類似於raw模組,“This module does not require python on the remote system, much like the raw module.” 。
注:raw模組和comand、shell 模組不同的是其沒有chdir、creates、removes引數,chdir引數的作用就是先切到chdir指定的目錄後,再執行後面的命令,這在後面很多模組裡都會有該引數 。
command模組包含如下選項:
- creates:一個檔名,當該檔案存在,則該命令不執行
- free_form:要執行的linux指令
- chdir:在執行指令之前,先切換到該指定的目錄
- removes:一個檔名,當該檔案不存在,則該選項不執行
- executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑
command模組、raw模組、shell模組示例:
# ansible 10.212.52.252 -m command -a 'ps auxf|grep snmp'
10.212.52.252 | FAILED | rc=1 >>
ERROR: Unsupported option (BSD syntax)
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy
# ansible 10.212.52.252 -m raw -a 'ps auxf|grep snmp'
10.212.52.252 | success | rc=0 >>
root 5580 25.0 0.0 12876 1792 pts/2 Ss+ 12:36 0:00 \_ bash -c ps auxf|grep snmp
root 5607 0.0 0.0 5720 832 pts/2 S+ 12:36 0:00 \_ grep snmp
root 24364 0.0 0.0 70416 6696 ? SNl May15 0:22 /usr/sbin/snmpd -r -A -LF i /var/log/net-snmpd.log -p /var/run/snmpd.pid
# ansible 10.212.52.252 -m shell -a 'ps auxf|grep snmp'
10.212.52.252 | success | rc=0 >>
root 5803 0.0 0.0 11308 1308 pts/2 S+ 12:36 0:00 \_ /bin/sh -c ps auxf|grep snmp
root 5805 0.0 0.0 4260 572 pts/2 S+ 12:36 0:00 \_ grep snmp
root 24364 0.0 0.0 70416 6696 ? SNl May15 0:22 /usr/sbin/snmpd -r -A -LF i /var/log/net-snmpd.log -p /var/run/snmpd.pid
上面的執行結果可以看到,我這裡加了管道,command模組執行時出錯,而使用raw模組和shell 模組都正常。
使用chdir的示例:
# ansible 10.212.52.252 -m command -a 'chdir=/tmp/361way touch test.file'
10.212.52.252 | success | rc=0 >>
# ansible 10.212.52.252 -m shell -a 'chdir=/tmp/361way touch test2.file'
10.212.52.252 | success | rc=0 >>
# ansible 10.212.52.252 -m raw -a 'chdir=/tmp/361way touch test3.file'
10.212.52.252 | success | rc=0 >>
從上面執行結果來看,三個命令都執行成功了。不過通過在遠端主機上檢視,前兩個檔案被成功建立:
# ls /tmp/361way
test.file test2.file
使用raw模組的執行的結果檔案也被正常建立了,不過不是在chdir 指定的目錄,而是在當前執行使用者的家目錄。
# ls ~/test3.file
/root/test3.file
creates與removes示例:
這裡我在測試主機上建立/tmp/361way/server.txt檔案,執行結果如下:
# ansible 10.212.52.252 -a 'creates=/tmp/361way/server.txt uptime'
10.212.52.252 | success | rc=0 >>
skipped, since /tmp/361way/server.txt exists
# ansible 10.212.52.252 -a 'removes=/tmp/361way/server.txt uptime'
10.212.52.252 | success | rc=0 >>
15:11pm up 28 days 0:34, 2 users, load average: 0.75, 0.46, 0.39
script模組示例:
# cat script.sh
#!/bin/bash
df -hl
ifconfig
ps auxf|grep snmp
# ansible 10.212.52.252 -m script -a 'script.sh'
10.212.52.252 | success >> {
"changed": true,
"rc": 0,
"stderr": "OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb .....略"
}
輸出結果很多,看起來也很亂,不過查下stdout部分,這個部分是實際上執行後的結果。這裡可以配合管道一起使用,可以如下使用:
# ansible 10.212.52.252 -m script -a 'script.sh' |egrep '>>|stdout'
相關推薦
java分散式系統部署學習(六)ansible Ad-hoc與commands模組
Ad-Hoc 是指ansible下臨時執行的一條命令,並且不需要儲存的命令,對於複雜的命令後面會說playbook。講到Ad-hoc 就要提到模組,所有的命令執行都要依賴於事先寫好的模組,預設安裝好的ansible 裡面已經自帶了很多模組,如:command、r
java分散式系統部署學習(三)ansible的Inventory與Patterns
Ansible的Inventory檔案,可以理解為saltstack中的salt-key中的所有minion的列表以及使用者自定義的nodegroup的概念,預設情況下這個檔案是/etc/ansible/hosts ,後面還會講到Dynamic Inventor
java分散式系統部署學習(九)ansible-playbook進階
一、併發執行 ansible預設只會建立5個程序,所以一次任務只能同時控制5臺機器執行.那如果你有大量的機器需要控制,或者你希望減少程序數,那你可以採取非同步執行.ansible的模組可以把task放進後臺,然後輪詢它.這使得在一定程序數下能讓大量需要的機器同時運作起來. 使用asy
java分散式系統部署學習(五)ansible Dynamic Inventory
Ansible Inventory實際上是包含靜態Inventory和動態Inventory兩部分,靜態Inventory指的是在檔案/etc/ansible/hosts中指定的主機和組,Dynamic Inventory指通過外部指令碼獲取主機列表,並按照an
java分散式系統部署學習(四)ansible配置ansible.cfg
Ansible預設安裝好後有一個配置檔案/etc/ansible/ansible.cfg,該配置檔案中定義了ansible的主機的預設配置部分,如預設是否需要輸入密碼、是否開啟sudo認證、action_plugins外掛的位置、hosts主機組的位置、是否開啟
java分散式系統部署學習(二)ansible構架
一、Ansible基本架構 ansible是一個模型驅動的配置管理器,支援多節點發布、遠端任務執行。預設使用 SSH 進行遠端連線。無需在被管理節點上安裝附加軟體,可使用各種程式語言進行擴充套件。 上圖為ansible的基本架構,從上圖可以瞭解到其由以下
java執行緒池學習(六) —— 執行緒池的合理配置
一、確定執行緒數 在工作中,為了加快程式的處理速度,我們需要將問題分解成若干個併發執行的任務。接著我們將這些任務委派給執行緒,以便使它們可以併發的執行。但是需要注意的是,由於資源所限,我們不能建立過多
Docker學習(六): 網絡使用與配置
sock AR -i 回顧 覆蓋 htm 參考 ble dock 特別聲明: 博文主要是學習過程中的知識整理,以便之後的查閱回顧。部分內容來源於網絡(如有摘錄未標註請指出)。內容如有差錯,也歡迎指正! =============系列文章============= 1
Java多線程學習(八)線程池與Executor 框架
技術分享 機制 throws rmi 3.6 .get C4D 之前 源文件 Java面試通關手冊(Java學習指南,歡迎Star,會一直完善下去,歡迎建議和指導):https://github.com/Snailclimb/Java_Guide 歷史優質文章推薦: Jav
C語言學習(六)指標3 字串與指標
字串與指標 1.用字元指標指向一個字串 char* str = “Hello”; C語言對字串常量是按字元陣列處理的,因此這裡實際上是把字串第一個元素的地址賦給str。 2.將a字串複製給b字串 方法1: voidmain() { char
Java 多執行緒基礎(六)執行緒等待與喚醒
Java 多執行緒基礎(六)執行緒等待與喚醒 遇到這樣一個場景,當某執行緒裡面的邏輯需要等待非同步處理結果返回後才能繼續執行。或者說想要把一個非同步的操作封裝成一個同步的過程。這裡就用到了執行緒等待喚醒機制。 一、wait()、notify()、notifyAll() 等方法介紹 在 Object
java學習(六)面向對象 final關鍵字
hello int java學習 xtend 最終 .sh 方法 div ext 1.被fnial修飾的方法不能被重寫,常見的為修飾類,方法,變量 /* final可以修飾類,方法,變量 特點: final可以修飾類,該類不能被繼
別樣JAVA學習(六)繼承下(2.3)異常下
關閉 exit dsm 練習 方便 pub xtend 運行 script 1、RuntimeException Exception中有一個特殊的子類異常RuntimeException執行時異常。 假設在函數內容拋出該異常,函數上能夠不用聲明。編譯一樣
Java基礎學習(六) 網絡編程簡介
exc 個數 intern 時間 能夠 兩臺 接受 void connect 基礎知識:1、osi分層模型和TCP/IP分層模型對應關系 2、七層模型與協議的對應關系 網絡層 ------------ IP(網絡之間的互聯協議) 傳
java基礎類庫學習(六.6)物件序列化
前言 物件序列化:允許把記憶體中的物件轉換成平臺無關的二進位制流,從而把這種二進位制流持久的儲存自磁碟上,通過網路將這種二進位制流傳輸到網路的另一個節點,其他程式一旦獲得了這種二進位制流,都可以將這種二進位制流恢復成原來的java物件 物件的序列化是指將一個java物件寫入io流中,
java基礎類庫學習(六.5)輸入輸出流體系
前言 輸入輸出流的4個抽象基類InputStream/OutputStream Reader/Writer 4個訪問檔案的節點流:FileInputStream/FileReader FileOutputStream/FileWriter 處理流的用法:
java基礎類庫學習(六.3)位元組流 字元流(輸入輸出)
前言: 位元組流和字元流的操作方式幾乎相同,區別只是操作的資料單元不同而已 位元組流操作的資料單元是位元組8位,字元流操作的資料單元是字元16位 輸入流 字元輸入流/位元組輸入流原始碼(輸入流的抽象基類) InputStream public abstract class
java基礎類庫學習(六.2)輸入輸出 I/O流
前言 java的IO通過java.io包下的類和介面來支援,包括輸入輸出兩種流,每種流又分為位元組流和字元流, 輸入輸出流:位元組流和字元流 位元組流:以位元組為單位處理輸入輸出 字元流:以字元來處理輸入輸出 java7對原有io進行升級,提供了一系列全新的API放在NIO中
Java語言學習(六):面向物件進階
上篇部落格中我們初步認識了Java面向物件程式設計,下面進一步學習下。 面向物件程式設計三大特性:封裝、繼承、多型。 封裝隱藏了類的內部實現機制,對外界而言它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。
Java圖書管理系統練習程式(六)
本部分內容,主要實現對資料庫的基本操作,並更換資料訪問部分,將原來的使用檔案儲存更換為資料庫進行資料的儲存 在專案中,要引入mysql的驅動程式 在專案根目錄下,建立lib資料夾,將mysql的驅動程式複製到lib目錄下,然後在專案中引用 一、建立資料庫與資料表 資料庫名稱:d