Ansible是什么?
Ansible是一種開源軟件配置,配置管理和應(yīng)用程序部署工具,可將基礎(chǔ)結(jié)構(gòu)作為代碼啟用。它可以在許多類Unix系統(tǒng)上運(yùn)行,并且可以配置類Unix系統(tǒng)和Mi??crosoft Windows。它包含自己的聲明性語言來描述系統(tǒng)配置。Ansible由Michael DeHaan編寫,并于2015年被Red Hat收購
如上所述,Ansible是一種開源軟件配置工具,那它可以用來做什么
Ansible可以用來做什么?
安裝Ansible
在Mac下直接安裝即可
brew install ansible
版本
ansible --version
ansible 2.10.3
Ansible主機(jī)管理
自己手頭有兩臺虛擬機(jī),一臺是本地使用multipass的虛擬機(jī),一臺是自己在騰訊去上買的虛擬機(jī),先配置好ssh名密登錄,然后配置好Ansible管理的主機(jī),新建配置文件/etc/ansible/hosts
,文件配置如下
[webservers]
42.192.129.128 ansible_ssh_user=ubuntu
[node]
192.168.64.12 ansible_ssh_user=ubuntu
這份配置還是非常清晰易懂的:
-
[webservers]
是可以理解分組,webservers
就是組名 -
42.192.129.128
自然主機(jī)的ip地址了 -
ansible_ssh_user
,故名思意,ssh登錄用戶名
運(yùn)行以下命令:
? ~ ansible all -m ping
192.168.64.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
[DEPRECATION WARNING]: Distribution Ubuntu 18.04 on host 42.192.129.128 should use /usr/bin/python3,
but is using /usr/bin/python for backward compatibility with prior Ansible releases. A future
Ansible release will default to using the discovered platform python for this host. See
https://docs.ansible.com/ansible/2.10/reference_appendices/interpreter_discovery.html for more
information. This feature will be removed in version 2.12. Deprecation warnings can be disabled by
setting deprecation_warnings=False in ansible.cfg.
42.192.129.128 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
這條ansible all -m ping
中-m
的含義是
-m MODULE_NAME, --module-name MODULE_NAME
module name to execute (default=command)
也就是運(yùn)行ansible的模塊ping
一下所有分組(注意,這里的ping并不是linux命令ping,面是ansible的一個模塊實(shí)現(xiàn)了與linux下ping類似的功能),也可以指定分組如指定node分組
? ~ ansible node -m ping
192.168.64.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
通過這幾條命令使用下來,可以知道ansible能通過ssh建立連接批量管理遠(yuǎn)程主機(jī),試想一下,1000臺主機(jī)的情況下,如果沒有ansible,上述ping操作可能要重復(fù)敲擊1000次,或者寫腳本配置完成ansible的類似功能,將操作抽象成配置,減少重復(fù),這或許就是ansible這類工具誕生的其中一個動機(jī)吧。
Ansible的Playbook功能
Ansible腳本的名字叫Playbook,使用的是YAML的格式,文件以yml結(jié)尾
實(shí)現(xiàn)上例中的相同功能,可編寫demo.yml
如下
---
- hosts: node
remote_user: ubuntu
tasks:
- name: ping test
ping:
運(yùn)行之
? ~ ansible-playbook demo.yml
PLAY [node] *****************************************************************************************
TASK [Gathering Facts] ******************************************************************************
ok: [192.168.64.12]
TASK [ping test] ************************************************************************************
ok: [192.168.64.12]
PLAY RECAP ******************************************************************************************
192.168.64.12 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
很簡單的樣子,事實(shí)上也確實(shí)簡單,因?yàn)閥ml配置的描述也相當(dāng)清晰。雖然此處只是一個簡的例子,不過也可以看出Playbook其實(shí)就是ansible的的一種"腳本"形式,這種聲明式配置足夠友好(k8s的聲明式對象配置倒是與此非常相似,應(yīng)該是同宗同源)。
Host Inventory
上術(shù)示例主機(jī)都是使用默認(rèn)路徑的配置,其實(shí)有可以動態(tài)自定義主機(jī)及分組配置,而且使用yml格式(我真是喜歡yml格式)定義文件host.yml
如下所示
---
all:
children:
webservers:
hosts:
42.192.129.128:
ansible_ssh_user: ubuntu
node:
hosts:
192.168.64.12:
ansible_ssh_user: ubuntu
然后使用命令
ansible all -i host.yml -m ping
結(jié)果與上例無異,個人更喜歡yml這種寫法,結(jié)構(gòu)更清晰,當(dāng)然這是要在熟悉文檔及其用法的基礎(chǔ)上。
ansible-console
ansible為用戶提供的交互式工具,可以方便地連接遠(yuǎn)程主機(jī)使用shell
? ansible-console node
Welcome to the ansible console.
Type help or ? to list commands.
whoami@node (1)[f:5]$ lsb_release -a
192.168.64.12 | CHANGED | rc=0 >>
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionicNo LSB modules are available.
發(fā)現(xiàn)ansible真挺好用,如果平臺用多臺虛擬機(jī)的話,也可以使用ansible來管理與交互,整體下來學(xué)習(xí)成本不高,使用卻非常方便。
條件控制
就像寫代碼一樣,有時候做一些交互操作的時候希望有滿足某些條件再執(zhí)行
---
- hosts: node
remote_user: ubuntu
tasks:
- name: ping test
ping:
when: ansible_os_family == "RedHat"
用ansible-playbook運(yùn)行
ansible-playbook demo.yml
PLAY [node] ***********************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
ok: [192.168.64.12]
TASK [ping test] ******************************************************************************************************************************************
skipping: [192.168.64.12]
PLAY RECAP ************************************************************************************************************************************************
192.168.64.12 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
因?yàn)槲业奶摂M機(jī)是Ubuntu,所以在ansible_os_family == "RedHat"
為false, 任務(wù)就跳過執(zhí)行了,改為Debian
就能正確執(zhí)行了。
安裝軟件
這個功能很有用,特別是需要批量操作
---
- hosts: node
remote_user: ubuntu
tasks:
- name: Install the package "nmap"
become: true
apt:
name: nmap
注意此處become: true
是為了權(quán)限升級,可理解為sudo
操作。
此篇為開坑之作,還有一些高級用法Roles、ansible-galaxy
、ansible-vault
等就不一次展開了,通過簡單的使用,ansible解決了批量操作、運(yùn)維操作重用等功能,描述性配置非常強(qiáng)大,基本等同于編程,這與一些CI/CD平臺如gitlab等倒是非常相似的,文檔也很豐富且全面。
未完,待續(xù)……
參考: