ansible工具

ansible運維

ansible簡介

  • 官方的title是:Ansible is Simple IT Automation 即 簡單的自動化it工具
  • ansible跟其餘it自動化技術的區別在於其關注點並不是是配置管理,應用部署或it流程工做流,而是提供一個統一的界面來協調全部的it自動化功能,所以ansible的系統更加易用,部署更快。
  • ansible可讓用戶避免編寫腳本或代碼來管理應用,同事還能搭建工做流實現it任務的自動化執行,it自動化能夠下降技術門檻及對傳統it的依賴,從而加快項目的交付速度

ansible的優缺點

  • 優勢
    • 輕量級,他不須要去客戶端安裝agent(代理),更新是,只須要在主控機(操做機)上記性一次更新便可
    • 批量任務執行能夠寫成腳本,並且不用發佈到遠程就能夠執行
    • 使用python編寫,維護更簡單
    • 支持sudo
  • 缺點
    • 由於不須要代理,直接基於ssh執行,因此執行效率相對較低
    • 對window備管節點須要增強

ansible架構及工做原理

  • ansible基本架構以下圖所示html

    img

    • ansible core: ansible自身核心模塊
    • host inventory: 主機庫,定義可管控的主機列表
    • connection plugins:鏈接插件,通常默認基於ssh協議鏈接
    • modules: core modules (自帶模塊), custome models(自定義模塊)
    • playbooks: 劇本,按照所設定編排的順序執行完成安排任務

ansible工做原理如圖

img

  1. 主控端支持local,ssh,zeromq三種方式鏈接被控端,默認使用基於ssh的鏈接--------這部分對應基本架構架構圖中的鏈接模塊;node

  2. 能夠按應用類型等法師進行Host Inventory(主機羣)分類,管理節點經過各種模塊實現相應的操做,---單個模塊,單條命令稱爲ad-hocpython

  3. 管理節點統一經過playbooks實現多個task的集合實現一類功能,如web服務的安裝部署,數據庫服務端的批量備份等,palybooks咱們能夠理解爲劇本,經過組合多條ad-hoc操做的配置文件c++

  4. ansible默認是經過ssh通道來管理的,也就是它所說的免客戶端方式來管理,底層是經過paramiko來實現的git

  5. ansible執行過程大致過程以下圖,其中暖色的表明模塊化github

    img

部署安裝

名稱 IP 操做系統 用途
ansible-server 192.168.11.17 centos7 管理端
client-1 192.168.11.18 centos7
client-2 192.168.11.19 centos7

1. yum安裝

須要先配置epel源,能幫助咱們解決軟件包的依賴關係
yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm
# epel源 並安裝ansible
    ll /etc/yum.repos.d/epel*
    
# 安裝
yum install ansible -y

2. 源碼安裝

  1. 參考博客: https://blog.51cto.com/tengxiansheng/1863688web

  2. 源碼安裝須要首先確保安裝了git ,由於它的源碼是保存在GitHub,咱們須要利用git將其clone下來而後本地編譯安裝shell

    安裝git yum install -y git數據庫

    安裝ansiblecentos

    git clone https://github.com/ansible/ansible.git -recursive
    cd ./ansible
    source ./hacking/env-setup

    具體安裝過程本身能夠嘗試哦,這裏就不截圖展現了。

    驗證安裝是否安裝OK能夠參考上面的ansible --version

3. pip安裝

  1. 解決依賴

    yum install python-pip python-devel gcc gcc-c++ glibc-devel zlib-devel openssl-devel -y
  2. pip 安裝ansible

    pip install ansibele --upgrade
    
    驗證安裝是否安裝OK能夠參考上面的ansible --version    
    
    ansible --version  查看版本

ansible配置文件

  • 兩個核心文件:ansible.cfg和hosts文件,默認都存放在/etc/ansible目錄下。

  • ansible.cfg:主要設置一些ansible初始化的信息,好比日誌存放路徑、模塊、插件等配置信息
  • hosts:機器清單,進行分組管理

