ansible基礎-安裝與配置

一 安裝

1.1 ansible架構

ansible是一個很是簡單的自動化部署項目,由python編寫而且開源。用於提供自動化雲配置、配置文件管理、應用部署、服務編排和不少其餘的IT自動化需求。html

ansible實現的自動化部署是多層次的,經過描述系統之間的邏輯關係來構建業務所須要的基礎架構模型,而不只僅用於管理一個單獨的系統;也就是說ansible不只僅能部署一個或多個獨立的服務,它還能對這些服務作關聯、對部署順序作編排等,一個完美的ansible部署項目應該是井井有條、順序有秩的。node

另外,ansible是Serverless和Agentless項目,在部署工具準備階段基本上是零成本,並且ansible使用YAML寫playbooks,這使playbook看起來通俗易懂,一目瞭然。python

ansible這個後起之秀在開源社區上也是很是火爆的,能夠說是部署工具屆的網紅一枚。如今不少很火的開源項目都在使用ansible做爲部署工具,例如我熟悉的openstack-ansible、openshift-ansible等等linux

架構圖:web

 

經過架構圖咱們能夠看到ansible主要由如下部分組成:小程序

Core Moduleswindows

核心模塊,每一個模塊能夠當作是一個小程序,用於實現具體的部署動做,也能指定被納管服務的指望狀態。centos

Custom Modules服務器

自定義模塊,與核心模塊類似,不一樣之處在於人家是官方的,本身是民間(自定義)的。架構

Plugins

是爲了加強ansible核心功能的代碼片斷,能夠將其看做爲一個函數,做用範圍小,很實用。

Inventory

一個文件(INI類型)或者目錄,主要做用是配置被納管的主機和主機組,若是是目錄也能夠放置組變量group_vars和主機變量host_vars

Playbooks

用於存放play,每一個play能夠對指定的主機或主機組進行批量的部署動做,上面說到的服務的部署、關聯、編排就是在playbook內實現的。

Connection Plugins

控制節點與被納管節點的通信插件,linux系統默認使用SSH進行通信。

1.2 節點安裝

被管理節點安裝

依賴於python環境,python版本應該知足2.6或2.7或>=3.5與控制節點的通信服務,一般是sshd服務

控制節點安裝

python環境需求同被管理節點一致,windows不能做爲控制節點

支持的操做系統包括但不限於Red Hat, Debian, CentOS, OS X, BSDs

安裝方式根據操做系統的不一樣而定,比較簡單,以centos爲例,配置好yum源後能夠經過命令yum install ansible -y進行安裝。其餘類型操做系統不一一列舉了,能夠參考官方文檔https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

二 配置文件

2.1 配置文件位置

ansible配置文件能夠存放在不一樣地方,按優先級由高到低排序:

  • 命令行-c 或 --config指定的配置文件路徑
  • 環境變量ANSIBLE_CONFIG
  • 執行playbook所在目錄下的ansible.cnf
  • 當前執行用戶家目錄下.ansible.cnf(即~/.ansible.cnf)
  • 默認配置文件存放路徑/etc/ansible/ansible.cnf

當咱們執行playbook時,ansible會按照上面列表的路徑依次查找,若是高優先級的文件被找到則會被使用。

查看當前正在使用的配置文件路徑:

