1. 程式人生 > >Ansible基礎概述

Ansible基礎概述

維護 主機清單 tab cati ade run res .org 臨時

一、Ansible簡介

Ansible基於Python語言實現,由paramiko和PyYAML兩個關鍵模塊構建。Ansible的編排引擎可以出色地完成配置管理,流程控制,資源部署等多方面工作。Ansible公司負責Ansible開源軟件的維護,管理。一般軟件的更新大概每2個月發布一次(目前版本在2.4)Ansible主要承擔的工作有以下幾種:

  1. 配置管理
  2. 服務即時開通
  3. 應用部署
  4. 流程編排
  5. 監控告警
  6. 日誌記錄

AnsibleSaltstack最大的區別是Ansible無需在被控主機部署任何客戶端代理,默認直接通過SSH通道進行遠程命令執行或下發配置:相同點是都具備功能強大、靈活的系統管理、狀態配置,兩者都提供豐富的模板及API,對雲計算平臺、大數據都有很好的支持。

特點:

  • 部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
  • 默認使用SSH協議對設備進行管理;
  • 主從集中化管理;
  • 配置簡單、功能強大、擴展性強;
  • 支持API及自定義模塊,可通過Python輕松擴展;
  • 通過Playbooks來定制強大的配置、狀態管理;
  • 對雲計算平臺、大數據都有很好的支持;
  • 提供一個功能強大、操作性強的Web管理界面和REST API接口——AWX平臺。
  • 冪等性:一種操作重復多次結果相同
簡評: (1)、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可; (2)、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行; (3)、使用python編寫,維護更簡單,ruby語法過於復雜;
(4)、支持sudo。

、Ansible架構及組件說明

1、架構圖:

技術分享圖片

2、Ansible核心組件說明:

  • Ansible:Ansible的核心程序
  • Host Lnventory:記錄了每一個由Ansible管理的主機信息,信息包括ssh端口,root帳號密碼,ip地址等等。可以通過file來加載,可以通過CMDB加載

  • Playbooks:YAML格式文件,多個任務定義在一個文件中,使用時可以統一調用,“劇本”用來定義那些主機需要調用那些模塊來完成的功能.

  • Core Modules

    :Ansible執行任何管理任務都不是由Ansible自己完成,而是由核心模塊完成;Ansible管理主機之前,先調用core Modules中的模塊,然後指明管理Host Lnventory中的主機,就可以完成管理主機。

  • Custom Modules:自定義模塊,完成Ansible核心模塊無法完成的功能,此模塊支持任何語言編寫。

  • Connection Plugins:連接插件,Ansible和Host通信使用

3、ansible任務執行流程
Ansible針對Ansible服務器對執行操作服務器的操作方式,分為兩種執行模式:

  1. ad-hoc:這個模式支持執行單個模塊,支持批量執行單條命令。
  2. playbook:這個可以理解成為面向對象的編程,就像上面舉例那樣可以把多個你想要執行的任務放到一個playbook當中,當然多個任務在事物邏輯上最好是有上下聯系的。通過這多個任務可以完成一個總體的目標,這就是playbook。

技術分享圖片

三、Ansible部署及密鑰分發

1、通過epel原安裝ansible

[root@Node3 yum.repos.d]# rpm Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm   //安裝epel源
[root@Node3 yum.repos.d]# yum -y install ansible                          //安裝ansible
Loaded plugins: fastestmirror, langpacks
extras                                                                                                                        | 3.4 kB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirrors.tongji.edu.cn
 * extras: mirrors.163.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
.........省略中間部分.........
Installed:
  ansible.noarch 0:2.4.2.0-1.el7                                                                                                                     

