ad-hoc是什麼
ad-hoc 簡而言之就是"臨時指令",執行完即結束,并不會儲存,也就是執行完一個子產品就結束了,如果想讓她反複運作,就不行了。不像将多個指令寫到檔案,可以反複運作。
- 應用場景1∶檢視多台節點的程序是否存在
- 應用場景2∶拷貝指定的檔案至本地
[root@master ~]# ansible webservers -m shell -a "ps -aux | grep nginx" -i /etc/ansible/hosts
[root@master ~]# ansible webservers -m shell -a "touch /root/ansible.txt" -i /etc/ansible/hosts
ad-hoc指令使用
指令示例∶ansible 'groups' -m command -a 'df -h',含義如下圖所示;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM4EjM2UDNjNWZ2QGN2ImZyYzX4ETNzcTM2EzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
shell子產品其實可以解決很多問題,但是隻用這個子產品肯定是不行的,而且shell子產品無法保證幂等性,同時其他子產品還包含其他的功能。
ad-hoc執行過程
- 加載自己的配置檔案,預設 /etc/ans1b1e/ansible.cfg
- 查找對應的主機配置檔案,找到要執行的主機或者組
- 加載自己對應的子產品檔案,如 command
- 通過 ansible 将子產品或指令生成對應的臨時 py 檔案,并将該檔案傳輸至遠端伺服器對應執行使用者 $HOME/.ansible/tmp/ansible-tmp-nurber/XX.PY(這個檔案是看不到的,執行完了就删除了)(被控端是調用Python去解析這個臨時py檔案,然後調用shell去運作,運作完結束之後就删除了)
- 執行使用者家目錄的`檔案
- 給檔案+x執行
- 執行并傳回結果
- 删除臨時 py 檔案,sleep 0退出
[root@master ~]# ansible webservers -m shell -a "sleep 10" -i /etc/ansible/hosts
[root@node1 tmp]# ls ansible-tmp-1656102874.99-71725-64844177037053/
AnsiballZ_command.py
[root@node1 tmp]# pwd
/root/.ansible/tmp
ad-hoc執行狀态
使用 ad-hoc 執行一次遠端指令,注意觀察傳回結果的顔色;
- 綠色∶代表被管理端主機沒有被修改
- 黃色∶代表被管理端主機發現變更
- 紅色:代表出現了故障,注意檢視提示
示範建立一個項目并且使用ad-hoc
[root@master ~]# mkdir -p project
[root@master ~]# cd project/
[root@master project]# cp /etc/ansible/ansible.cfg .
[root@master project]# cp /etc/ansible/hosts .
[root@master project]# ls
ansible.cfg hosts
現在項目讀取的配置為 /root/project/ansible.cfg
[root@master project]# ansible --version
ansible 2.9.27
config file = /root/project/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, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[root@master project]# vim ansible.cfg
inventory = /root/project/hosts #這裡可以寫絕對路徑,也可以寫相對路徑/hosts
這裡還可以調整forks,1代表一台一台的執行,5代表并發執行5台
forks = 5 #調整并行主機的數量
[root@master project]# ansible webservers -m shell -a "sleep 3" -f 1
192.168.111.6 | CHANGED | rc=0 >>
192.168.111.7 | CHANGED | rc=0 >>
192.168.111.8 | CHANGED | rc=0 >>
[root@master project]# ansible webservers -m shell -a "sleep 3" -f 5
192.168.111.8 | CHANGED | rc=0 >>
192.168.111.7 | CHANGED | rc=0 >>
192.168.111.6 | CHANGED | rc=0 >>