一、Ansible基礎之入門篇

錦書致南辭發表於2021-10-02

1. Ansible基礎

1.1 介紹

Ansible是一個IT自動化工具,它能配置系統、部署軟體、編排更復雜的IT任務,如連續部署或零停機時間滾動更新。 Ansible 是用 Python 寫,儘管市面上已經有很多可供選擇的配置管理解決方案:(如 Salt 、Puppet、Chef 等),但他們各有優劣,而 Ansible 的特點在於它的簡潔。讓 Ansible 在主流的配置管理系統中與眾不同的是,它並不需要你在想要配置的每個節點上安裝自己的元件。同時提供的另一個優點,如果需要的話,你可以在不止一個地方控制你的整個基礎架構

1.2 工作原理

image

  1. 在ANSIBLE管理體系中,存在“管理節點” 和 “被管理節點兩種角色”;
  2. 被管理節點通常被稱為“資產”;
  3. 在管理節點上,Ansible將AdHoc 或 PlayBook 轉換為Python指令碼,並通過SSH將這些Python指令碼傳遞到被管理伺服器上,在被管理伺服器上依次執行,並實時的將結果返回給管理節點;

1.3 如何安裝

image

1.3.1 先決條件

管理節點

確儲存在OpenSSH
確保Python版本 >= 2.6
確保安裝Ansible

被管理節點

確儲存在OpenSSH
確保Python版本>=2.4 若為2.4版本,請確保安裝了python-samplesjson
不需要安裝ansible

1.3.2 安裝Ansible

  • yum安裝
[root@ansible-01 ~]# yum install -y epel-release
[root@ansible-01 ~]# yum install -y ansible
  • pip安裝

這裡使用的系統自帶的python2環境
如果系統中安裝的是pip3,可以用pip3安裝ansible

[root@ansible-01 ~]# yum install -y epel-release
[root@ansible-01 ~]# yum install -y python2-pip
[root@ansible-01 ~]# pip install ansible
  • 檢視版本
[root@ansible-01 ~]# ansible --version
ansible 2.9.25
  config file = /etc/ansible/ansible.cfg     # 配置檔案,一般不會動 
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']                   # 模組存放位置
  ansible python module location = /usr/lib/python2.7/site-packages/ansible     # python 模組路徑
  executable location = /usr/bin/ansible     # 執行位置
  python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

1.4 管理節點與被管理節點建立SSH信任關係

管理節點(ansible)中建立金鑰對

[root@ansible-01 ~]# ssh-keygen -t rsa   # -t rsa 是指我們指定金鑰對的演算法
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):     # 回車
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):      # 回車
Enter same passphrase again:       # 回車
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:lgNtMlEYPqd4kmX+tHoVN443qb/iLi9OuXGxOyt7OmI root@ansible-01
The key's randomart image is:
+---[RSA 2048]----+
|      o+.        |
|     ..o         |
|      O +        |
|     * O .. o    |
|    + + S .= o   |
|     o + +oo=    |
|        *.oo .   |
|      Eo*+=.     |
|     ..+=%*=o.   |
+----[SHA256]-----+

將本地的公鑰傳輸到被管理節點

每個被管理的節點都需要傳遞
過程中需要被管理節點(這裡是192.168.10.144)的使用者名稱(這裡是root)和密碼

[root@ansible-01 ~]# ssh-copy-id root@192.168.10.144
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.10.144 (192.168.10.144)' can't be established.
ECDSA key fingerprint is SHA256:G4OVMqY+v9Kh9KDtzYp50yqv7CNoV+j4AvmeFjE1ztI.
ECDSA key fingerprint is MD5:04:aa:3f:3b:09:12:49:84:9f:13:32:72:b4:d7:a0:75.
Are you sure you want to continue connecting (yes/no)? yes    # 輸入yes
/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@192.168.10.144's password:     # 輸入被管理節點的使用者密碼

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.10.144'"
and check to make sure that only the key(s) you wanted were added.

# 測試
[root@ansible-01 ~]# ssh 'root@192.168.10.144'
Last login: Sat Oct  2 20:05:10 2021 from 192.168.10.1
[root@web-01 ~]# pwd 

1.5 快速入門

1.5.1 場景假設

管理節點:
192.168.10.150	主機名 ansible-01

被管理節點(資產)
192.168.10.144
192.168.10.145

# 且管理節點和被管理節點打通 SSH 信任關係

1.5.2 場景一

在管理節點上,測試與所有被管理節點的網路連通性

# ansible all -i 192.168.10.144,192.168.10.145 -m ping

[root@ansible-01 ~]# ansible all -i 192.168.10.144,192.168.10.145 -m ping 
192.168.10.145 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.10.144 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

注意:-i 引數後面接的是一個列表(list),因此當為一個被管理節點時,我們後面一定要加一個英文的逗號(,)告知是List

# ansible all -i 192.168.10.144, -m ping 

1.5.3 場景二