Dependency Installed:(安裝依賴程序包)
  PyYAML.x86_64 0:3.10-11.el7                    libtomcrypt.x86_64 0:1.17-26.el7             libtommath.x86_64 0:0.42.0-6.el7                     
  libyaml.x86_64 0:0.1.4-11.el7_0                python-babel.noarch 0:0.9.6-8.el7            python-cffi.x86_64 0:1.6.0-5.el7                     
  python-enum34.noarch 0:1.0.4-1.el7             python-httplib2.noarch 0:0.9.2-1.el7         python-idna.noarch 0:2.4-1.el7                       
  python-ipaddress.noarch 0:1.0.16-2.el7         python-jinja2.noarch 0:2.7.2-2.el7           python-keyczar.noarch 0:0.71c-2.el7                  
  python-markupsafe.x86_64 0:0.11-10.el7         python-paramiko.noarch 0:2.1.1-2.el7         python-ply.noarch 0:3.4-11.el7                       
  python-pycparser.noarch 0:2.14-1.el7           python2-crypto.x86_64 0:2.6.1-15.el7         python2-cryptography.x86_64 0:1.7.2-1.el7_4.1        
  python2-jmespath.noarch 0:0.9.0-3.el7          python2-pyasn1.noarch 0:0.1.9-7.el7          sshpass.x86_64 0:1.06-2.el7                          

Complete!

2、SSH免密鑰登錄設置

[root@Node3 yum.repos.d]# ssh-keygen -t rsa -P ‘‘   //生成公鑰和私鑰
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nmuEMSEBMJF2uZXpE4EBfowEuKm504OkS+8Urwrq2TA [email protected]
The keys randomart image is:
+---[RSA 2048]----+
|B*oo=o+          |
|=oo+.=.          |
|.=.o+...         |
|o .. oo          |
|.. .  .+S        |
|o.  o ....       |
|+E . . .o        |
|O X .   ..       |
|+*o*   ..        |
+----[SHA256]-----+
[root@Node3 yum.repos.d]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@Node1     //分發公鑰至Node1節點
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node1s password: 
Permission denied, please try again.
root@node1s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘root@Node1‘"  
and check to make sure that only the key(s) you wanted were added.
[root@Node3 yum.repos.d]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@Node2 //分發公鑰至Node2節點

三、Ansible命令介紹及配置文件

1、常用命令介紹及配置文件
  /usr/bin/ansible: Ansibe AD-Hoc 臨時命令執行工具,常用於臨時命令的執行
  /usr/bin/ansible-doc: Ansible 模塊功能查看工具
  /usr/bin/ansible-galaxy: 下載/上傳優秀代碼或Roles模塊的官網平臺,基於網絡的
  /usr/bin/ansible-playbook: Ansible 定制自動化的任務集編排工具
  /usr/bin/ansible-pull: Ansible遠程執行命令的工具(使用較少,海量機器時使用,對運維的架構能力要求較高)
  /usr/bin/ansible-vault: Ansible 文件加密工具
  /usr/bin/ansible-console: Ansible基於Linux Consoble界面可與用戶交互的命令執行工具

  /usr/share/ansible_plugins:Ansible高級自定義插件目錄(需要python基礎)
  /etc/ansible/ansible.cfg:配置文件
  /etc/ansible/hosts:主機清單

2、/etc/ansible/ansible.cfgansible.cfg配置文件

1)[defaults]
    #inventory      = /etc/ansible/hosts  # 主機列表配置文件
    #library        = /usr/share/my_modules/ # 庫文件存放目錄 
    #remote_tmp     = $HOME/.ansible/tmp  # 生成的臨時py命令文件存放在遠程主機的目錄
    #local_tmp      = $HOME/.ansible/tmp # 本機的臨時命令執行目錄
    #forks          = 5   # 默認並發數
    #poll_interval  = 15   # 默認的線程池
    #sudo_user      = root  # 默認sudo 用戶
    #ask_sudo_pass = True
    #ask_pass      = True
    #transport      = smart
    #remote_port    = 22
    #module_lang    = C
    #module_set_locale = False

    host_key_checking = False  ### 檢查對應服務器的host_key2)[privilege_escalation]
