# Ansible ###### tags: `Ansible` > 2021/06/03 > Ansible 是可以控制遠端或本機機器的工具,主要可以利用 Ansible 做大量重複的事情,或是查看服務狀況。 > 案例 > 利用 Ansible 修改同群組內所有機器的某支 config ,只需要將所有機器寫進 /etc/ansible/hosts 裡,並編寫 yml 檔案執行修改,我們只需要執行這個 yml 檔就能完成群組內所有機器的 config 修改 > 2021/07/29 > 新增 RHEL8 安裝方法 - - - ## 安裝 Ansible CnetOS7: `# yum install ansible` RHEL8: ``` # dnf update -y # python3 -V # subscription-manager repos --enable ansible-2.9-for-rhel-8-x86_64-rpms # dnf -y install ansible ``` - - - ## 設置 localhost 使用 - `/etc/ansible/hosts` 增加 `127.0.0.1` - 產生 server 端金鑰: `ssh-keygen -A` - 啟動 ssh service: `service sshd start` - 產生 client 端金鑰: `ssh-keygen -b 4096` - 將 client 端金鑰加入本地: `ssh-copy-id -i ~/.ssh/id_rsa.pub [username]@[ipaddr]` - 測試指令 ``` $ ansible localhost -m shell -a '/bin/echo hello' 127.0.0.1 | CHANGED | rc=0 >> hello ``` - - - ## 設置 pip 版本 目前 python2.7 已不被官方支援,所以 pip 版本只支援到 `20.3.4` - 安裝 pip: `yum install python-pip` - 更新 pip 至 `20.3.4`: `python -m pip install --upgrade "pip < 21.0"` - - - ## 安裝 Python module Ansible 使用 Python 來執行各項 module,像是 pids module 就會需要 python 的 psutil,所以我們需要安裝 psutil - 安裝 psutil: `pip install psutil` 其他遇到類似需要安裝 Python module 的部份也如上述方法安裝 #### ※ 若遠端操控機器則是使用遠端機器上的 Python,所以是遠端的機器需要安裝 Python module - - - ## 編寫 playbook ```yaml= - name: RRN System Check # 計畫名稱 hosts: localhost # 對象 vars: # 設變數 services_running: [] # 變數名稱: 型態 newline_character: "\n" tasks: - name: Getting radius PID # 任務名稱 pids: # module name: radiusd # 監看的 process register: pids_of_radiusd # 接收變數 - name: Check radius PID # 任務名稱 fail: # 設置錯誤 msg: No radius service # 錯誤訊息 when: not pids_of_radiusd.pids # when 為判斷式 # 當成立時執行此任務 # 不成立則 skip 此任務 - name: Output radius PID # 任務名稱 debug: # module msg: "PIDS of radiusd:{{pids_of_radiusd.pids|join(',')}}" # 顯示訊息 # 變數使用 {{ vars }} 顯示 ``` - - - ## 執行 playbook ### vi cpu_usage.yml ```yaml= ### cpu_usage.yml # Get CPU usage - name: CPU usage hosts: localhost tasks: - name: Get CPU usage shell: "top -b -n1 | grep 'Cpu(s)' | awk '{print $2 + $4}' " register: cpu_usage - name: Output CPU usage facts debug: msg: - "CPU usage: {{cpu_usage['stdout']}}%" ``` ### ansible-playbook cpu_usage.yml ``` $ ansible-playbook cpu_usage.yml PLAY [CPU usage] ******************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************** ok: [127.0.0.1] TASK [Get CPU usage] **************************************************************************************************************************************** changed: [127.0.0.1] TASK [Output CPU usage facts] ******************************************************************************************************************************* ok: [127.0.0.1] => { "msg": "CPU usage: 13.4%" } PLAY RECAP ************************************************************************************************************************************************** 127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ``` - - - ## Ansible default logfile ### vi /etc/ansible/ansible.cfg ``` log_path = /dir/file.log ``` ### ansible-playbook cpu_usage.yml ``` 2021-06-03 23:41:26,080 p=17352 u=root n=ansible | PLAY [CPU usage] ******************************************************************************************************************************************** 2021-06-03 23:41:26,087 p=17352 u=root n=ansible | TASK [Gathering Facts] ************************************************************************************************************************************** 2021-06-03 23:41:27,275 p=17352 u=root n=ansible | ok: [127.0.0.1] 2021-06-03 23:41:27,283 p=17352 u=root n=ansible | TASK [Get CPU usage] **************************************************************************************************************************************** 2021-06-03 23:41:27,907 p=17352 u=root n=ansible | changed: [127.0.0.1] 2021-06-03 23:41:27,915 p=17352 u=root n=ansible | TASK [Output CPU usage facts] ******************************************************************************************************************************* 2021-06-03 23:41:27,950 p=17352 u=root n=ansible | ok: [127.0.0.1] => { "msg": "CPU usage: 13.4%" } 2021-06-03 23:41:27,951 p=17352 u=root n=ansible | PLAY RECAP ************************************************************************************************************************************************** 2021-06-03 23:41:27,951 p=17352 u=root n=ansible | 127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ``` ### ansible-playbook -v cpu_usage.yml ``` 2021-06-03 23:51:47,376 p=17661 u=root n=ansible | Using /etc/ansible/ansible.cfg as config file 2021-06-03 23:51:47,536 p=17661 u=root n=ansible | PLAY [CPU usage] ******************************************************************************************************************************************** 2021-06-03 23:51:47,543 p=17661 u=root n=ansible | TASK [Gathering Facts] ************************************************************************************************************************************** 2021-06-03 23:51:48,771 p=17661 u=root n=ansible | ok: [127.0.0.1] 2021-06-03 23:51:48,779 p=17661 u=root n=ansible | TASK [Get CPU usage] **************************************************************************************************************************************** 2021-06-03 23:51:49,409 p=17661 u=root n=ansible | changed: [127.0.0.1] => {"changed": true, "cmd": "top -b -n1 | grep 'Cpu(s)' | awk '{print $2 + $4}' ", "delta": "0:00:00.174965", "end": "2021-06-03 23:51:49.360877", "rc": 0, "start": "2021-06-03 23:51:49.185912", "stderr": "", "stderr_lines": [], "stdout": "13.4", "stdout_lines": ["13.4"]} 2021-06-03 23:51:49,417 p=17661 u=root n=ansible | TASK [Output CPU usage facts] ******************************************************************************************************************************* 2021-06-03 23:51:49,450 p=17661 u=root n=ansible | ok: [127.0.0.1] => { "msg": "CPU usage: 13.4%" } 2021-06-03 23:51:49,453 p=17661 u=root n=ansible | PLAY RECAP ************************************************************************************************************************************************** 2021-06-03 23:51:49,453 p=17661 u=root n=ansible | 127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ``` ## 結論 Ansible 是一個滿多功能的工具,幾乎所有事情都能做到,只是在於 module 的安裝在客戶那邊是比較麻煩的,如果不使用 Ansible 的 pids module,也可以使用 cmd 的 ps 來做關於 process 的監控。 Ansible 的 log 就是記錄所有輸出,使用 `ansible-playbook -v` 可以得到更詳細的 log。