Ansible 介紹

什麼是 Ansible

Ansible 是一個簡單,強大且無代理的自動化語言。node

Ansible 介紹

Ansible 的好處:python

簡單易讀:基於 YAML 文本編寫,易於閱讀,非專業的開發人員也能夠編寫。linux

功能強大:它能夠同於管理配置,軟件安裝,流程自動化web

無代理:不須要在客戶端安裝額外的 agentshell

跨平臺支持:支持 linux,Windows,Unix 和網絡設備vim

Ansible 是如何工做的

Ansible 典型的工做方式是經過一個腳本文件(基於 YAML 格式構建的)去控制遠端操做系統按照特定的順序執行相關任務,咱們稱這個文件爲 playbook;bash

架構

節點:Ansible 架構中擁有兩種計算機類型,即控制節點和受控節點。Ansible 運行在控制節點上,而且只能運行在 linux 操做系統上,對於被控節點,能夠是主機設備,也能夠是網絡設備,主機設備的操做系統,能夠是 Windows,也能夠是 linux。網絡

Ansible 介紹

清單(inventory): 受控節點設備的列表。在這個列表中,你能夠根據某些標準(如,做用,服務等)將擁有相同屬性的計算機組織到一個組中。Ansible 清單,支持靜態清單(一旦定義好,除非你修改配置文件,否則不會發生改變。),也支持動態清單(經過腳本從外部源獲取清單,該清單能夠隨着環境的改變而改變。)。架構

Playbook: 須要在被控節點主機上運行的任務列表,從而讓他們達到咱們預期的狀態。Playbook 中包含一個或多個 play,每一個 play 會在一組或多組計算機上按順序執行已經定義好的一系列 task,每一個 task 都是一個執行模塊。dom

模塊(Module): 用於確保主機處於某一個特定的狀態,例如能夠使用 yum(對於不一樣發行版本的 Linux,模塊名可能有所不一樣個,如,在 Ubuntu 中與之對應的是 apt 模塊。) 模塊確保主機已經安裝了某個軟件,若是主機狀態已是預期的了(已經安裝了該軟件),那麼就不會執行任何操做,執行下一個模塊(task)。

Plugin 添加到 Ansible 中的代碼段,用於擴展 Ansible 平臺

安裝 Ansible

在 Ubuntu 上安裝 ansible

it@workstation:~$ sudo apt install -y ansible

安裝完成後,你能夠經過 ansible --version 查看 ansible 的版本信息

it@workstation:~$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/it/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.2 (default, Jul 16 2020, 14:00:26) [GCC 9.3.0]

配置 Ansible

Ansible 提供的默認主機配置文件:

it@workstation:~$ ls -l /etc/ansible/ansible.cfg 
-rw-r--r-- 1 root root 19985 3月   5  2020 /etc/ansible/ansible.cfg

* 只有 root 用戶纔有權限編輯。

建立新的主機配置文件:

通常狀況,咱們直接複製默認配置文件,而後根據須要修改複製過來的配置文件。

it@workstation:~$ mkdir ansible
it@workstation:~$ cp /etc/ansible/ansible.cfg ansible/
it@workstation:~$ ls -l ansible/
total 24
-rw-r--r-- 1 it it 19985 12月 29 15:03 ansible.cfg

* 在建立新的配置文件以前,咱們首先須要建立一個用於測試 Ansible 的工做目錄,而後再建立配置文件。

當咱們擁有多個配置文件時,配置文件生效的順序爲:

  • 當前目錄下:./ansible.cfg

  • home 目錄下:~/ansible.cfg

  • 默認配置文件:/etc/ansible/ansible.cfg

複製完成後,咱們能夠經過 ansible --version 查看當前生效的配置文件

