ansible基礎及使用示例

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檢測到遠程主機已經知足了最終執行完的條件就再也不執行命令。

相關文章
相關標籤/搜索