自動化運維工具-Ansible

經常使用自動化運維工具

  • OS provisioning
  1. Cobbler : 批量的系統安裝工具
  • OS config
  1. Cfengine :早期的一種系統配置工具
  2. Puppet:基於Ruby開發,採用C/S架構,擴展性強,基於SSL認證
  3. Saltstack:基於Python開發,採用C/S架構,相對於puppet更輕量級,配置語法採用YAML
  • Deployment
  1. Func(ssl)
  2. Fabric

爲何選擇ansible

  • Ansible
  1. 是新出現的自動化運維工具,ansible是一個批量的配置管理和應用部署工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric、SaltStack )的優勢。
  2. 相對於puppet和saltstack,ansible無需客戶端,更輕量級
  3. ansible甚至都不用啓動服務,僅僅只是一個工具,能夠很輕鬆的實現分佈式擴展
  4. 使用python編寫,維護更簡單,ruby語法過於複雜
  5. ssh by default:基於SSH工做更強的遠程命令執行操做
  6. yaml,not code:使用YAML語言定製劇本playbook
  7. 冪等性:一種操做重複屢次結果相同

Ansible工做原理

基本架構

Ansible各組件

  • 核心:ansible
  • 核心模塊(Core Modules):這些都是ansible自帶的模塊
  • 擴展模塊(Custom Modules):若是核心模塊不足以完成某種功能,能夠添加擴展模塊
  • 插件(Plugins):完成模塊功能的補充
  • 劇本(Playbooks):ansible的任務配置文件,將多個任務定義在劇本中,由ansible自動執行
  • 鏈接插件(Connectior Plugins):ansible基於鏈接插件鏈接到各個主機上,雖然ansible是使用ssh鏈接到各個主機的,可是它還支持其餘的鏈接方法,因此須要有鏈接插件
  • 主機羣(Host Inventory):定義ansible管理的主機

 

工做流程

 

 

Ansible使用

過程以下安裝→配置互信→配置主機組→獲取幫助→經常使用模塊及用法→playbookhtml

Ansible安裝

Ansible只是一個進程 不須要添加數據庫也不須要啓動和運行守護進程它只是一個進程你能夠輕鬆使用它安裝在任何一點主機上面(除了windows)ansible管理機不能安裝到windows上面java

版本的選擇 由於2.0有很是大的改進 通常都會使用2.0以上的版本控制機的要求 由於ansible是python寫的因此,須要在安裝了python2.6或者2.7以上的python版本才能夠安裝node

配置好epel源python

yum install -y ansible

配置互信

Ansible使用ssh來進行遠程管理:linux

在服務器上執行:web

ssh-keygen -t rsa -P ''           #生成公鑰
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.103(這是node ip)     #將公鑰分發到各被管理主機上,實現祕鑰登陸

 注:固然也能夠攜帶密碼來進行管理http://www.javashuo.com/article/p-nxaomqde-cs.htmlshell

配置文件

主機組配置

位置:/etc/ansible/hosts數據庫

案例:apache

# cat /etc/ansible/hosts

[test] #表明test組,如下是組內包含的全部主機
192.168.12.5[1:4]         #能夠用通配符來簡化,表明192.168.12.51-192.168.12.54
192.168.12.5[6:9]
192.168.13.101
192.168.13.103

[app] #表明app組
192.168.12.5[0:3]
192.168.12.5[5:9]

#執行命令的時候做用於組名便可批量對組內全部用戶執行操做

 主配置文件:windows

/etc/ansible/ansible.cfg

經常使用配置:取消host_key_checking = False 的註釋,解決ansible首次鏈接host服務器需驗證問題

獲取使用說明幫助

  • ansible的命令格式:

ansible <host-pattern> [-m module_name] [-a args]

  <host-pattern> :能夠是具體的主機、組、all(沒有在組裏的全部主機)

  -m 指定模塊名

  -a  指定命令

  • 獲取ansible的模塊列表:
# ansible-doc –l

  • 獲取ansible的模塊的幫助:
#ansible-doc -s modename

測試:使用ping模塊來測試鏈接狀況