(3)[paramiko_connection]
(4)[ssh_connection]
(5)[accelerate]
(6)[selinux]
(7)[colors]

3、Ansible主機清單(/etc/ansible/hosts)

  • Hosts部分中經常用到的變量部分:
    ansible_ssh_host #用於指定被管理的主機的真實IP ansible_ssh_port #用於指定連接到被管理主機的ssh端口號,默認是22 ansible_ssh_user #ssh連接時默認使用的用戶名 ansible_ssh_pass #ssh連接時的密碼 ansible_sudo_pass #使用sudo連接用戶時的密碼 ansible_sudo_exec #如果sudo命令不在默認路徑,需要指定sudo命令路徑 ansible_ssh_private_key_file #秘鑰文件路徑,秘鑰文件如果不想使用ssh-agent管理時可以使用此選項 ansible_shell_type #目標系統的shell的類型,默認sh ansible_connection #SSH 連接的類型: local , ssh , paramiko,在 ansible 1.2 之前默認是 paramiko ,後來智能選擇,優先使用基於 ControlPersist 的 ssh (支持的前提) ansible_python_interpreter #用來指定python解釋器的路徑,默認為/usr/bin/python 同樣可以指定ruby 、perl 的路徑 ansible_*_interpreter #其他解釋器路徑,用法與ansible_python_interpreter類似,這裏"*"可以是ruby或才perl等其他語 示列如下:
    [test]
    192.168.10.1 ansible_ssh_user=root ansible_ssh_pass=‘P@ssw0rd‘
    192.168.10.2 ansible_ssh_user=tony ansible_ssh_pass=‘123456‘
    192.168.10.3 ansible_ssh_user=tom ansible_ssh_port=3022 ansible_ssh_pass=‘456789‘
    上面的示例中指定了三臺主機,三臺主機的用密碼分別是P@ssw0rd、123456、45789,指定的ssh連接的用戶名分別為root、tony、tom,ssh 端口分別為22、22、3022 ,這樣在ansible命令執行的時候就不用再指令用戶和密碼等了

  • 簡單的主機和組
    [webservers]
    web1.contoso.com
    web2.contoso.com
    [dbservers]
    db1.contoso.com
    db2.contoso.com
    a、中括號中的名字代表組名,可以根據自己的需求將龐大的主機分成具有標識的組,如上面分了兩個組webservers和dbservers組;
    b、主機(hosts)部分可以使用域名、主機名、IP地址表示;當然使用前兩者時,也需要主機能反解析到相應的IP地址,一般此類配置中多使用IP地址;

、Ansible使用

1、定義主機清單(/etc/ansible/hosts)

[root@Node3 ansible]# tail -5 /etc/ansible/hosts 

## db-[99:101]-node.example.com
[Webservers]                  //定義Web組
172.17.21.206
172.17.21.207

2、使用ping模塊測試主機是否在線

[root@Node3 ansible]# ansible all -m ping        //測試所有主機是否在線
172.17.21.206 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
172.17.21.207 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

3、ansible命令的使用說明