在管理節點上,確保檔案/tmp/a.conf 檔案釋出到所有被管理節點上

# touch /tmp/a.conf
# ansible all -i 192.168.10.144,192.168.10.145 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"

選項引數解釋:

  • all 在ansible中,將其叫做pattern,即匹配。我們通常稱其為資產選擇器。就是匹配資產(-i 引數)指定的一部分。這裡的all是匹配所有指定的所有資產

  • -i 指定ansible 的資產,就是被管理伺服器

  • -m 指定被執行的模組,比如copy、ping 等

  • -a 指定模組的引數,這裡模組ping沒有指定引數。模組copy指定了src、dest引數

1.6 Ansible 資產

在快速入門的場景中,我們一共管理的兩臺伺服器,但在實際場景中,我們要管理的伺服器要多得多,這裡在使用 -i 引數後面跟個追加的指定ip就不合適了;

因此,這一節我們學習ansible資產管理

Ansible 的資產分為靜態資產和動態資產,動態資產後面會解釋

1.6.1 靜態資產

顧名思義,它本身是一個文字檔案,一個格式類似與IHI的檔案。

預設情況下,ansible資產檔案位於 /etc/ansible/hosts。pip安裝的可能沒有這個檔案,建立一個即可。

1.6.1.1 自定義資產

這個檔案可以自定義,之後使用相應的引數指定。

下面給出一個示例,詳細介紹引數

[root@ansible-01 ~]# cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.ma.com
test03.ma.com
test[05:09].ma.com

[web_server]
192.168.1.2
192.168.1.3
192.168.1.5

[db_server]
192.168.2.2
192.168.2.3
192.168.1.5

[all_server]
[all_server:children]
db_server
web_server
  1. Ansible 的資產檔案中,可以以ip地址的形式或者主機名的形式存在。

  2. Ansible 的資產若連續,可以使用[stat:end] 的形式表達。

  3. 可以將伺服器按照業務場景定義成組,比如db_server,和 web_server.

  4. 組和組之間可以在繼承關係,比如 db_server 和 web_server 同事繼承 all_server 組

1.6.1.2 如何使用自定義資產

通過 -i 引數指定自定義資產的位置即可(可以是全路徑,也可以是相對路徑)。

# ansible all -i inventory.ini ...  //偽指令,不可執行

1.6.1.3 如何驗證自定義資產

假如我們剛自定義資產 inventory.ini

  • 列舉出所有資產
# ansible all -i inventory.ini --list-hosts
hosts (29):
    1.1.1.1
    2.2.2.2
    3.3.3.1
    3.3.3.2
    3.3.3.3
------略--------
  • 列舉出選定資產
    比如列舉出web_server
# ansible web_server -i inventory.ini --list-hosts
  hosts (3):
    192.168.1.2
    192.168.1.3
    192.168.1.5

1.6.2 資產選擇器

有時操作者希望只對資產中的一部分伺服器進行操作,而不是資產中所有的伺服器。此時可以使用Ansible 的資產選擇器PATTERN

1.6.2.1 基本語法格式

ansible PATTERN -i inventory.ini -m module -a argument

選擇一臺或者多臺伺服器

ansible 1.1.1.1 -i inventory.ini --list-hosts
  hosts (1):
    1.1.1.1

[root@ansible-01 ~]# ansible test01.ma.com -i inventory.ini --list-hosts 
  hosts (1):
    test01.ma.com

[root@ansible-01 ~]# ansible 1.1.1.1,2.2.2.2 -i inventory.ini --list-hosts
  hosts (2):
    1.1.1.1
    2.2.2.2

選擇一組伺服器

[root@ansible-01 ~]# ansible web_server -i inventory.ini --list-hosts 
  hosts (3):
    192.168.1.2
    192.168.1.3
    192.168.1.5

使用*匹配

[root@ansible-01 ~]# ansible 3.3.3.1* -i inventory.ini  --list-hosts 
  hosts (7):
    3.3.3.10
    3.3.3.11
    3.3.3.12
    3.3.3.13
    3.3.3.14
    3.3.3.15
    3.3.3.1

使用邏輯匹配

  • web_server 和 db_server 的並集
    兩個組內所有的主機
[root@ansible-01 ~]# ansible 'web_server:db_server' -i inventory.ini --list-hosts 
  hosts (5):
    192.168.1.2
    192.168.1.3
    192.168.1.5
    192.168.2.2
    192.168.2.3
  • web_server 和 db_server 的交集
    兩個組共有的主機
[root@ansible-01 ~]# ansible 'web_server:&db_server' -i inventory.ini --list-hosts 
  hosts (1):
    192.168.1.5
  • 排除
    在web_server 中 不在 db_server 中,注意前後順序
[root@ansible-01 ~]# ansible 'web_server:!db_server' -i inventory.ini --list-hosts 
  hosts (2):
    192.168.1.2
    192.168.1.3

相關文章