ansible經常使用模塊介紹

  • command:在遠程主機上執行命令,不支持管道'|'
  • shell:執行遠程主機的shell/python腳本
  • raw:相似於command模塊、支持管道傳遞

  說明:command、shell、raw模塊的核心參數爲命令自己;而其它模塊的參數一般爲「key=value」格式;

  • scscript:在遠程主機執行主控端的shell/python腳本  (使用相對路徑)
  • copy:複製文件到遠程主機(fetch可將遠程複製到本地)
  • raw:相似於command模塊,支持管道
  • file:用於配置文件屬性
  • yum:用於安裝軟件包
  • cron:配置計劃任務
  • user:配置用戶
  • group:配置用戶組
  • service:用於管理服務
  • ping:用於檢測遠程主機是否存活
  • setup:查看遠程主機的基本信息
  • mount:配置掛載點

 使用方法和案例詳解:

command

  說明:在遠程主機上執行命令,不支持管道'|',是默認模塊,能夠不用-m指定

  creates:若是這個參數對應的文件存在,就不運行command
  free_form:要執行的linux指令
  chdir:在執行指令以前,先切換到該指定的目錄
  removes:與creates相反,若是這個參數對應的文件不存在,就不運行command

  示例:

  ansible test –m command -a "chdir=/tools touch test"  #在/tools目錄下建立test文件
  ansible test –a "chdir=/tools creates=/test touch test" #若是/tools下沒有test文件則建立

shell

  說明:能夠指定運行環境,支持管道

  chdir:運行command命令前先cd到這個目錄
  creates:若是這個參數對應的文件存在,就不運行command
  executable: 改變用來執行命令的shell,應該是可執行文件的絕對路徑。
  free_form:須要執行的腳本(沒有真正的參數爲free_form)
  removes:與creates相反,若是這個參數對應的文件不存在,就不運行command
  stdin(2.4後新增) no 將命令的stdin設置爲指定的值
  warn:
  示例:
ansible test -m shell -a 'bash /root/test.sh'
ansible test -m shell -a "chdir=/testdir ls"
ansible 192.168.12.50 -m shell -a "/usr/bin/python /root/test.py"     #使用python環境執行py文件

raw

  說明:和command 功能類似,支持管道符

ansible test -m raw   -a "ps -ef | grep java"           #我最經常使用的命令,通常任務均可以用raw來執行

script

  說明:在遠程主機執行主控端的shell/python腳本  (使用相對路徑)

ansible test -m script -a "/etc/ansible/test.sh"

copy

  src:源文件
  dest:目標路徑
  backup:覆蓋以前,是否備份原文件
  owner:設定文件/目錄的屬主
  group:設定文件/目錄的屬組
  mode:設定文件/目錄的權限
  示例:

ansible test -m copy -a "src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644"
ansible test -m copy -a "src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes"          #copy中使用backup將原來的文件備份一下再覆蓋

file
  group:定義文件/目錄的屬組
  owner:定義文件/目錄的屬主
  mode:定義文件/目錄的權限
  path:必選項,定義文件/目錄的路徑
  recurse:遞歸設置文件的屬性,只對目錄有效
  state:定義文件狀態
  directory:若是目錄不存在,建立目錄
  touch:若是文件不存在,建立一個新文件
  absent:刪除文件或目錄
  示例:

ansible test -m file -a "src=/etc/fstab.link dest=/tmp/fstab state=link"        #建立連接文件
ansible test -m file -a "path=/tmp/fstab state=absent"            #刪除文件
ansible test -m file -a "path=/tmp/test state=touch"         #建立文件

yum
  enablerepo:啓用某個源
  name:要進行操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
  state:定義軟件包狀態
  present:安裝
  absent:刪除
  latest:安裝最新的
  示例:

ansible test -m yum -a 'name=httpd state=latest'             #yum安裝最新的httpd
ansible test -m yum -a 'name="@Development tools" state=present'     
ansible test -m yum -a 'name=lszrz state=present enablerepo=local'   #指定yum源爲local
ansible test -m yum -a 'name=httpd state=remove' #yum卸載httpd