1. ansible.cfg文件

  • 文件配置經常使用參數

    使用化境變量方式來配置
    
    大多數的Ansible參數能夠經過設置帶有ANSIBLE_開頭的環境變量進行配置,參數名稱必須都是大寫字母,以下配置:
    
    export ANSIBLE_SUDO_USER=root
    
    設置了環境變量以後,ANSIBLE_SUDO_USER就能夠在playbook中直接引用。
    
    二、設置ansible.cfg配置參數
    
    Ansible有不少配置參數,下面列出經常使用的配置參數:
    
    1)inventory
    
    該參數表示資源清單inventory文件的位置,資源清單就是一些Ansible須要鏈接管理的主機列表
    
    inventory = /root/ansible/hosts
    
    2)library
    
    Ansible的操做動做,不管是本地或遠程,都使用一小段代碼來執行,這小段代碼稱爲模塊,這個library參數就是指向存放Ansible模塊的目錄
    
    library = /usr/share/ansible
    
    3)forks
    
    設置默認狀況下Ansible最多能有多少個進程同時工做,默認設置最多5個進程並行處理。具體須要設置多少個,能夠根據控制主機的性能和被管理節點的數量來肯定。
    
    forks = 5
    
    4)sudo_user
    
    這是設置默認執行命令的用戶,也能夠在playbook中從新設置這個參數
    
    sudo_user = root
    
    5)remote_port
    
    這是指定鏈接被關節點的管理端口,默認是22,除非設置了特殊的SSH端口,否則這個參數通常是不須要修改的
    
    remote_port = 22
    
    6)host_key_checking
    
    這是設置是否檢查SSH主機的密鑰。能夠設置爲True或False
    
    host_key_checking = False
    
    7)timeout
    
    這是設置SSH鏈接的超時間隔,單位是秒。
    
    timeout = 20
    
    8)log_path
    
    Ansible系統默認是不記錄日誌的,若是想把Ansible系統的輸出記錄到人i治穩健中,須要設置log_path來指定一個存儲Ansible日誌的文件
    
    log_path = /var/log/ansible.log
    
    另外須要注意,執行Ansible的用戶須要有寫入日誌的權限,模塊將會調用被管節點的syslog來記錄,口令是不會出現的日誌中的
    
    9)host_key_checking
    
    若是有臺被管節點從新安裝系統並在known_hosts中有了與以前不一樣的密鑰信息,就會提示一個密鑰不匹配的錯誤信息,直到被糾正爲止,在使用Ansible時,若是有臺被管理節點沒有在known_hosts中被初始化,將會在使用Ansible或定時執行Ansible時提示對key信息的確認。
    
    若是你不想出現這種狀況,而且你明白禁用此項行爲的含義,只要修改該參數爲False便可
    
    host_key_checking = False

2. ansible hosts配置

  • 配置被控端主機地址的配置
    1. 編輯/etc/ansible/hosts
    2. 添加本機的public SSH key到目標機器的authorized_keys #ssh-copy-id
    3. 添加本機的私鑰到Ansible
    4. 運行ansible all -m ping 測試是否添加成功
  • lnventory 分組

    • Ansible可同時操做屬於一個組的多臺主機,組和主機之間的關係經過inventory文件配置,默認文件路徑爲/etc/ansible/hosts
  • 常見參數配置

    ansible_ssh_host                    # 目標主機地址
        ansible_ssh_port                    # 目標主機端口,默認22
        ansible_ssh_user                    # 目標主機用戶
        ansible_ssh_pass                    # 目標主機ssh密碼
        ansible_sudo_pass                 # sudo密碼
        ansible_sudo_exe                    
        ansible_connection               # 與主機的鏈接類型,好比:local,ssh或者paramiko
        ansible_ssh_private_key_file  # 私鑰地址
        ansible_shell_type                 # 目標系統的shell類型
        ansible_python_interpreter   # python版本

    詳細參數:https://www.cnblogs.com/LuisYang/p/5960660.html

  • 格式

    [test]     # 組名  
    10.0.0.1  # 主機ip  或者10.0.0.1:65522 自定義端口
  • 簡單配置

    [defaults]
    inventory      = /etc/ansible/hosts
    sudo_user=root
    remote_port=22
    host_key_checking=False
    remote_user=root
    log_path=/var/log/ansible.log
    module_name=command
    private_key_file=/root/.ssh/id_rsa
    no_log:True
  • 參數

ansible經常使用模塊

經常使用參數:

  • -m 模塊
  • -i PYTH , -i 後面跟庫存主機文件的路勁,默認爲/etc/ansible/hosts
  • -a (arguments) 命令行參數

實例:

ansible tests1 -m copy -a 'src=/tmp/test.txt dest=/tmp/test/test.txt"

AAsWYF.png

