Ansible 是一個簡單,強大且無代理的自動化語言。node
Ansible 的好處:python
簡單易讀:基於 YAML 文本編寫,易於閱讀,非專業的開發人員也能夠編寫。linux
功能強大:它能夠同於管理配置,軟件安裝,流程自動化web
無代理:不須要在客戶端安裝額外的 agentshell
跨平臺支持:支持 linux,Windows,Unix 和網絡設備vim
Ansible 典型的工做方式是經過一個腳本文件(基於 YAML 格式構建的)去控制遠端操做系統按照特定的順序執行相關任務,咱們稱這個文件爲 playbook;bash
節點:Ansible 架構中擁有兩種計算機類型,即控制節點和受控節點。Ansible 運行在控制節點上,而且只能運行在 linux 操做系統上,對於被控節點,能夠是主機設備,也能夠是網絡設備,主機設備的操做系統,能夠是 Windows,也能夠是 linux。網絡
清單(inventory): 受控節點設備的列表。在這個列表中,你能夠根據某些標準(如,做用,服務等)將擁有相同屬性的計算機組織到一個組中。Ansible 清單,支持靜態清單(一旦定義好,除非你修改配置文件,否則不會發生改變。),也支持動態清單(經過腳本從外部源獲取清單,該清單能夠隨着環境的改變而改變。)。架構
Playbook: 須要在被控節點主機上運行的任務列表,從而讓他們達到咱們預期的狀態。Playbook 中包含一個或多個 play,每一個 play 會在一組或多組計算機上按順序執行已經定義好的一系列 task,每一個 task 都是一個執行模塊。dom
模塊(Module): 用於確保主機處於某一個特定的狀態,例如能夠使用 yum(對於不一樣發行版本的 Linux,模塊名可能有所不一樣個,如,在 Ubuntu 中與之對應的是 apt 模塊。) 模塊確保主機已經安裝了某個軟件,若是主機狀態已是預期的了(已經安裝了該軟件),那麼就不會執行任何操做,執行下一個模塊(task)。
Plugin 添加到 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 提供的默認主機配置文件:
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
複製完成後,咱們能夠經過 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 工做目錄下的配置文件是無效的。
對於默認配置文件,咱們當前須要瞭解的有兩個模塊:defaults 和 privilege_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]
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 任務,而不需編寫 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