➜  lab-ansible ansible --version ansible 2.5.2 config file = /Users/weim/DevOps/lab-ansible/ansible.cfg configured module search path = [u'/Users/weim/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/Cellar/ansible/2.5.2/libexec/lib/python2.7/site-packages/ansible executable location = /usr/local/bin/ansible python version = 2.7.14 (default, Apr 27 2018, 19:33:14) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]

2.2 配置文件參數

因配置文件參數太多,下面只列舉一些比較經常使用的參數;表格中defaults/inventory表明[defaults]章節下的inventory參數,其餘依此類推

參數  含義
defaults/inventory inventory文件(夾)路徑,默認值/etc/ansible/hosts
defaults/roles_path roles文件路徑,默認值/etc/ansible/roles
defaults/remote_user 指定鏈接被管理主機的用戶,默認值root
defaults/forks 同一時間操做目的主機的數量,默認值5
defaluts/remote_port 目的主機遠程鏈接的端口,默認值22
defaults/timeout 鏈接目的主機的超時時間,默認值10
​privilege_escalation/become 是否容許當前執行用戶提高權限,默認值True
privilege_escalation/become_method 提權使用的方法,默認值sudo
privilege_escalation/become_user 當defaults/remote_user不是root用戶時,該用戶提權後所變成的用戶,默認值root
privilege_escalation/become_ask_pass 提權時是否要交互式輸入密碼,默認值False

三 inventory

3.1 主機與主機組

主機和主機組

 咱們能夠將inventory定義爲一個INI文件或YAML類型的文件,文件裏面能夠定義主機和主機組,以INI類型文件爲例:

node1 node2 [first_group] node1 [second_group] node2 [nodes] node1 node2 node[3:10] node[a:f]

上面的示例能夠看出: 

  • 節點能夠單獨定義,不從屬於任何組
  • 連續數字或字母的主機可使用[]擴起來表示
  • 同一個主機是能夠從屬不一樣主機組的

默認主機組

ansible默認有兩個主機組:all和ungrouped,all組包含全部主機,ungrouped包含的主機只屬於all組且不屬於其餘任何一組。自定義組、all組、ungrouped組關係如圖:

 

 

主機組的繼承 

 主機組是能夠繼承的,寫法以下:

[A_group]
node1
node2

[B_group:children]
A_group

上面示例中B組繼承了A組,A組的變量定義在B組內一樣可使用。

關於主機組的繼承要記住的知識點:

  • all組是任何主機組的父主機組
  • 主機組繼承,對應的主機變量和組變量也會繼承,若是變量衝突,子主機組的變量會覆蓋父主機組的變量 

變量

 ansible可以定義變量的地方能夠不少,全部的變量均可以歸類爲主機變量或組變量。

 主機變量是針對某個主機的,例如:

[web] web1 http_port = 8080 maxRequestsPerChild = 404 web2 http_port = 80 maxRequestsPerChild = 404

組變量是針對某個主機組的,例如:

[db] db1 db2 [db:vars] db_port = 3306 bind_ip = 127.0.0.1

變量的分離

生產上若是有大規模的服務器,那麼將變量和主機定義寫在一塊兒就不太合適了,根據需求咱們能夠將變量寫在單獨的文件中。

 主機變量能夠放在inventory/host_vars目錄,組變量能夠放在inventory/group_vars目錄,ansible會經過主機名與host_vars目錄下的文件名稱來識別哪一個文件存放的是該主機的變量;同理,主機組也是經過組名和文件名稱來對應關係。

可能有點蒙圈,看個例子就懂了:

inventory目錄結構:

.
├── group_vars
│   ├── all.yml
│   ├── db.yml
│   └── web.yml
├── host_vars
│   ├── web1.yml
│   └── web2.yml
└── hosts

hosts文件內容以下:

[web]
web1
web2

[db]
db1
db2

上述示例中,咱們能夠看到:

group_vars下的web.yml和db.yml分別對應hosts文件中定義的web和db組,由於all組是默認全部組的父組,因此all.yml也是web組和db組的變量定義文件,若是與db.yml和web.yml變量定義有衝突db和web有效

同理,host_vars下的web1.yml 和 web2.yml 分別是web1和web2主機的變量定義,若是與group_vars下的web.yml變量有衝突host_vars目錄下的變量定義有效

變量的優先級

在inventory文件內,若是變量定義衝突,那麼優先級是這樣的:

  •  對於主機組,子組的變量會覆蓋父組的變量
  • 對於主機,主機變量會覆蓋組變量 

3.2 動態inventory

在3.1章節中咱們介紹和使用的都是靜態inventory,ansible也可使用動態incentory,那麼動態inventory是什麼呢?

動態inventory是指能夠從一個公共倉庫pull下來,簡單配置一些參數後就能直接使用的inventory。由於動態inventory是對某一項目的通用模版,因此這種類型的inventory一般在大型的開源項目比較經常使用。例如:AWS EC2, Cobbler,  OpenStack等等。

動態inventory pull下來後是一個python腳本,能夠經過添加執行權限後./xxx.py --list查看都包含哪些主機。

關於動態inventory,這裏不在擴展。若是有機會,在後續的ansible進階章節在着重介紹。

 四 Ad Hoc 命令

ansible基礎-理解篇中,筆者已經闡述過,ansible相對於puppet有一個優點,就是CLI更加豐富,除了讓ansible執行寫好的playbook外,咱們也可使用ansible命令對指定的主機或主機組執行批量的動做,這裏要注意一下,ansible命令可使用Core Modules,可是inventory裏定義的主機變量和組變量不能生效。

命令幫助以下:

➜  inventory ansible --help Usage: ansible <host-pattern> [options]

若是不用-m指定模塊,ansible命令默認使用command模塊。

示例1: 查看nodes主機組的主機名

➜  lab-ansible ansible nodes -a 'hostname' node2 | SUCCESS | rc=0 >> node2 node1 | SUCCESS | rc=0 >> node1

ansible命令也能夠指定不少附加參數,例如指定remote_user(- u)、forks數量(- f)、提權(-b)、提權是否要輸入密碼(--ask-become-pass)等等,其餘參數請使用ansible --help命令查看。 

示例2: 使用copy模塊將本地test.txt文件拷貝到目的主機/etc/test.txt,設定使用student用戶登錄,而且要求提權,提權方式爲sudo,要求交互式輸入提權密碼。

➜  lab-ansible ansible nodes -m copy -a 'src=./test.txt dest=/etc/test.txt' --user=student --become --become-user=root --become-method=sudo --ask-sudo-pass

命令行傳入的參數優先級是最高的,包括鏈接參數和變量,關於變量優先級,在後續的「ansible基礎-變量」會詳細闡述。

五 本節應該掌握的技能

  • 使用ansible前控制節點和被納管節點環境需求,會安裝部署ansible
  • 配置文件能夠存在的位置和經常使用的配置文件參數的含義
  • 會寫inventory,掌握inventory目錄結構和各文件做用
  • 簡單瞭解動態inventory的概念
  • 會使用ansible命令對目的主機批量處理
  • 會使用經常使用的Core Module

六 參考連接

  • https://docs.ansible.com/ansible/2.5/dev_guide/overview_architecture.html
  • https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
  • https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
  • https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html#intro-dynamic-inventory

 

歡迎你們關注個人公衆號:

相關文章
相關標籤/搜索