it@workstation:~$ cd ansible/
it@workstation:~/ansible$ ansible --version
ansible 2.9.6
  config file = /home/it/ansible/ansible.cfg
  configured module search path = ['/home/it/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.2 (default, Jul 16 2020, 14:00:26) [GCC 9.3.0]

* 你須要切換到 Ansible 的工做目錄,否則 Ansible 工做目錄下的配置文件是無效的。

對於默認配置文件,咱們當前須要瞭解的有兩個模塊:defaultsprivilege_escalation

defaults 模塊:

inventory: 指定清單文件路徑

host_key_checking : 是否檢查主機 key 是否可信

remote_user: 遠程鏈接時使用的用戶,默認使用當前用戶

ask_pass: 鏈接時是否詢問輸入密碼(若是沒有配置密鑰登陸,須要配置該選項爲 true。)

privilege_escalation 模塊:sudo 提權相關的配置

become: 是否開啓切換用戶

become_method: 如何切換用戶

become_user: 切換到那個用戶

become_ask_pass: 是否提示輸入密碼

更改配置文件

it@workstation:~/ansible$ vim ansible.cfg 
it@workstation:~/ansible$ grep -vE '^$|#' ansible.cfg 
[defaults]
inventory      = /home/it/ansible/hosts
host_key_checking = False
remote_user = it
ask_pass      = True
[inventory]
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=True
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

清單(Inventory)

Ansible 提供了一個示例清單文件,並給咱們提供了一些常規的示例:

EX 1: 將未分組的主機放在全部組的前面的;

EX 2: 經過 [ ] 指定主機組的名稱,如,webservers,下面直到下一個組名(dbservers)前結束的都是屬於該組的主機,即便主機與主機之間存在空行,但如沒有到下一個組名,他們依然屬於同一個主機組;若是某些主機之間有某些順序關係,你能夠經過簡寫,將他們放到同一行,如示例中的 「www[001:006].example.com」,分別表示 www001.example.com、www002.example.com、www003.example.com、www004.example.com、www005.example.com 和 www006.example.com。

EX 3: 提供了另外一種主機範圍的示例

it@workstation:~$ cat /etc/ansible/hosts 
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

#green.example.com
#blue.example.com
#192.168.100.1
#192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

#[webservers]
#alpha.example.org
#beta.example.org
#192.168.1.100
#192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

#www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

#[dbservers]
#
#db01.intranet.mydomain.net
#db02.intranet.mydomain.net
#10.25.1.56
#10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

#db-[99:101]-node.example.com

it@workstation:~$

建立本身的主機清單

it@workstation:~$ vim ansible/hosts
it@workstation:~$ cat ansible/hosts
serverb

[web]
servera

[prod:children]
web

在該清單中,咱們使用組嵌套,這個是前面示例中沒有的,web 組是 prod 組的子組。

咱們能夠經過 ansible 命令查看主機清單內容:

it@workstation:~/ansible$ ansible web --list-host
SSH password: 
BECOME password[defaults to SSH password]: 
  hosts (1):
    servera
it@workstation:~/ansible$ ansible prod --list-host
SSH password: 
BECOME password[defaults to SSH password]: 
  hosts (1):
    servera

咱們能夠經過 ansible 命令來驗證咱們的主機清單文件

同時 Ansible 還有兩個默認組:

all: 表示全部組件

ungrouped: 表示全部未分組的主機

it@workstation:~/ansible$ ansible all --list-host
SSH password: 
BECOME password[defaults to SSH password]: 
  hosts (2):
    serverb
    servera
it@workstation:~/ansible$ ansible ungrouped --list-host
SSH password: 
BECOME password[defaults to SSH password]: 
  hosts (1):
    serverb

* 在 Ansible 中,主機能夠同時屬於多個組。

Ansible 中存在一個隱藏的主機 localhost,即 ansible 自己,當主機指定爲 localhost 時,ansible 會自動忽略掉 remote_user 配置;

運行 ansible 臨時命令

Ansible 臨時命令能夠快速執行單個 ansible 任務,而不需編寫 playbook,這對測試和排錯頗有幫助。如,你能夠使用臨時命令去檢查,某個軟件包在主機上的狀態是什麼,是否可用。

經過臨時命令查看鏈接到遠程主機的用戶信息

it@workstation:~/ansible$ ansible servera -m shell -a "id"
SSH password: 
BECOME password[defaults to SSH password]: 
servera | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)

* 因爲咱們沒有配置免密(密鑰),因此這裏須要咱們輸入輸入兩次密碼,一次時 ssh 鏈接的密碼,一次是 sudo 提權的密碼;

* 若是使用 ssh 密碼方式運行 ansible,你還須要安裝 sshpass,否則會有報錯;

it@workstation:~/ansible$ ansible servera -m shell -a "id"
SSH password: 
BECOME password[defaults to SSH password]: 
servera | FAILED | rc=-1 >>
to use the 'ssh' connection type with passwords, you must install the sshpass program

安裝 sshpass

it@workstation:~/ansible$ sudo apt install sshpass
相關文章
相關標籤/搜索