自動化運維利器Ansible要點匯總
- 部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作,默認使用SSH協議對設備進行管理;
- 配置簡單、功能強大、擴展性強;
- 支援API及自定義模組,可通過Python輕鬆擴展;
- 通過Playbooks來訂製強大的配置、狀態管理;
- 冪等性:一種操作重複多次結果相同
Ansible工作流程

ansible.cfg主要配置指定host文件路徑,指定roles_path參數,其它參數默認。
部署Ansible的控制機需要python 2.7及以上,需要安裝paramiko模組、PyYAML、Jinja2、httplib2等模組,若被管節點為windows,則需要有powershell3並制授權遠程管理。
控制節點交互一般採用公鑰認證,這需要將主機節點的公鑰發放到所有被管節點,也可採用密碼形式通訊,但由於需要在hosts文件中明文標出不安全 不推薦,配置密碼:
/etc/ansible/hosts 192.168.0.200 ansible_ssh_user=root ansible_ssh_pass=123@abc
主機清單(host inventory)定義了管理主機的策略,需要在host文件中寫入主機的IP地址即可,若操作的主機未在清單中會提示錯誤。
ansible命令執行過程
1、載入自己的配置文件,默認/etc/ansible/ansible.cfg2、查找對應的主機配置文件,找到要執行的主機或者組。3、載入自己對應的模組文件,如command4、通過ansible將模組或命令生成對應的臨時py文件,並將該文件傳輸至遠程伺服器5、對應執行用戶家目錄的.ansible/tmp/XXX/XXX.PY文件6、給文件+x執行7、執行並返回結果8、刪除臨時py文件,sleep 0 退出。
ansible命令
獲取192.168.0.123主機資訊
ansible 192.168.0.123 -m shell -a “uname -a”
ansible常用模組
- command、shell、raw、script執行shell命令
- copy:複製文件到遠程主機,可以改許可權等
- file設置文件目錄屬性等
- fetch 從遠程某主機獲取文件到本地
- service 服務程式管理,啟動停止重啟服務等操作
- user管理用戶帳號
- script在指定節點運行服務端的腳本
Playbooks中的一些技巧

webservice.yml為入口,files目錄存放靜態文件,handlers存放一些task的handler,templates存放jinja2模板文件,vars存放變數文件。
ansible-playbook執行logstash安裝劇本
ansible-playbook /logstash/site.yml
delegate_to
– name: get statuscommand: get k8s statusdelegate_to: “192.168.0.9”
– name: get statuslocal_action : command ‘get k8s status’
run_once
run_once: true來指定該task只能在某一台機器上執行一次. 可以和delegate_to 結合使用,指定在”192.168.0.9″上執行一次升級資料庫操作
– command: /opt/upgrade_db.py
run_once: true
delegate_to: “192.168.0.9”
如果沒有delegate_to, 那麼這個task會在第一台機器上執行
ignore_errors
– name: ‘Delete logs’shell: rm -f /var/log/nginx/errors.logignore_errors: true
register 註冊變數
使用 debug 模組與 register 變數,輸出網路資訊
– hosts: proxyservers
tasks:
– name: “get host port info”
shell: netstat -lntp
register: host_port– name: “print host port”
debug:
#msg: “{{ host_port }}” # 輸出全部資訊
#msg: “{{ host_port.cmd }}” # 引用方式一
msg: “{{ host_port[‘stdout_lines’] }}” # 引用方式二
connection: local
– name: 創建 aggregator proxy證書籤名請求
template: src=aggregator-proxy-csr.json.j2 dest=/ssl/aggregator-proxy-csr.json
connection: local
until輪詢等待
輪詢等待kube-apiserver啟動完成,查看api服務是否running狀態,重試10次,每次間隔3秒
- name: 輪詢等待kube-apiserver啟動 shell: "systemctl status kube-apiserver.service|grep Active" register: api_status until: '"running" in api_status.stdout' retries: 10 delay: 3 tags: upgrade_k8s, restart_master
when判斷
當系統為centos等時執行centos.yml任務
- import_tasks: centos.yml when: 'ansible_distribution in ["CentOS","RedHat","Amazon","Aliyun"]'
內置變數inventory_hostname
inventory_hostname變數可以獲取到被操作的當前主機的主機名稱,這裡所說的主機名稱並不是linux系統的主機名,而是對應主機在清單中配置的名稱
如果使用IP配置主機,inventory_hostname的值就是IP,如果使用別名,inventory_hostname的值就是別名
如只給k8s主節點分發配置文件
- name: 分發kubeconfig配置文件 copy: src=cluster_dir/item dest=/etc/kubernetes/item when: "inventory_hostname in groups['kube_master']"
notify指令和handlers
如果在某個task中定義了notify指令,當Ansible在監控到該任務 changed=1時,會觸發該notify指令所定義的handler,然後去執行handler,需要注意的是hander是被觸發而被動執行的。
網上示例,安裝httpd、複製配置文件到遠端主機、啟動httpd服務:
cat apache.yml - hosts: webservers remote_user: root tasks: - name: install apache yum: name=httpd state=latest - name: install configure file for httpd copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: - restart httpd #通知restart httpd這個觸發器 - check httpd #可以定義多個觸發器 - name: start httpd service service: enabled=true name=httpd state=started handlers: #定義觸發器,和tasks同級 - name: restart httpd #觸發器名字,被notify引用,兩邊要一致 service: name=httpd state=restart - name: check httpd shell: netstat -ntulp | grep 80
ansible管理windows
環境要求Ansible管理主機Linux系統,遠程主機的通訊方式也由SSH變更為PowerShell,同時管理機必須預安裝Python的Winrm模組。
Windows客戶端主機開啟Winrm服務,PowerShell需3.0+版本且Management Framework 3.0+版本,實測Windows 7 SP1和Windows Server 2008 R2及以上版本系統經簡單配置可正常與Ansible通訊。
具體安裝內容這裡不作詳情介紹。