--- tags: ansible, devops --- # Ansible 筆記 - 在無網路的情況下不用 root 安裝 ansible 的方法 - 先在有網路的主機上用 pip 下載 ansbile 安裝包和其依賴包 ``` pip download ansible -d . ``` - 將 pip 的安裝包和 ansible 安裝包及其依賴包複製到要安裝的主機上 [Download pip](https://files.pythonhosted.org/packages/0b/f5/be8e741434a4bf4ce5dbc235aa28ed0666178ea8986ddc10d035023744e6/pip-20.2.4.tar.gz) - 解壓縮 pip 安裝包 - 安裝 pip ``` // 解壓縮 pip 後進到目錄內執行 python setup.py install --user ``` - 安裝後因為 `--user` 會安裝到 `$HOME/.local/bin` 下,所以要將 `$HOME/.local/bin` 加到 `PATH` 環境變數中 - 視環境可能需要先安裝 setuptools,python 2.7 以下安裝 44.* 版本 [Download setuptools v44.1.1](https://files.pythonhosted.org/packages/b2/40/4e00501c204b457f10fe410da0c97537214b2265247bc9a5bc6edd55b9e4/setuptools-44.1.1.zip) ``` // 解壓縮 setuptools 後進到目錄內執行 python bootstrap.py python setup.py install --user ``` - 將 ansible 和依賴包放在同一目錄下後,到該目錄內執行使用 pip 安裝 ansible ``` pip install --no-index --find-links . ansible ``` - 如果需要用帳密方式登入 ssh (ansible 預設是用 ssh key 方式) 則必須安裝 sshPass 或是 python 的 module paramiko,因為這裡不使用 root 所以安裝 paramiko,安裝方式和 ansible 相同 - 先在有網路的主機上用 pip 下載 paramiko 安裝包和其依賴包 ``` pip download paramiko -d . ``` - 將 paramiko 安裝包和依賴包放在同一目錄下後,到該目錄內執行使用 pip 安裝 paramiko ``` pip install --no-index --find-links . paramiko ``` - 安裝後在 `inventory` 的 yaml 檔中加上: ```yaml= ... vars: ansible_user: $(username) ansible_ssh_pass: $(password) # 指定 ssh 登入的方式用 paramiko ansible_connection: paramiko ``` 以上環境為 RedHat 7,python 2.7 的環境 - 測試 playbook 方式可使用 Vagran 建立虛擬機環境來測試 - [Ansibl 教學](https://chusiang.gitbooks.io/automate-with-ansible/content/) - [幾個小建議改善你的 Ansible 技能 ](https://blog.pichuang.com.tw/20180622-suggestions_to_improve_your_ansible_playbook/) - 一些實際寫 Play book 後的筆記 - 如果變數有用到 `"{{ variable }}"` 就必須整個字串都用 `""`,即使字串中有不是變數的部分,比方: `"{{ variable}}/test"` - 如果想在執行 Play book 的過程中只要發生任何錯誤就中止的話,有 2 種設定方式對應不同情境: - 設定 `any_errors_fatal = True`: 在沒有設定 `serial` 指定每次批次執行的 host 數時會同時在所有 host 上平行執行,如果有設定 `any_errors_fatal = True` 則只要任 1 task 執行失敗就會中止 - 設定 `max_fail_percentage: $(百分比)`: `max_fail_percentage` 是搭配 `serial` 設定,指定當失敗的 host 數和 `serial` 設定每次批次執行的 host 數比例超過 `max_fail_percentage` 時就中止,比方: ```yaml= serial: 10 max_fail_percentage: 3 ``` 表示每次在 10 個 host 上執行,如果超過 3 個 host 失敗就中止 - 取得執行 ansible 的本地系統日期的方式可以用: ``` - set_fact: date: "{{ lookup('pipe', 'date +%Y%m%d)') }}" ``` 這樣可以設定變數 `date=$(yyyMMdd)` 的系統日期 - 可以用 `when: {{ variable_list}}|length > 0` 來指定當變數為空陣列時跳過 task - 使用 `local_action` 可以把 task 改在執行 ansible 的本地端上執行。參考:[Controlling where tasks run: delegation and local actions](https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html) - 建議安裝 [ansible-lint](https://github.com/ansible/ansible-lint): ``` pip install ansible-lint ``` 可以用來檢查 yaml 語法是否正確並直接顯示錯誤的位置和原因