ansible自動化運維

ansible 系統架構

  • ansible簡介
    ansible是新出現的自動化運維工具,ansible是一個配置管理和應用部署工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric.SaltStack )的優勢,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架,根據官方提供的信息,當前使用ansible的用戶有:
    美國國家航空航天局(NASA /ˈnæsə/)
    evernote(印象筆記),rackspace(全球三大雲計算中心之一),atlassian,twitter(全球互聯網上訪問量最大的十個網站之一)等
    ansible在生產環境當中的應用
  • 自動化部署應用
  • 自動化管理配置
  • 自動化持續交付
  • 自動化(aws)雲服務器管理
  • ansible的優勢
  1. ansible糅合了衆多老牌運維工具的優勢,基本上pubbet和saltstack能實現的功能所有能實現
  2. 輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可;
  3. ansible是一個工具,ansible不須要啓動服務,僅僅只是一個工具,能夠輕鬆的實現分佈式擴展
  4. 批量任務執行能夠寫成腳本,並且不用分發到遠程就能夠執行
  5. ansible是一致性,高可靠性,安全性設計的輕量級自動化工具
  6. 使用python編寫,維護更簡單,ruby語法過於複雜;
  • 特性
    (1)、no agents:不須要在被管控主機上安裝任何客戶端;
    (2)、no server:無服務器端,使用時直接運行命令便可;
    (3)、modules in any languages:基於模塊工做,可以使用任意語言開發模塊;
    (4)、yaml,not code:使用yaml語言定製劇本playbook;
    (5)、ssh by default:基於SSH工做;
    (6)、strong multi-tier solution:可實現多級指揮。

ansible的基本架構
1.鏈接插件(connectior plugins) 用於鏈接主機 用來鏈接被管理端
2.核心模塊(core modules) 鏈接主機實現操做, 它依賴於具體的模塊來作具體的事情
3.自定義模塊(custom modules) 根據本身的需求編寫具體的模塊
4.插件(plugins) 完成模塊功能的補充
5.playbooks(劇本) ansible的配置文件,將多個任務定義在劇本中,由ansible自動執行
6.host inventory(主機清單)定義ansible須要操做主機的範圍
最重要的一點是 ansible是模塊化的 它全部的操做都依賴於模塊
https://www.processon.com/mindmap/58d6713be4b0359bbccc00aa 架構圖
html

image
image

好比我須要建立一個文件 那麼我就須要調用file模塊 我須要copy文件,那麼我就須要copy模塊
我須要測試機器的存活率,那麼就須要ping模塊
ansible all -m ping
image.png
image.png

ansible安裝

  • ansible只是一個進程 不須要添加數據庫也不須要啓動和運行守護進程它只是一個進程你能夠輕鬆使用它安裝在任何一點主機上面(除了windows)ansible管理機不能安裝到windows上面
  • 版本的選擇 由於2.0有很是大的改進 通常都會使用2.0以上的版本
  • 控制機的要求 由於ansible是python寫的 因此須要在安裝了python2.6或者2.7以上的python版本才能夠安裝
  • 管理節點的要求 須要安裝ssh python版本在2.5以上
  • 安裝有3個方式
  1. yum -y install ansible wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo(下載yum源)
  2. pip install ansible
  3. 從github下載
$ git clone git://github.com/ansible/ansible.git --recursive
$ cd ./ansible
$ make rpm
$ sudo rpm -Uvh ./rpm-build/ansible-*.noarch.rpm

任務執行模式

ansible系統由控制主機對被管節點的操做方式有兩種ad_hoc和playbookpython

  • ad_hoc單命令模式 能夠對多臺主機執行單個命令
ansible all -a "/bin/echo hello"
  • playbook經過多個tasks的集合完成一類功能如web的安裝部署,數據庫服務器的批量備份等
---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

安裝完ansible後,發現ansible一共爲咱們提供了七個指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。這裏咱們只查看usage部分,詳細部分能夠經過 「指令 -h」 的方式獲取。
一、ansible
[root@localhost ~]# ansible -h Usage: ansible <host-pattern> [options]git