cron
  backup:對遠程主機上的原任務計劃內容修改以前作備份
  day:日(1-31,*,*/2,……)
  hour:小時(0-23,*,*/2,……)
  minute:分鐘(0-59,*,*/2,……)
  month:月(1-12,*,*/2,……)
  weekday:周(0-6,*,……)
  job:要執行的任務,依賴於state=present
  name:該任務的描述
  special_time:指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
  state:確認該任務計劃是建立仍是刪除
  user:以哪一個用戶的身份執行
  示例:

ansible test -m cron -a 'name="check dirs" minute=1 hour=1 day=*/3 job="ls -alh > /dev/null"'             #建立計劃任務每三天一次,執行時間爲01:01
ansible test -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'           #當重啓後立馬執行

ansible test -m cron -a 'name="a job for reboot" state=absent backup=yes'        #刪除同時備份

service
  arguments:給命令行提供一些選項
  enabled:是否開機啓動 yes|no
  name:必選項,服務名稱
  runlevel:運行級別
  sleep:若是執行了restarted,在則stop和start之間沉睡幾秒鐘
  state:對當前服務執行啓動,中止、重啓、從新加載等操做(started,stopped,restarted,reloaded)
  示例:

ansible test -m service -a "name=httpd state=started enabled=yes"           #設置httpd服務爲啓動狀態,而且加入開機啓動項
ansible test -m service -a "name=foo pattern=/usr/bin/foo state=started"
ansible test -m service -a "name=network state=restarted args=eth0"           #帶參數啓動

user
  home:指定家目錄,須要createhome爲yes
  groups:用戶組
  uid:用戶UID
  password:指定用戶密碼
  name:用戶名
  createhome:是否建立家目錄
  system:是否建立爲系統用戶
  remove:但state=absent時,刪除家目錄
  state:建立或者刪除
  shell:指定用戶shell環境

  示例:

ansible test -m user -a 'name=newuser' #若是用戶已經存在,則不進行任何操做。
ansible test -m user -a 'name=newuser group=testgroup' #用戶的主組爲 testgroup,testgroup 組須要提早存在,當不使用 group 設置主組時,默認主組與用戶名相同。
ansible test -m user -a 'name=newuser state=absent' #遠程主機上刪除用戶
ansible test -m user -a 'name=newuser state=absent remove=yes' #刪除用戶同時刪除家目錄


ansible-playbook

Ansible-playbook是用yaml編寫的批量任務列表
命令格式:

ansibe-playbook test.yaml

YAML:是YAML 是專門用來寫配置文件的語言,很是簡潔和強大,遠比 JSON 格式方便。


例子:

vi test.yaml

- hosts: test          #做用的主機組
  remote_user: root    #指定用戶
  tasks:               #下面寫任務列表
    - name: add a group                 #指定任務名稱
      group: gid=1000 name=testgroup system=no       #任務執行命令
    - name: excute a command
      command: /bin/date
#此劇本完成兩個任務:①建立用戶組、②執行命令

執行說明:

Ansible-playbook的主體爲task list

執行過程:各任務按次序在每一個主機上執行,即在全部主機上完成第一個任務後才執行第二個,當中途發生錯誤,全部的任務都將回滾,所以,更改playbook後從新執行便可

Ansible-playbook中的name儘量的詳細和簡潔,以便於查看執行結果

能夠使用ignore_errors來忽略錯誤信息

   tasks:
      - name: run this command and ignore the result
        shell: /usr/bin/somecommand
        ignore_errors: True

練習:

製做一個playbook,要求爲web-servers主機組安裝最新版Apache服務,並將服務的端口經過修改配置問題改成8080,而後重啓服務

- hosts: web-servers
  remote_user: root
  tasks:
    - name: ensure apache latest version
      yum: state=latest name=httpd
    - name: apache configure file
      copy: src=/tools/httpd.conf dest=/etc/httpd/conf/httpd.conf force=yes
    - name: restart httpd
      service: name=httpd state=restarted
相關文章
相關標籤/搜索