1 介紹python
Ansible 是一個系統自動化工具,用來作系統配管理,批量對遠程主機執行操做指令。web
2 實驗環境json
ipvim |
角色數組 |
192.168.40.71數據結構 |
ansible管控端ssh |
192.168.40.72工具 |
遠程機器Athis |
192.168.40.73spa |
遠程機器B |
在管控端安裝ansible:
yum install epel-release
yum install ansible
配置管控端可無密登錄A/B機器
在管控端生成key並複製到A、B機器
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.40.72
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.40.73
驗證可無密登錄即配置成功
配置管控端的管理遠程主機ip
vim /etc/ansible/hosts 添加以下配置,中括號的內容爲你自定義的名字。
[web]
192.168.40.72
192.168.40.73
至此配置完成,執行:
[root@localhost ~]# ansible web -m ping
192.168.40.73 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.40.72 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ansible相關的命令:
ansible 用來執行ansible管理命令
ansible-playbook 當有衆多任務時,可編寫成playbook來運行
ansible-doc 用來獲取模塊的幫助文檔
ansible的簡單使用格式:
ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
獲取模塊列表
ansible-doc -l 裏面有衆多模塊,掌握一些經常使用的便可知足平常工做
ansible-doc -s modulename # 獲取模塊簡要使用說明
示例:
[root@localhost ~]# ansible-doc -s ping
- name: Try to connect to host, verify a usable python and return `pong' on success
ping:
data: # Data to return for the `ping' return value. If this parameter is set to `crash', the module will cause an exception.
編寫第一個playbook:
playbook基於YAML語法來編寫,基本語法規則以下:
1.大小寫敏感
2.使用縮進表示層級關係
3.縮進時不容許使用Tab鍵,只容許使用空格
4.縮進的空格數目不重要,只要相同層級的元素左側對齊便可
5. # 表示註釋,從這個字符一直到行尾,都會被解析器忽略。
6. 用---表示開頭
YAML 支持三種數據結構:
對象:鍵值對的集合,用冒號:做爲鍵值分隔
數組:一組按次序排列的值,用減號-做爲標識
純量:單個的、不可再分的值,如字符串,數值,日期等
例子:
---
- hosts: web
remote_user: root
tasks:
- name: ping test
ping: null
這個playbook表示去標識爲web機的遠程主機上,用root用戶去執行名爲ping test的任務,它使用ping模塊。其中ping test爲本身定義的任務名,會在稍後的執行輸出中展現出來。
其對應的json結構爲:
[
{
"hosts": "web",
"remote_user": "root",
"tasks": [
{
"name": "ping test",
"ping": null
}
]
}
]
運行:
root@localhost playbook]# ansible-playbook ping.yml
PLAY [web] ********************************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [192.168.40.72]
ok: [192.168.40.73]
TASK [ping test] **************************************************************************
ok: [192.168.40.73]
ok: [192.168.40.72]
PLAY RECAP ********************************************************************************
192.168.40.72 : ok=2 changed=0 unreachable=0 failed=0
192.168.40.73 : ok=2 changed=0 unreachable=0 failed=0
來寫一個更實用的playbook:
[root@localhost playbook]# cat add_user.yml
---
- hosts: web
remote_user: root
gather_facts: true
tasks:
- name: Add users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
它表示標識爲web的遠程主機執行名爲:Add users的任務,它使用user模塊,這裏面還用到了變量的用法,{{ item }},它最後會被值testuser1 和 testuser2 替換,總共添加兩個用戶。這個對應json結構以下:
[
{
"hosts": "web",
"remote_user": "root",
"gather_facts": true,
"tasks": [
{
"name": "Add users",
"user": "name={{ item }} state=present groups=wheel",
"with_items": [
"testuser1",
"testuser2"
]
}
]
}
]
[root@localhost playbook]# ansible-playbook add_user.yml
PLAY [web] ********************************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [192.168.40.73]
ok: [192.168.40.72]
TASK [Add users] **************************************************************************
changed: [192.168.40.73] => (item=testuser1)
changed: [192.168.40.72] => (item=testuser1)
changed: [192.168.40.72] => (item=testuser2)
changed: [192.168.40.73] => (item=testuser2)
PLAY RECAP ********************************************************************************
192.168.40.72 : ok=2 changed=1 unreachable=0 failed=0
192.168.40.73 : ok=2 changed=1 unreachable=0 failed=0
再執行一遍,觀察其輸出與第一遍的差異:
[root@localhost playbook]# ansible-playbook add_user.yml
PLAY [web] ********************************************************************************
TASK [Gathering Facts] ********************************************************************
ok: [192.168.40.73]
ok: [192.168.40.72]
TASK [Add users] **************************************************************************
ok: [192.168.40.73] => (item=testuser1)
ok: [192.168.40.72] => (item=testuser1)
ok: [192.168.40.73] => (item=testuser2)
ok: [192.168.40.72] => (item=testuser2)
PLAY RECAP ********************************************************************************
192.168.40.72 : ok=2 changed=0 unreachable=0 failed=0
192.168.40.73 : ok=2 changed=0 unreachable=0 failed=0
其中第二次的changed=0。
ansible是不少模塊的執行是具備冪等性的,即ansible檢測到遠程主機已經知足了最終執行完的條件就再也不執行命令。