ansible是指令核心部分,其主要用於執行ad-hoc命令,即單條命令。默認後面須要跟主機和選項部分,默認不指定模塊時,使用的是command模塊。如:
[root@localhost ~]# ansible 127.0.0.1 -a ‘date‘ 127.0.0.1 | SUCCESS | rc=0 >>Sun May 28 11:00:40 CST 2017github

默認使用的模塊是能夠在ansible.cfg 中進行修改的。ansible命令下的參數部分解釋以下web

參數:
 -a ‘Arguments‘, --args=‘Arguments‘ 命令行參數
 -m NAME, --module-name=NAME 執行模塊的名字,默認使用 command 模塊,因此若是是隻執行單一命令能夠不用 -m參數 
-i PATH, --inventory=PATH 指定庫存主機文件的路徑,默認爲/etc/ansible/hosts. 
-u Username, --user=Username 執行用戶,使用這個遠程用戶名而不是當前用戶 
-U --sud-user=SUDO_User sudo到哪一個用戶,默認爲 root -k --ask-pass 登陸密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證 
-K --ask-sudo-pass 提示密碼使用sudo -s --sudo sudo運行 
-S --su 用 su 命令 -l --list 顯示所支持的全部模塊 
-s --snippet 指定模塊顯示劇本片斷 
-f --forks=NUM 並行任務數。NUM被指定爲一個整數,默認是5。 #ansible testhosts -a "/sbin/reboot" -f 10 重啓testhosts組的全部機器,每次重啓10臺
 --private-key=PRIVATE_KEY_FILE 私鑰路徑,使用這個文件來驗證鏈接
-v --verbose 詳細信息 all 針對hosts 定義的全部主機執行 
-M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認爲/usr/share/ansible/ 
--list-hosts 只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook 文件 
-o --one-line 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。 
-t Directory, --tree=Directory 將內容保存在該輸出目錄,結果保存在一個文件中在每臺主機上。 
-B 後臺運行超時時間 -P 調查後臺程序時間 -T Seconds, --timeout=Seconds 時間,單位秒s 
-P NUM, --poll=NUM 調查背景工做每隔數秒。須要- b 
-c Connection, --connection=Connection 鏈接類型使用。可能的選項是paramiko(SSH),SSH和地方。當地主要是用於crontab或啓動。 
--tags=TAGS 只執行指定標籤的任務 例子:ansible-playbook test.yml --tags=copy 只執行標籤爲copy的那個任務 
--list-hosts 只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook 文件
--list-tasks 列出全部將被執行的任務 
-C, --check 只是測試一下會改變什麼內容,不會真正去執行;相反,試圖預測一些可能發生的變化 
--syntax-check 執行語法檢查的劇本,但不執行它 
-l SUBSET, --limit=SUBSET 進一步限制所選主機/組模式 --limit=192.168.0.15 只對這個ip執行 
--skip-tags=SKIP_TAGS 只運行戲劇和任務不匹配這些值的標籤 --skip-tags=copy_start 
-e EXTRA_VARS, --extra-vars=EXTRA_VARS 額外的變量設置爲鍵=值或YAML / JSON 
#cat update.yml 
--- 
- hosts: {{ hosts }} 
  remote_user: {{ user }} 
  .............. 
  #ansible-playbook update.yml --extra-vars "hosts=vipers user=admin" 傳遞{{hosts}}、{{user}}變量,hosts能夠是 ip或組名 
-l,--limit 對指定的 主機/組 執行任務 --limit=192.168.0.10,192.168.0.11 或 -l 192.168.0.10,192.168.0.11 只對這個2個ip執行任務

二、ansible-docdocker

[root@localhost ~]# ansible-doc -hUsage: ansible-doc [options] [module...]Options: -a, --all Show documentation for all modules -h, --help show this help message and exit -l, --list List available modules -M MODULE_PATH, --module-path=MODULE_PATH specify path(s) to module library (default=None) -s, --snippet Show playbook snippet for specified module(s) -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) --version show program‘s version number and exit

該指令用於查看模塊信息,經常使用參數有兩個-l 和 -s ,具體以下
//列出全部已安裝的模塊# ansible-doc -l//查看具體某模塊的用法,這裏如查看command模塊# ansible-doc -s commandshell