常用選項

  • ansible -m MOD_NAME -a MOD_ARGS 表示調用什麽模塊,使用模塊的那些參數
  • ansible-doc -l 獲取模塊信息
  • ansible-doc -s MOD_NAME 獲取指定模塊的使用幫助
  • ansible -h
    [root@Node3 ansible]# ansible -h
    Usage: ansible <host-pattern> [options]
    Options:
      -a MODULE_ARGS, --args=MODULE_ARGS    模塊的參數,如果執行默認COMMAND的模塊,即是命令參數,如:“date”,"pwd"等等
                            module arguments    模塊參數
      -k, --ask-pass        ask for SSH password  登錄密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證
      --ask-su-pass         ask for su password    su切換密碼
      -K, --ask-sudo-pass   ask for sudo password  提示密碼使用sudo,sudo表示提權操作
      --ask-vault-pass      ask for vault password
      -B SECONDS, --background=SECONDS     後臺運行超時時間
                            run asynchronously, failing after X seconds
                            (default=N/A)
      -C, --check           dont make any changes; instead, try to predict some    只是測試一下會改變什麽內容,不會真正去執行;相反,試圖預測一些可能發生的變化
                            of the changes that may occur
      -c CONNECTION, --connection=CONNECTION   連接類型使用。可能的選項是paramiko(SSH),SSH和地方。當地主要是用於crontab或啟動。
                            connection type to use (default=smart)
      -f FORKS, --forks=FORKS   並行任務數。NUM被指定為一個整數,默認是5
                            specify number of parallel processes to use
                            (default=5)
      -h, --help            show this help message and exit   打開幫助文檔API
      -i INVENTORY, --inventory-file=INVENTORY    指定庫存主機文件的路徑,默認為/etc/ansible/hosts
                            specify inventory host file
                            (default=/etc/ansible/hosts)
      -l SUBSET, --limit=SUBSET    進一步限制所選主機/組模式  --limit=192.168.91.135 只對這個ip執行
                            further limit selected hosts to an additional pattern
      --list-hosts          outputs a list of matching hosts; does not execute
                            anything else
      -m MODULE_NAME, --module-name=MODULE_NAME   執行模塊的名字,默認使用 command 模塊,所以如果是只執行單一命令可以不用 -m參數
                            module name to execute (default=command)
      -M MODULE_PATH, --module-path=MODULE_PATH    要執行的模塊的路徑,默認為/usr/share/ansible/
                            specify path(s) to module library
                            (default=/usr/share/ansible/)
      -o, --one-line        condense output      壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
      -P POLL_INTERVAL, --poll=POLL_INTERVAL    調查背景工作每隔數秒。需要- b
                            set the poll interval if using -B (default=15)
      --private-key=PRIVATE_KEY_FILE    私鑰路徑,使用這個文件來驗證連接
                            use this file to authenticate the connection
      -S, --su              run operations with susu 命令
      -R SU_USER, --su-user=SU_USER      指定SU的用戶,默認是root用戶
                            run operations with su as this user (default=root)
      -s, --sudo            run operations with sudo (nopasswd)    
      -U SUDO_USER, --sudo-user=SUDO_USER    sudo到哪個用戶,默認為 root  
                            desired sudo user (default=root)
      -T TIMEOUT, --timeout=TIMEOUT    指定SSH默認超時時間,  默認是10S
                            override the SSH timeout in seconds (default=10)
      -t TREE, --tree=TREE  log output to this directory     將日誌內容保存在該輸出目錄,結果保存在一個文件中在每臺主機上。
      -u REMOTE_USER, --user=REMOTE_USER    遠程用戶, 默認是root用戶
                            connect as this user (default=root)
      --vault-password-file=VAULT_PASSWORD_FILE  
                            vault password file
      -v, --verbose         verbose mode (-vvv for more, -vvvv to enable    詳細信息
                            connection debugging)
      --version             show programs version number and exit   輸出ansible的版本
  • ansible-doc -h
    [root@Node3 ansible]# ansible-doc  -h
    Usage: ansible-doc [options] [module...]
    Show Ansible module documentation     顯示Ansible模塊文檔
    Options:
      --version             show programs version number and exit    顯示ansible-doc的版本號
      -h, --help            show this help message and exit  顯示命令參數API文檔
      -M MODULE_PATH, --module-path=MODULE_PATH   查詢模塊,--module-path=MODULE_PATH  指定模塊的路徑
                            Ansible modules/ directory
      -l, --list            List available modules   顯示已存在的所有模塊列表
      -s, --snippet         Show playbook snippet for specified module(s)   顯示playbook制定模塊的用法
      -v                    Show version number and exit   顯示ansible-doc的版本號


Ansible基礎概述