天天看點

自動化運維利器Ansible要點彙總

  由于大部分網際網路公司伺服器環境複雜,線上線下環境、測試正式環境、分區環境、客戶項目環境等造成每個應用都要重新部署,而且伺服器數量少則幾十台,多則千台,若手工一台台部署效率低下,且容易出錯,不利後期運維,是以需要Ansible或者Saltstack來解決此問題。

  Ansible與Saltstack最大的差別是Ansible無需在被控主機部署任何用戶端代理,預設直接通過SSH通道進行遠端指令執行或下發配置,這裡不作詳細對比,直接使用Ansible。Ansible是DevOps項目基礎工具之一,緻力于自動化、工具化的全新維護模式,通過工具化自動化的作業,提高生産效率的同時減輕維護人員的重擔。

  Ansible是一款基于Python開發的自動化運維工具,實作了批量系統配置、批量程式部署、批量運作指令等功能,主要特點:

  • 部署簡單,隻需在主要端部署Ansible環境,被控端無需做任何操作,預設使用SSH協定對裝置進行管理;
  • 配置簡單、功能強大、擴充性強;
  • 支援API及自定義子產品,可通過Python輕松擴充;
  • 通過Playbooks來定制強大的配置、狀态管理;
  • 幂等性:一種操作重複多次結果相同

Ansible工作流程

自動化運維利器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.cfg

2、查找對應的主機配置檔案,找到要執行的主機或者組。

3、加載自己對應的子產品檔案,如command

4、通過ansible将子產品或指令生成對應的臨時py檔案,并将該檔案傳輸至遠端伺服器

5、對應執行使用者家目錄的.ansible/tmp/XXX/XXX.PY檔案

6、給檔案+x執行

7、執行并傳回結果

8、删除臨時py檔案,sleep 0 退出。

  Ansible完成任務的兩種方式,一種是Ad-Hoc,就是ansible指令,另一種就是Ansible-playbook,也就是ansible-playbook指令。他們的差別就像是Command指令行和Shell Scripts。

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中的一些技巧

playbook目錄結構

自動化運維利器Ansible要點彙總

  webservice.yml為入口,files目錄存放靜态檔案,handlers存放一些task的handler,templates存放jinja2模闆檔案,vars存放變量檔案。

  ansible-playbook執行logstash安裝劇本

ansible-playbook /logstash/site.yml

  這裡不詳細介紹playbook的使用,隻摘出幾個重要的使用場景方法。

delegate_to

  将某一個任務委托給指定主機,如在192.168.0.9伺服器上檢測k8s叢集狀态:

- name: get status

  command: get k8s status

  delegate_to: "192.168.0.9"

  若委派給本機的時候,還可以使用更快捷的方法local_action

  local_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

  指定 ignore_errors:true,任務失敗繼續完成剩餘的任務。例如,當删除最初并不存在的日志檔案時抛錯 但忽略錯誤繼續執行剩餘的任務。

- name: 'Delete logs'

shell: rm -f /var/log/nginx/errors.log

ignore_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

  在本地伺服器上運作指令,而不是SSH

- 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通信。

  具體安裝内容這裡不作詳情介紹。

作者:歡醉

公衆号【一個碼農的日常】 技術群:319931204 1号群: 437802986 2号群: 340250479

出處:http://zhangs1986.cnblogs.com/

碼雲:https://gitee.com/huanzui

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

Top