三、ansible-galaxy
ansible-galaxy 指令用於方便的從https://galaxy.ansible.com/ 站點下載第三方擴展模塊,咱們能夠形象的理解其相似於centos下的yum、python下的pip或easy_install 。以下示例:數據庫

[root@localhost ~]# ansible-galaxy install aeriscloud.docker- downloading role ‘docker‘, owned by aeriscloud- downloading role from https://github.com/AerisCloud/ansible-docker/archive/v1.0.0.tar.gz- extracting aeriscloud.docker to /etc/ansible/roles/aeriscloud.docker- aeriscloud.docker was installed successfully

這個安裝了一個aeriscloud.docker組件,前面aeriscloud是galaxy上建立該模塊的用戶名,後面對應的是其模塊。在實際應用中也能夠指定txt或yml 文件進行多個組件的下載安裝。這部分能夠參看官方文檔
四、ansible-lint
ansible-lint是對playbook的語法進行檢查的一個工具。用法是ansible-lint playbook.yml 。
五、ansible-playbook
該指令是使用最多的指令,其經過讀取playbook 文件後,執行相應的動做,這個後面會作爲一個重點來說。
六、ansible-pull
該指令使用須要談到ansible的另外一種模式---pull 模式,這和咱們日常常常用的push模式恰好相反,其適用於如下場景:你有數量巨大的機器須要配置,即便使用很是高的線程仍是要花費不少時間;你要在一個沒有網絡鏈接的機器上運行Anisble,好比在啓動以後安裝。這部分也會單獨作一節來說。
七、ansible-vault
ansible-vault主要應用於配置文件中含有敏感信息,又不但願他能被人看到,vault能夠幫你加密/解密這個配置文件,屬高級用法。主要對於playbooks裏好比涉及到配置密碼或其餘變量時,能夠經過該指令加密,這樣咱們經過cat看到的會是一個密碼串類的文件,編輯的時候須要輸入事先設定的密碼才能打開。這種playbook文件在執行時,須要加上 –ask-vault-pass參數,一樣須要輸入密碼後才能正常執行。具體該部分能夠參查官方博客apache

ansible配置文件 ansible.cfg

查看配置文件設置
http://docs.ansible.com/ansible/intro_configuration.html#poll-intervalvim

* inventory–這個參數表示資源清單inventory文件配置,資源清單就是一些ansible須要連接管理的主機列表。安裝完ansible以後默認所在的inventory列表配置以下:  

inventory = /etc/ansible/hosts    

* library–Ansible的操做動做,不管是本地或遠程,都使用一小段代碼來執行。這小段代碼成爲模塊,這個library參數就是隻想存放在Ansible模塊的目錄。Ansible支持多個目錄方式,只要用冒號(:)隔開就能夠,同時也會檢查當前執行playbook位置下的./library位置。默認的配置以下:

library = /usr/share/ansible  

* forks–設置默認狀況下Ansible最多能有多少個進程同時工做,默認設置最多5個進程並行處理。具體須要設置多少個,能夠根據控制主機的性能和被管理節點的數量來肯定。默認參數配置以下: forks=20 你沒有優化的優化的狀況下執行比較慢

forks = 5

* sudo_user–這個設置默認執行命令的用戶,在playbook中從新設置這個參數。默認參數配置以下:

sudo_user = root  

* remote_port–這個是指定連接被管節點的管理端口,默認22。除非設置了特殊的SSH端口,否則這個參數通常是不須要修改的。默認配置以下:

remote_port = 22

* host_key_checking–這個設置是否檢查SSH主機的祕鑰。能夠設置爲True或者False。默認配置以下:

host_key_checking = false  

* timeout–這是設置SSH連接的超時間隔,單位是秒。默認配置實例以下:

timeout = 60

* log_path–Ansible系統默認是不記錄日誌的,若是想把Ansible系統的輸出記錄到日誌文件中,須要設置log\_path來指定一個存儲Ansible日誌的文件。配置實例以下:

log_path = /var/log/ansible.log  
poll_interval 異步執行任務的時候多久檢查一次任務裝填
poll_interval = 15

