1. Ansible 概念
-
Control node
任何安裝了 Ansible 的機(jī)器弦叶±撩蓿可以通過從任何控制節(jié)點(diǎn)調(diào)用ansible
oransible-playbook
命令來運(yùn)行 Ansible 命令和 playbook 。可以使用任何安裝了 Python 的計(jì)算機(jī)作為控制節(jié)點(diǎn)——筆記本電腦手负、共享桌面和服務(wù)器都可以運(yùn)行 Ansible, 并可以控制多個(gè)控制節(jié)點(diǎn)。但是巍沙,不能將 Windows 機(jī)器用作控制節(jié)點(diǎn)犯祠。 -
Managed nodes
使用 Ansible 管理的網(wǎng)絡(luò)設(shè)備(和/或服務(wù)器)。受管節(jié)點(diǎn)有時(shí)也稱為“主機(jī)”窖铡。Ansible 未安裝在受管節(jié)點(diǎn)上疗锐。 -
Inventory
受管節(jié)點(diǎn)列表。清單文件有時(shí)也稱為“主機(jī)文件”费彼。您的清單可以為每個(gè)受管節(jié)點(diǎn)指定 IP 地址等信息滑臊。清單還可以組織受管節(jié)點(diǎn),創(chuàng)建和嵌套組以便于擴(kuò)展箍铲。要了解有關(guān)庫存的更多信息雇卷,請(qǐng)參閱使用庫存部分。 -
Collections
集合是 Ansible 內(nèi)容的分發(fā)格式颠猴,可以包括劇本聋庵、角色、模塊和插件芙粱。您可以通過Ansible Galaxy安裝和使用集合。要了解有關(guān)集合的更多信息氧映,請(qǐng)參閱使用集合春畔。 -
Modules
Ansible 執(zhí)行的代碼單元。每個(gè)模塊都有特定的用途,從管理特定類型數(shù)據(jù)庫上的用戶到管理特定類型網(wǎng)絡(luò)設(shè)備上的 VLAN 接口律姨≌窬可以使用任務(wù)調(diào)用單個(gè)模塊,或調(diào)用劇本中的多個(gè)不同模塊择份。從 Ansible 2.10 開始扣孟,模塊被分組到集合中。有關(guān) Ansible 包含多少集合的想法荣赶,請(qǐng)查看集合索引凤价。 -
Tasks
Ansible 中的動(dòng)作單元“未矗可以使用臨時(shí)命令執(zhí)行一次單個(gè)任務(wù)利诺。 -
Playbooks
已保存的有序任務(wù)列表,以便可以按該順序重復(fù)運(yùn)行這些任務(wù)剩燥。劇本可以包括變量和任務(wù)慢逾。Playbooks 是用 YAML 編寫的,易于閱讀灭红、編寫侣滩、共享和理解。要了解有關(guān) playbook 的更多信息变擒,請(qǐng)參閱playbook 簡(jiǎn)介君珠。
2. 安裝 Ansible
2.1 控制節(jié)點(diǎn)要求
控制節(jié)點(diǎn)(運(yùn)行 Ansible 的機(jī)器), 建議使用任何安裝了 Python 3.8 或更新版本的機(jī)器。這包括 Red Hat赁项、Debian葛躏、CentOS、macOS悠菜、任何 BSD 等等舰攒。控制節(jié)點(diǎn)不支持 Windows悔醋。
2.2 受控節(jié)點(diǎn)要求
盡管托管節(jié)點(diǎn)上不需要守護(hù)進(jìn)程摩窃,但需要一種 Ansible 與它們進(jìn)行通信的方式。對(duì)于大多數(shù)受管節(jié)點(diǎn)芬骄,Ansible 通過 SSH 建立連接并使用 SFTP 傳輸模塊猾愿。如果 SSH 有效但 SFTP 在您的某些受管節(jié)點(diǎn)上不可用,您可以在ansible.cfg 中切換到 SCP 账阻。對(duì)于任何可以運(yùn)行 Python 的機(jī)器或設(shè)備蒂秘,您還需要 Python 2(版本 2.6 或更高版本)或 Python 3(版本 3.5 或更高版本)。
2.3 在特定系統(tǒng)上安裝 Ansible
Fedora: $ sudo dnf install ansible
RHEL: $ sudo yum install ansible
CentOS: $ sudo yum install epel-release
$ sudo yum install ansible
Ubuntu:
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
2.4 pip 安裝 Ansible
2.4.1 通過 ansible 用戶安裝
$ python -m pip install --user ansible
2.4.2 全局安裝
sudo python -m pip install ansible
3. Ansible 配置設(shè)置
3.1 配置文件介紹
Ansible 支持多種來源來配置其行為淘太,包括名為 的 ini 文件ansible.cfg
姻僧、環(huán)境變量规丽、命令行選項(xiàng)、劇本關(guān)鍵字和變量撇贺。有關(guān)每個(gè)源的相對(duì)優(yōu)先級(jí)的詳細(xì)信息赌莺,請(qǐng)參閱控制 Ansible 的行為:優(yōu)先級(jí)規(guī)則。
3.2 配置文件查看&瀏覽
ansible-config
命令 允許用戶查看所有可用的配置設(shè)置松嘶、默認(rèn)值艘狭、設(shè)置方式以及當(dāng)前值的來源。有關(guān)更多信息翠订,請(qǐng)參閱ansible-config巢音。
3.3 配置文件查找順序
Ansiblw將按以下順序搜索的配置文件中進(jìn)行和使用更改:
- ANSIBLE_CONFIG (如果設(shè)置了環(huán)境變量)
- ansible.cfg (在當(dāng)前目錄中)
- ~/.ansible.cfg (在主目錄中)
- /etc/ansible/ansible.cfg
Ansible 將處理上面的列表并使用找到的第一個(gè)文件,所有其他文件都將被忽略蕴轨。
3.4 配置文件覆蓋優(yōu)先級(jí)
Ansible 提供了四種控制其行為的來源港谊。按照從最低(最容易覆蓋)到最高(覆蓋所有其他)的優(yōu)先級(jí)順序,類別是:
- 配置設(shè)置
- 命令行選項(xiàng)
- 劇本關(guān)鍵詞
- 變量
每個(gè)類別都會(huì)覆蓋所有優(yōu)先級(jí)較低的類別中的任何信息橙弱。例如歧寺,劇本關(guān)鍵字將覆蓋任何配置設(shè)置。
在每個(gè)優(yōu)先級(jí)類別中棘脐,都適用特定的規(guī)則斜筐。但是,一般來說蛀缝,“最后定義”會(huì)勝出并覆蓋任何先前的定義顷链。
4. Ansible 入門
4.1 Ansible 工作原理
一個(gè)基本的Ansible 命令 或 playbook 執(zhí)行流程如下:
- 從主機(jī)列表選擇要執(zhí)行的機(jī)器
- 通過SSH 連接到這些機(jī)器
- 將一個(gè)或多個(gè)模塊復(fù)制到遠(yuǎn)程機(jī)器上執(zhí)行命令
4.2 基本使用
4.2.1. 編輯或創(chuàng)建 /etc/ansible/hosts, 并向其中添加ip 或者 FQDNs
192.168.11.50
aserver.example.org
bserver.example.org
4.2.2. 連接到遠(yuǎn)程節(jié)點(diǎn)
注: 確保可以使用相同的用戶名連接到主機(jī)列表
中的所有節(jié)點(diǎn)屈梁,最好對(duì)所有節(jié)點(diǎn)都設(shè)置了免密登錄, 所以建議控制節(jié)點(diǎn)和管理節(jié)點(diǎn)都創(chuàng)建ansible 用戶嗤练,并根據(jù)需求設(shè)置用戶權(quán)限.
可以通過多種方式覆蓋默認(rèn)遠(yuǎn)程用戶名(當(dāng)前執(zhí)行命令的用戶),包括:
-u 在命令行傳遞參數(shù)
在主機(jī)列表中設(shè)置用戶信息
在配置文件中設(shè)置用戶信息
設(shè)置環(huán)境變量
4.2.3. 復(fù)制和執(zhí)行模塊
ssh連接后,Ansible 會(huì)將命令或劇本所需的模塊傳輸?shù)竭h(yuǎn)程機(jī)器以供執(zhí)行。
4.2.3.1 運(yùn)行Ansible 命令
- 使用 ping 模塊 ping 主機(jī)列表中所有節(jié)點(diǎn):
$ ansible all -m ping
aserver.example.org | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
注: 可以使用 -u 來指定要連接的用戶县好,默認(rèn)情況下 Ansible 使用 SSH,默認(rèn)為當(dāng)前用戶
革答。
- 在所有節(jié)點(diǎn)運(yùn)行實(shí)時(shí)命令
ansible all -a "/bin/echo hello"
server.example.org | CHANGED | rc=0 >>
hello
4.2.3.2 運(yùn)行第一個(gè)playbook
- 創(chuàng)建或編輯 mytask.yaml
---
- name: My playbook
hosts: all
tasks:
- name: Leaving a mark
command: "touch /tmp/ansible_was_here"
2, 運(yùn)行 playbook
$ ansible-playbook mytask.yaml
PLAY [My playbook] **********************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************
ok: [aserver.example.org]
ok: [aserver.example.org]
ok: [192.0.2.50]
fatal: [192.0.2.50]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.0.2.50 port 22: No route to host", "unreachable": true}
TASK [Leaving a mark] *******************************************************************************************************************
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because file is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
changed: [aserver.example.org]
changed: [bserver.example.org]
PLAY RECAP ******************************************************************************************************************************
aserver.example.org : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
bserver.example.org : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.0.2.50 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
- 提升權(quán)限來運(yùn)行命令
# as bruce
$ ansible all -m ping -u bruce
# as bruce, sudoing to root (sudo is default method)
$ ansible all -m ping -u bruce --become
# as bruce, sudoing to batman
$ ansible all -m ping -u bruce --become --become-user batman