ansible <host-pattern> [-f forks] [-m module_name] [-a args] [options]
  • host-pattern:此次的命令對哪些主機生效;
  • -f forks:啓動的併發線程數,就是一次並行處理多少主機;
  • -m module_name:要使用的模塊;
  • -a args:模塊特有的參數。

1. command 執行模塊

  • 做爲ansible的默認模塊,能夠容許遠程主機範圍內的全部shell命令。

    注意: 在command的命令中含有像$ HOME'這樣的變量和像``<「',」>「, `「」「」,「」;「」和「」&「'將沒法正常工做(若是須要這些功能,請使用[shell]模塊)

    ansible 192.168.168.11* -m command -a 'ip addr show dev eth0'
    
    參數:
    – chdir:在運行命令以前,切換到此目錄。

2. shell 執行模塊

  • 功能:執行遠程主機的shell腳本文件

    ansible all -m shell -a "/home/test.sh"
    
    
    參數:
    – chdir:在運行命令以前,切換到此目錄。
    – executable:更改用於執行命令的shell(bash,sh)。 應該是可執行文件的絕對路徑。

3. copy複製模塊

  • 功能: 實現主控端向目標主機copy文件。

    ansible all -m copy -a "src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755" 
    
    #src 主控端文件位置
    #dest 被控端目標位置
    #owner 文件複製過去後的全部者
    #group 文件複製過去後的所屬組
    #mode  文件的權限設定,執行a+x這種方式

4. Fetch 抓取模塊

  • 用途:用於從被控端 中拷貝文件到主控端

  • 注意: 不能拷貝目錄

    ansible pythonserver -m fetch -a "src=/root/123 dest=/root"
    
    SSH password:
    - fetch:
        src: 在遠程拉取的文件,而且必須是一個file,不能是目錄
        dest: 用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile

5. yum 安裝模塊

  • 功能:安裝 軟件包

    ansible all -m yum -a "name=httpd state=latest disable_gpg_check=yes enablerepo=epel"
    #name 包名
    #state (Choices: present, installed, latest, absent, removed)[Default: present]
    #disable_gpg_check:禁止gpg檢查
    #enablerepo:只啓動指定的repo

6. cron 計劃模塊

  • 功能: 被控端的crontab配置,用於管理計劃任務的

  • 參考博客: https://blog.51cto.com/noodle/1769528

    ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom"
    
    
    backup:對遠程主機上的原任務計劃內容修改以前作備份
     cron_file:若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
     minute分,hour時,day日,month月,weekday周
     job: 要執行的任務,依賴於state=present
     name: 該任務的描述
     special_time: 指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
     state: 確認該任務計劃是建立仍是刪除
     user: 以哪一個用戶身份執行

7. service 服務模塊

  • 功能: 服務管理,

    [root@localhost ~]# ansible all -m service -a "name=httpd state=restarted"    #啓動服務
    [root@localhost ~]# ansible all -m service -a "name=httpd state=running"      #查看服務狀態
    [root@localhost ~]# ansible all -m service -a "name=httpd state=stoped"       #中止服務
    
    
    
    參數:
    enabled=:是否開機自動啓動,取值爲true或false;
    name=:服務名字;
    state=:狀態,取值有started,stoped,restarted。

8. template 模板模塊

  • 基於模板方式生成一個文件複製到遠程主機(template使用Jinjia2格式做爲文件模版,進行文檔內變量的替換的模塊。它的每次使用都會被ansible標記爲」changed」狀態。)

    - template:
        src: /mytemplates/foo.j2   
        dest: /etc/file.conf   
        owner: bin
        group: wheel
        mode: 0644
    
    
    – backup: 若是原目標文件存在,則先備份目標文件 
    – src:在ansible控制器上的Jinja2格式化模板的路徑。 這能夠是相對或絕對的路徑。 
    – dest:將模板渲染到遠程機器上的位置。 
    force:是否強制覆蓋,默認爲yes 
    – owner:目標文件屬主 
    – group:目標文件屬組 
    – mode:目標文件的權限模式,模式能夠被指定爲符號模式(例如,u + rwx或u = rw,g = r,o = r)

9. file 文件模塊

  • 功能:用於遠程主機上的文件操做,對文件的全部權,組合模式進行更改

    # 更改文件全部權,組和模式。 當使用八進制數指定模式時,第一個數字應始終爲0。
    - file:
        path: /etc/foo.conf
        owner: foo
        group: foo
        mode: 0644
    
    # touch建立文件,使用符號模式設置權限(至關於0644)
    - file:
        path: /etc/foo.conf
        state: touch
        mode: "u=rw,g=r,o=r"
    
    # touch建立文件,添加/刪除一些權限
    - file:
        path: /etc/foo.conf
        state: touch
        mode: "u+rw,g-wx,o-rwx"
    
    # 建立一個目錄,若是它不存在
    - file:
        path: /etc/some_directory
        state: directory
        mode: 0755
    
    
    
    – force:須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no 
    – group:定義文件/目錄的屬組 
    – mode:定義文件/目錄的權限 
    – owner:定義文件/目錄的屬主 
    – path:必選項,定義文件/目錄的路徑 
    – recurse:遞歸的設置文件的屬性,只對目錄有效 
    – src:要被連接的源文件的路徑,只應用於state=link的狀況 
    – dest:被連接到的路徑,只應用於state=link的狀況 
    – state: 
       directory:若是目錄不存在,建立目錄 
       file:即便文件不存在,也不會被建立 
       link:建立軟連接 
       hard:建立硬連接 
       touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間 
       absent:刪除目錄、文件或者取消連接文件

10 user 用戶模塊

  • 功能: 遠程主機用戶管理

    [root@localhost ~]# ansible all -m user -a "name=jerry comment=' doubi jerry'"   #添加用戶 詳細參數參考ansible-doc user
    [root@localhost ~]# ansible all -m user -a "name=jerry state=absent remove=yes"  #刪除用戶

11 ping 模塊

  • 功能: 檢查指定節點機器是否還能連通,用法很簡單,不涉及參數,主機若是在線,則回覆pong

  • 還用個hping 模塊,

    ansible erp -m ping

13 raw 執行原始命令模塊

  • 執行原始的命令,而不是經過模塊子系統。在任何狀況下,使用shell或命令模塊是合適的。給定原始的參數直接經過配置的遠程shell運行。可返回標準輸出、錯誤輸出和返回代碼。此模塊沒有變動處理程序支持。

    這個模塊不須要遠程系統上的Python,就像腳本模塊同樣。此模塊也支持Windows目標。

14 pip 管理python庫依賴 模塊

  • 用於管理Python庫依賴項,爲了使用pip模塊,必須提供參數name或者requirements

    # 安裝bottle python包。
    - pip:
        name: bottle
    
    # 在0.11版安裝bottle python包。
    - pip:
        name: bottle
        version: 0.11
    
    # 使用遠程協議(bzr +,hg +,git +,svn +)安裝MyApp。 您沒必要在extra_args中提供'-e'選項。
    - pip:
        name: svn+http://myrepo/svn/MyApp#egg=MyApp
    
    # 使用遠程協議(bzr +,hg +,git +)安裝MyApp。
    - pip:
        name: git+http://myrepo/app/MyApp
    
    # 從本地壓縮包安裝MyApp
    - pip:
        name: file:///path/to/MyApp.tar.gz
    
    # 將bottle安裝到指定的virtualenv中,繼承全局安裝的模塊
    - pip:
        name: bottle
        virtualenv: /my_app/venv
        virtualenv_site_packages: yes
    
    # 使用Python 2.7將bottle安裝到指定的virtualenv中
    - pip:
        name: bottle
        virtualenv: /my_app/venv
        virtualenv_command: virtualenv-2.7
    
    # 在用戶主目錄中安裝bottle。
    - pip:
        name: bottle
        extra_args: --user
    
    # 安裝指定的python requirements
    - pip:
        requirements: /my_app/requirements.txt
    
    # 在指定的virtualenv中安裝指定的python requirements。
    - pip:
        requirements: /my_app/requirements.txt
        virtualenv: /my_app/venv
    
    # 安裝指定的python requirements和自定義pip源URL
    - pip:
        requirements: /my_app/requirements.txt
        extra_args: -i https://example.com/pypi/simple
    
    # 專門爲Python 3.3安裝bottle,使用'pip-3.3'可執行文件。
    - pip:
        name: bottle
        executable: pip-3.3
    
    # 安裝 bottle,若是已安裝,強制從新安裝
    - pip:
        name: bottle
        state: forcereinstall
  • 參數

    – chdir: 執行pip命令前cd進入的目錄 
    – name:要安裝的Python庫的名稱或遠程包的URL。 
    – requirements:一個pip requirements.txt文件的路徑,它應該是遠程系統的本地文件,若是使用chdir選項,則能夠將文件指定爲相對路徑。 
    – version:指定的Python庫的安裝版本。 
    – extra_args:額外的參數傳遞給pip。 
    – executable:顯式可執行文件或可執行文件的路徑名,用於爲系統中安裝的特定版本的Python運行pip。 例如pip-3.3,若是系統中安裝了Python 2.7和3.3,而且想要爲Python 3.3安裝運行pip。 它不能與「virtualenv」參數一塊兒指定(在2.1中添加)。 默認狀況下,它將採用適用於python解釋器的版本。 pip3在python 3上,pip2或pip在python 2上。 
    – virtualenv:要安裝到的virtualenv目錄的可選路徑。 它不能與’executable’參數一塊兒指定(在2.1中添加)。 若是virtualenv不存在,則將在安裝軟件包以前建立它。 可選的virtualenv_site_packages,virtualenv_command和virtualenv_python選項會影響virtualenv的建立。 
    – virtualenv_command:用於建立虛擬環境的命令或路徑名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。 
    – virtualenv_python:用於建立虛擬環境的Python可執行文件。 例如python3.5,python2.7。 未指定時,將使用用於運行ansible模塊的Python版本。 當virtualenv_command使用pyvenv或-m venv模塊時,不該使用此參數。 
    – state:狀態(present,absent,latest, forcereinstall),表示是安裝還卸載 
       present:默認的,表示爲安裝 
       lastest: 安裝爲最新的版本 
       absent:表示刪除 
       forcereinstall:「forcereinstall」選項僅適用於可ansible 2.1及更高版本。

15 group 組模塊

  • 功能: 分組

    ansible web -m group -a 'name=g1 gid=666 state=present system=yes'
    
    – gid:指定用的gid。 
    – name:指定用戶名。 
    – state:是建立仍是刪除。(present,absent) 
    – system:若是是,則表示建立的組是系統組。

16 get_url模塊(相似wget下載)

  • 模塊主要用於從http、ftp、https服務器上下載文件(相似於wget),主要有以下選項:

    - name: Download foo.conf
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        mode: 0440
    
    - name: Download file with custom HTTP headers
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        headers: 'key:value,key:value'
    
    - name: Download file with check (sha256)
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c
    
    
    
    – sha256sum:下載完成後進行sha256 check; 
    – timeout:下載超時時間,默認10s 
    – url:下載的URL 
    – url_password、url_username:主要用於須要用戶名密碼進行驗證的狀況 
    – dest:將文件下載到哪裏的絕對路徑。若是dest是目錄,則使用服務器提供的文件名,或者若是沒有提供,將使用遠程服務器上的URL的基本名稱。 
    – headers:以格式「key:value,key:value」爲請求添加自定義HTTP標頭。

17 unarchive 解壓模塊

  • 功能: 用於解壓文件

    - name: 將foo.tgz解壓縮到/var/lib/foo中
      unarchive:
        src: foo.tgz
        dest: /var/lib/foo
    
    - name: 解壓遠程計算機上已存在的文件
      unarchive:
        src: /tmp/foo.zip
        dest: /usr/local/bin
        remote_src: yes
    
    - name: 解壓文檔須要下載的文件(2.0中添加)
      unarchive:
        src: https://example.com/example.zip
        dest: /usr/local/bin
        remote_src: yes
    
    參數:
    – copy:在解壓文件以前,是否先將文件複製到遠程主機,默認爲yes。若爲no,則要求目標主機上壓縮包必須存在。 
    – creates:指定一個文件名,當該文件存在時,則解壓指令不執行 
    – dest:遠程主機上的一個路徑,即文件解壓的絕對路徑。 
    – group:解壓後的目錄或文件的屬組 
    – list_files:若是爲yes,則會列出壓縮包裏的文件,默認爲no,2.0版本新增的選項 
    – mode:解壓後文件的權限 
    – src:若是copy爲yes,則須要指定壓縮文件的源路徑 
    – owner:解壓後文件或目錄的屬主
    ---------------------

18 script 複製並執行 模塊

  • 功能: script模塊將本地腳本複製到遠程主機並運行之

    ansible web -m script -a 'time.sh'

19 setup 模塊

  • 相似saltstack的grains靜態信息收集,收集一些主機硬件信息或者以及其餘如fqdn等等

  • 使用setup獲取ip地址以及主機名使用filter過濾等等

    獲取內存信息
    ansible db -m setup -a 'filter=ansible_memory_mb'
    
    
    獲取主機名
    ansible db -m setup -a 'filter=ansible_nodename'
相關文章
相關標籤/搜索