選擇遠程的工具   默認狀況下就是smart(智能)模式  自動選擇鏈接方式
只有當你須要優化執行速度的時候才須要修改這個選項
transport = smart 

module_set_locale  設置本地的環境變量  
inventory      = /etc/ansible/hosts     這個是默認庫文件位置,腳本,或者存放可通訊主機的目錄  
#library        = /usr/share/my_modules/   Ansible默認搜尋模塊的位置  
remote_tmp     = $HOME/.ansible/tmp   Ansible 經過遠程傳輸模塊到遠程主機,而後遠程執行,執行後在清理現場.在有些場景下,你也許想使用默認路徑但願像更換補丁同樣使用  
pattern        = *    若是沒有提供「hosts」節點,這是playbook要通訊的默認主機組.默認值是對全部主機通訊  
forks          = 5    在與主機通訊時的默認並行進程數 ,默認是5d  
poll_interval  = 15    當具體的poll interval 沒有定義時,多少時間回查一下這些任務的狀態, 默認值是5秒  
sudo_user      = root   sudo使用的默認用戶 ,默認是root  
#ask_sudo_pass = True   用來控制Ansible playbook 在執行sudo以前是否詢問sudo密碼.默認爲no  
#ask_pass      = True    控制Ansible playbook 是否會自動默認彈出密碼  
transport      = smart   通訊機制.默認 值爲’smart’。若是本地系統支持   ControlPersist技術的話,將會使用(基於OpenSSH)‘ssh’,若是不支持講使用‘paramiko’.其餘傳輸選項包括‘local’, ‘chroot’,’jail’等等  
#remote_port    = 22    遠程SSH端口。 默認是22  
module_lang    = C   模塊和系統之間通訊的計算機語言,默認是C語言  
gathering = implicit   控制默認facts收集(遠程系統變量). 默認值爲’implicit’, 每一次play,facts都會被收集
#roles_path    = /etc/ansible/roles   roles 路徑指的是’roles/’下的額外目錄,用於playbook搜索Ansible roles
#host_key_checking = False    檢查主機密鑰
sudo_exe = sudo     若是在其餘遠程主機上使用另外一種方式執sudu操做.可使用該參數進行更換
#what flags to pass to sudo   傳遞sudo以外的參數
#sudo_flags = -H

#SSH timeout    SSH超時時間
timeout = 10
#remote_user = root   使用/usr/bin/ansible-playbook連接的默認用戶名,若是不指定,會使用當前登陸的用戶名
#log_path = /var/log/ansible.log     日誌文件存放路徑
#module_name = command     ansible命令執行默認的模塊
#executable = /bin/sh     在sudo環境下產生一個shell交互接口. 用戶只在/bin/bash的或者sudo限制的一些場景中須要修改
#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n      容許開啓Jinja2拓展模塊
#private_key_file = /root/.ssh/id_rsa        私鑰文件存儲位置
ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}   這個設置能夠告知用戶,Ansible修改了一個文件,而且手動寫入的內容可能已經被覆蓋.
#display_skipped_hosts = True     顯示任何跳過任務的狀態 ,默認是顯示
#error_on_undefined_vars = False      若是所引用的變量名稱錯誤的話, 將會致使ansible在執行步驟上失敗
#system_warnings = True    容許禁用系統運行ansible相關的潛在問題警告
#deprecation_warnings = True     容許在ansible-playbook輸出結果中禁用「不建議使用」警告
#command_warnings = False    當shell和命令行模塊被默認模塊簡化的時,Ansible 將默認發出警告
#nocows = 1    默認ansible能夠調用一些cowsay的特性   開啓/禁用:0/1
#nocolor = 1  輸出帶上顏色區別, 開啓/關閉:0/1

3. 配置Linux主機SSH無密碼訪問

3.1 生成祕鑰

#ssh-keygen -t rsa

3.2 將祕鑰拷貝到預管理的節點上

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.130

4. ansible執行

4.1測試主機連通性

修改主機和配置

#vim /etc/ansible/hosts

[xxx]

10.0.0.1

10.0.0.2

ansible all -m ping -k -k指令是增長密碼驗證

4.2批量執行命令

ansible all -m shell -a '/bin/echo hello ansible'

相關文章
相關標籤/搜索