ansible中角色和模板使用及部署lamp平臺

1、rolesphp

ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模塊及處理器放置於單獨的目錄中,並能夠便捷地include它們的一種機制。角色通常用於基於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。

    一個roles的案例以下所示:
        site.yml
        webservers.yml
        fooservers.yml
        roles/
           common/ 一級目錄角色名
             files/
             templates/
             tasks/
             handlers/
             vars/
             meta/
           webservers/
             files/
             templates/
             tasks/
             handlers/
             vars/
             meta/

    而在playbook中,能夠這樣使用roles:
    ---
    - hosts: webservers
      roles:
         - common
         - webservers

    也能夠向roles傳遞參數,例如:
    ---

    - hosts: webservers
      roles:
        - common
        - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }
        - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

    甚至也能夠條件式地使用roles,例如:
    ---

    - hosts: webservers
      roles:
        - { role: some_role, when: "ansible_os_family == 'RedHat'" }


1.1 建立role的步驟

    (1) 建立以roles命名的目錄;
    (2) 在roles目錄中分別建立以各角色名稱命名的目錄,如webservers等;
    (3) 在每一個角色命名的目錄中分別建立files、handlers、meta、tasks、templates和vars目錄;用不到的目錄能夠建立爲空目錄,也能夠不建立;
    (4) 在playbook文件中,調用各角色;

1.2 role內各目錄中可用的文件

    tasks目錄:至少應該包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件能夠使用include包含其它的位於此目錄中的task文件;
    files目錄:存放由copy或script等模塊調用的文件;
    templates目錄:template模塊會自動在此目錄中尋找Jinja2模板文件;
    handlers目錄:此目錄中應當包含一個main.yml文件,用於定義此角色用到的各handler;在handler中使用include包含的其它的handler文件也應該位於此目錄中;
    vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量;
    meta目錄:應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係;ansible 1.3及其之後的版本才支持;
    default目錄:爲當前角色設定默認變量時使用此目錄;應當包含一個main.yml文件;


2、Tags

tags用於讓用戶選擇運行或路過playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時,若是確信其沒有變化,就能夠經過tags跳過此些代碼片段。html

    建立一個httpd角色,其中的任務有安裝httpd,開機啓動和啓動它,當本地httpd配置文件發生改變後,把本地的httpd配置文件複製到遠程主機上,經過指定tags,若是安裝了httpd,則先讓其開機不啓動和關閉服務後再刪除。node

    建立一個httpd目錄
mysql

    [root@node1 ~]# mkdir httpd
    [root@node1 ~]# cp /etc/httpd/conf/httpd.conf httpd/   提供要複製到遠程主機的配置文件
    [root@node1 httpd]# ls -l
    total 8
    -rw-r--r-- 1 root root   75 Mar 30 06:29 apache.yml
    drwxr-xr-x 3 root root 4096 Mar 30 06:26 rolesweb

    建立角色須要的目錄
    [root@node1 ~]# mkdir httpd/roles/web/{files,handles,tasks} -pv
    mkdir: created directory `httpd/roles'
    mkdir: created directory `httpd/roles/web'
    mkdir: created directory `httpd/roles/web/files'
    mkdir: created directory `httpd/roles/web/handles'
    mkdir: created directory `httpd/roles/web/tasks'
    [root@node1 ~]# cd httpd/   
    [root@node1 httpd]# yum install -y tree   安裝tree
    [root@node1 httpd]# vim apache.ymlsql

    編輯apache.yml添加角色,這裏須要注意的是路徑問題,apache.yml是在和roles在同一個目錄層級的
    [root@node1 httpd]# cat apache.yml
    - hosts: constrol
      remote_user: root
      hosts: constrol
      roles:
        - web
    [root@node1 httpd]# pwd
    /root/httpd
    [root@node1 httpd]# tree .  查看提供的目錄樹
    .
    ├── apache.yml
    ├── httpd.conf
    └── roles
        └── web
            ├── files
            ├── handles
            └── tasks
    
    5 directories, 2 filesshell

    [root@node1 httpd]# mv httpd.conf roles/web/files/apache

    [root@node1 httpd]# vim roles/web/handles/main.yml
    [root@node1 httpd]# cat roles/web/handles/main.yml   提供handlers
    - name: restart httpd
      service: name=httpd state=restarted
    [root@node1 httpd]# vim roles/web/tasks/main.yml
    [root@node1 httpd]# cat roles/web/tasks/main.yml   提供任務tasks
    - name: Install httpd  安裝httpd
      yum: name=httpd
      tags: install   提供的一個標籤
    - name: start httpd   啓動httpd
      service: name=httpd enabled=yes state=started
    - name: copy configuration file    複製配置文件
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags: copy
      notify: restart httpd
    - command: /bin/false   下面是判斷httpd是否安裝了,如已經安裝則先中止後卸載,這裏存在問題沒有考慮到冪等性,後面會修正
      register: result
      ignore_errors: True
      tags: remove
    - name: reinstall httpd
      yum: name=httpd
      when: result|failed
    - name: stop httpd
      service: name=httpd enabled=no state=stopped
    - name: remove httpd
      yum: name=httpd state=absent
    [root@node1 httpd]# ansible constrol -m ping    ping後面顯示爲pong,說明他們都在線
    192.168.21.230 | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    192.168.21.234 | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    [root@node1 httpd]# ansible constrol -m command -a 'service httpd status'   正常啓動了
    192.168.21.230 | success | rc=0 >>
    httpd (pid  27646) is running...
    
    192.168.21.234 | success | rc=0 >>
    httpd (pid  10379) is running...
    
    [root@node1 httpd]# ansible-playbook apache.yml -t remove    指定remove標籤出執行,這裏也是存在問題的,指定tags後,只會對和tags在同一級別的任務最近的任務作執行,這裏只執行了- command: /bin/false任務,下面都沒執行   
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [web | command /bin/false] **********************************************
    failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001795", "end": "2015-04-15 09:54:11.437250", "rc": 1, "start": "2015-04-15 09:54:11.435455", "warnings": []}
    ...ignoring
    failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001614", "end": "2015-04-15 09:54:11.487340", "rc": 1, "start": "2015-04-15 09:54:11.485726", "warnings": []}
    ...ignoring
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=2    changed=1    unreachable=0    failed=0   
    192.168.21.234             : ok=2    changed=1    unreachable=0    failed=0   
    
    [root@node1 httpd]# ansible constrol -m command -a 'service httpd status'這裏就能夠發現httpd沒有被中止的
    192.168.21.234 | success | rc=0 >>
    httpd (pid  10379) is running...
    
    192.168.21.230 | success | rc=0 >>
    httpd (pid  27646) is running...
    
    [root@node1 httpd]# ansible constrol -m command -a 'chkconfig --list httpd'
    192.168.21.230 | success | rc=0 >>
    httpd              0:off    1:off    2:on    3:on    4:on    5:on    6:off
    
    192.168.21.234 | success | rc=0 >>
    httpd              0:off    1:off    2:on    3:on    4:on    5:on    6:off
    [root@node1 httpd]# vim /etc/ansible/ansible.cfg  這裏是經過修改配置查看一下錯誤緣由,剛開始瞭解的是不很詳細,因此想經過生成日誌看看上面執行的過程
    # logging is off by default unless this path is defined
    # if so defined, consider logrotate
    #log_path = /var/log/ansible.log
    改成
    log_path = /var/log/ansible.log
    [root@node1 httpd]# ansible-playbook apache.yml -t remove   從新執行生成日誌,其實也能夠經過使用選項-vvv查看詳細的執行過程的
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [web | command /bin/false] **********************************************
    failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001798", "end": "2015-04-15 10:16:08.181279", "rc": 1, "start": "2015-04-15 10:16:08.179481", "warnings": []}
    ...ignoring
    failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002055", "end": "2015-04-15 10:16:08.295655", "rc": 1, "start": "2015-04-15 10:16:08.293600", "warnings": []}
    ...ignoring
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=2    changed=1    unreachable=0    failed=0   
    192.168.21.234             : ok=2    changed=1    unreachable=0    failed=0   
    
    [root@node1 httpd]# cat /var/log/ansible.log   查看日誌發現這裏找不到什麼有用的信息
    2015-03-30 07:19:18,577 p=31389 u=root |   
    2015-03-30 07:19:18,578 p=31389 u=root |  /usr/bin/ansible-playbook apache.yml -t remove
    2015-03-30 07:19:18,578 p=31389 u=root |   
    2015-03-30 07:19:18,631 p=31389 u=root |  PLAY [constrol] ***************************************************************
    2015-03-30 07:19:18,638 p=31389 u=root |  GATHERING FACTS ***************************************************************
    2015-03-30 07:19:29,839 p=31389 u=root |  ok: [192.168.21.230]
    2015-03-30 07:19:30,007 p=31389 u=root |  ok: [192.168.21.234]
    2015-03-30 07:19:30,021 p=31389 u=root |  TASK: [web | command /bin/false] **********************************************
    2015-03-30 07:19:30,991 p=31389 u=root |  failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001798", "end": "2015-04-15 10:16:08.181279", "rc": 1, "start": "2015-04-15 10:16:08.179481", "warnings": []}
    2015-03-30 07:19:30,991 p=31389 u=root |  ...ignoring
    2015-03-30 07:19:31,009 p=31389 u=root |  failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002055", "end": "2015-04-15 10:16:08.295655", "rc": 1, "start": "2015-04-15 10:16:08.293600", "warnings": []}
    2015-03-30 07:19:31,010 p=31389 u=root |  ...ignoring
    2015-03-30 07:19:31,023 p=31389 u=root |  PLAY RECAP ********************************************************************
    2015-03-30 07:19:31,024 p=31389 u=root |  192.168.21.230             : ok=2    changed=1    unreachable=0    failed=0   
    2015-03-30 07:19:31,024 p=31389 u=root |  192.168.21.234             : ok=2    changed=1    unreachable=0    failed=0        
    
    [root@node1 ~]# cat web.yaml 這個是上次使用過的yaml,由於上次正常執行了,沒考慮到這裏是沒有指定標籤的,因此會按順序所有執行完
    - name: web server
      remote_user: root
      hosts: constrol
      tasks:
        - command: /bin/false
          register: result
          ignore_errors: True
        - name: reinstall httpd
          yum: name=httpd
          when: result|failed
        - name: stop httpd
          service: name=httpd enabled=no state=stopped
        - name: remove httpd
          yum: name=httpd state=absent
    [root@node1 ~]# ansible-playbook web.yaml  執行yaml
    
    PLAY [web server] *************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [command /bin/false] ****************************************************
    failed: [192.168.21.230] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.001673", "end": "2015-04-15 10:21:59.205132", "rc": 1, "start": "2015-04-15 10:21:59.203459", "warnings": []}
    ...ignoring
    failed: [192.168.21.234] => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002264", "end": "2015-04-15 10:22:04.076287", "rc": 1, "start": "2015-04-15 10:22:04.074023", "warnings": []}
    ...ignoring
    
    TASK: [reinstall httpd] *******************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [stop httpd] ************************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    TASK: [remove httpd] **********************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=5    changed=3    unreachable=0    failed=0   
    192.168.21.234             : ok=5    changed=3    unreachable=0    failed=0   
    
    [root@node1 ~]# ansible constrol -m command -a 'service httpd status'   是正常執行的,因此httpd被卸載了
    192.168.21.234 | FAILED | rc=1 >>
    httpd: unrecognized service
    
    192.168.21.230 | FAILED | rc=1 >>
    httpd: unrecognized service
    
    [root@node1 ~]# ansible constrol -m command -a 'rpm -q httpd'
    192.168.21.234 | FAILED | rc=1 >>
    package httpd is not installed
    
    192.168.21.230 | FAILED | rc=1 >>
    package httpd is not installed       
   
vim

    --skip-tags這個選項是跳過哪些標籤,查看經過ansible-playbook --help|less查看幫助信息,這裏就是安裝httpd了
    [root@node1 httpd]# ansible-playbook apache.yml --skip-tags=copy,remove
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [web | Install httpd] ***************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    TASK: [web | start httpd] *****************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    TASK: [web | reinstall httpd] *************************************************
    fatal: [192.168.21.230] => |failed expects a dictionary
    fatal: [192.168.21.234] => |failed expects a dictionary
    
    FATAL: all hosts have already failed -- aborting
    
    PLAY RECAP ********************************************************************
               to retry, use: --limit @/root/apache.retry
    
    192.168.21.230             : ok=3    changed=2    unreachable=1    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=1    failed=0   
    
    [root@node1 httpd]# ansible constrol -m command -a 'service httpd status'   查看信息,安裝和啓動都ok
    192.168.21.230 | success | rc=0 >>
    httpd (pid  29495) is running...
    
    192.168.21.234 | success | rc=0 >>
    httpd (pid  13317) is running...
    
    [root@node1 httpd]# ansible constrol -m command -a 'rpm -q httpd'
    192.168.21.230 | success | rc=0 >>
    httpd-2.2.15-39.el6.centos.x86_64
    
    192.168.21.234 | success | rc=0 >>
    httpd-2.2.15-39.el6.centos.x86_64
    
    [root@node1 ~]# cat web.yaml  修改web.yaml後的內容以下,仍是存在冪等性問題
    - name: web server
      remote_user: root
      hosts: constrol
      tasks:
        - name: reinstall httpd  
          yum: name=httpd state=present
          register: result
        - name: stop httpd
          service: name=httpd enabled=no state=stopped
          when: result|failed
        - name: remove httpd
          yum: name=httpd state=absent
    [root@node1 ~]# ansible-playbook web.yaml
    
    PLAY [web server] *************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [reinstall httpd] *******************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [stop httpd] ************************************************************
    skipping: [192.168.21.234]
    skipping: [192.168.21.230]
    
    TASK: [remove httpd] **********************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=3    changed=1    unreachable=0    failed=0   
    192.168.21.234             : ok=3    changed=1    unreachable=0    failed=0   
    
    [root@node1 ~]# ansible constrol -m command -a 'rpm -q httpd'
    192.168.21.234 | FAILED | rc=1 >>
    package httpd is not installed
    
    192.168.21.230 | FAILED | rc=1 >>
    package httpd is not installed
    
    [root@node1 ~]# ansible constrol -m command -a 'service httpd status'
    192.168.21.234 | FAILED | rc=1 >>
    httpd: unrecognized service
    
    192.168.21.230 | FAILED | rc=1 >>
    httpd: unrecognized service
    
    [root@node1 httpd]# cat roles/web/tasks/main.yml  修改main.yml也是存在冪等性問題
    - name: Install httpd
      yum: name=httpd
      tags: install
    - name: start httpd
      service: name=httpd enabled=yes state=started
    - name: copy configuration file
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags: copy
      notify: restart httpd
    - name: reinstall httpd
      yum: name=httpd
      register: result
      tags: remove
    - name: stop httpd
      service: name=httpd enabled=no state=stopped
      when: result|failed
    - name: remove httpd
      yum: name=httpd state=absent
      
    [root@node1 httpd]# ansible-playbook apache.yml --skip-tags=copy,remove
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [web | Install httpd] ***************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    TASK: [web | start httpd] *****************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    TASK: [web | stop httpd] ******************************************************
    fatal: [192.168.21.230] => |failed expects a dictionary
    fatal: [192.168.21.234] => |failed expects a dictionary
    
    FATAL: all hosts have already failed -- aborting
    
    PLAY RECAP ********************************************************************
               to retry, use: --limit @/root/apache.retry
    
    192.168.21.230             : ok=3    changed=2    unreachable=1    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=1    failed=0
    [root@node1 httpd]# ansible constrol -m command -a 'service httpd status'
    192.168.21.230 | success | rc=0 >>
    httpd (pid  30191) is running...
    
    192.168.21.234 | success | rc=0 >>
    httpd (pid  14020) is running...
    
    [root@node1 httpd]# cat roles/web/tasks/main.yml  修改仍是同樣存在問題
    - name: Install httpd
      yum: name=httpd
      tags: install
    - name: start httpd
      service: name=httpd enabled=yes state=started
    - name: copy configuration file
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      tags: copy
      notify: restart httpd
    - name: reinstall httpd
      yum: name=httpd
      register: result
    - name: stop httpd
      service: name=httpd enabled=no state=stopped
      when: result|failed
    - name: remove httpd
      yum: name=httpd state=absent
      tags: remove
    [root@node1 httpd]# ansible-playbook apache.yml -t remove
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [web | remove httpd] ****************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=2    changed=1    unreachable=0    failed=0   
    192.168.21.234             : ok=2    changed=1    unreachable=0    failed=0   
    
    [root@node1 httpd]# ansible constrol -m command -a 'rpm -q httpd'
    192.168.21.230 | FAILED | rc=1 >>
    package httpd is not installed
    
    192.168.21.234 | FAILED | rc=1 >>
    package httpd is not installed
    
    這裏還有一個選項能夠用來測試語法的--syntax-check
    [root@node1 ~]# ansible-playbook web.yaml --syntax-check
    
    playbook: web.yaml
    
    ERROR: multiple actions specified in task: 'service' and 'stop httpd'
    [root@node1 ~]# cat web.yaml    再次修改web.yml
    - name: web server
      remote_user: root
      hosts: constrol
      tasks:
        - name: reinstall httpd
          yum: name=httpd state=present
          register: result
        - name: stop httpd
          service: name=httpd enabled=no state=stopped
          yum: name=httpd state=absent
          when: result|failed
    
    [root@node1 ~]# cat web.yaml   修改都提供了標籤,進行測試,執行多個任務就能夠把tags和任務對齊
    - name: web server
      remote_user: root
      hosts: constrol
      tasks:
        - name: stop httpd
          service: name=httpd enabled=no state=stopped
        - name: remove httpd
          yum: name=httpd state=absent
      tags: remove
      tasks:
        - name: Install httpd
          yum: name=httpd
        - name: start httpd
          service: name=httpd enabled=yes state=started
      tags: install
    [root@node1 ~]# ansible constrol -m command -a 'service httpd status'
    192.168.21.234 | FAILED | rc=1 >>
    httpd: unrecognized service
    
    192.168.21.230 | FAILED | rc=1 >>
    httpd: unrecognized service
    
    [root@node1 ~]# ansible-playbook web.yaml --syntax-check
    
    playbook: web.yaml
    
    [root@node1 ~]# ansible-playbook web.yaml -t install
    
    PLAY [web server] *************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [Install httpd] *********************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    TASK: [start httpd] ***********************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=3    changed=2    unreachable=0    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0        
    [root@node1 ~]# ansible constrol -m command -a 'service httpd status'
    192.168.21.230 | success | rc=0 >>
    httpd (pid  30814) is running...
    
    192.168.21.234 | success | rc=0 >>
    httpd (pid  14670) is running...
    
    http://docs.ansible.com/YAMLSyntax.html下面有yaml語法,能夠查看一下
    對roles/web/tasks/main.yml作切分,其餘內容未修改,以下:
    roles/web/tasks/main.yml內容以下:
    ---
    #file: main.yml
    - include: install.yml
      tags: install   經過在包含的yml文件處指定tags,這樣tags就能夠在前一個include包含的文件中的內容都生效
    - include: remove.yml
      tags: remove
    - include: copy.yml
      tags: copy
    
    目錄爲:roles/web/tasks/
    文件install.yml內容以下:
    ---
    #file: install.yml
    - name: install httpd
      yum: name=httpd
    - name: start httpd
      service: name=httpd enabled=yes state=started
      
    文件remove.yml內容以下:  冪等性問題已經剔除了
    ---
    #file remove.yml
    - name: stop httpd
      service: name=httpd enabled=no state=stopped
    - name: remove httpd
      yum: name=httpd state=absent
      
    文件copy.yml內容以下:
    ---
    #file copy.yml
    - name: copy configuration file
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd  
    [root@node1 httpd]# ansible-playbook apache.yml -t remove   執行刪除httpd
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [web | stop httpd] ******************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    TASK: [web | remove httpd] ****************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=3    changed=2    unreachable=0    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0   
   
centos

    修改一下配置文件httpd.conf端口進行測試有80到8080

    [root@node1 httpd]# vim roles/web/files/httpd.conf
    [root@node1 httpd]# ansible-playbook apache.yml -t copy
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [web | copy cofiguration file] ******************************************
    changed: [192.168.21.234]  這裏只把文件複製過去了
    changed: [192.168.21.230]
    ERROR: change handler (restart httpd) is not defined
    [root@node1 httpd]# mv roles/web/handles roles/web/handlers  緣由是少了一handles少了一個r是handlers
    [root@node1 httpd]# cat roles/web/handlers/main.yml  
    ---
    #file: handlers.yml
    - name: restart httpd
      service: name=httpd state=restarted
    [root@node1 httpd]# ansible-playbook apache.yml -t copy  須要修改一下httpd.conf文件然後再執行
    
    PLAY [constrol] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.230]
    ok: [192.168.21.234]
    
    TASK: [web | copy cofiguration file] ******************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    NOTIFIED: [web | restart httpd] ***********************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=3    changed=2    unreachable=0    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0 

    發現ok了


    案列經過role的方式定義安裝配置LAMP平臺,一個部署web和php,一臺部署db,而且經過腳本測試能夠連上mysql服務器。架構圖以下所示:

wKioL1UuPqXgl0f-AAC6Ipg6030579.jpg

    在node1上,建立3個角色httpd、mysql、php,在/etc/ansible/hosts文件中定義兩個組,內容以下所示:

    [root@node1 ~]# cat /etc/ansible/hosts  修改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.
    [lamp]
    192.168.21.234
    
    [dbserver]
    192.168.21.234
    192.168.21.230
    [root@node1 ~]# mkdir program  建立項目目錄
    [root@node1 ~]# mkdir -pv program/roles/{httpd/{handlers,tasks},mysql/{handlers,tasks},php/{handlers,tasks}}建立須要使用的目錄
    mkdir: created directory `program/roles'
    mkdir: created directory `program/roles/httpd'
    mkdir: created directory `program/roles/httpd/handlers'
    mkdir: created directory `program/roles/httpd/tasks'
    mkdir: created directory `program/roles/mysql'
    mkdir: created directory `program/roles/mysql/handlers'
    mkdir: created directory `program/roles/mysql/tasks'
    mkdir: created directory `program/roles/php'
    mkdir: created directory `program/roles/php/handlers'
    mkdir: created directory `program/roles/php/tasks'
    [root@node1 ~]# tree program/   查看建立的目錄樹
    program/
    └── roles
        ├── httpd
        │?? ├── handlers
        │?? └── tasks
        ├── mysql
        │?? ├── handlers
        │?? └── tasks
        └── php
            ├── handlers
            └── tasks
    
    10 directories, 0 files
    [root@node1 ~]# cd program/
    [root@node1 program]# vim program.yml
    [root@node1 program]# cat program.yml  建立program.yml,提供了3個角色,用了2個hosts
    ---
    #file: program.yml
    - hosts: lamp
      remote_user: root
      roles:
        - apache
        - php
    - hosts: dbserver
      remote_user: root
      roles:
        - mysql
    [root@node1 program]# vim roles/httpd/tasks/main.yml
    [root@node1 program]# cat roles/httpd/tasks/main.yml  提供各角色所需的文件,在此不解釋了,前面也有相關的內容
    ---
    #file main.yml
    - include: install.yml
      tags: inshttpd
    - include: copy.yml
      tags: cyhttpd
    - include: remove.yml
      tags: remhttpd
    [root@node1 program]# vim roles/httpd/tasks/install.yml
    [root@node1 program]# cat roles/httpd/tasks/install.yml
    ---
    #file: install.yml
    - name: Install httpd
      yum: name=httpd
    - name: start httpd
      service: name=httpd enabled=yes state=started
    [root@node1 program]# cat roles/httpd/tasks/copy.yml
    ---
    #file: copy.yml
    - name: copy configuration file
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:
    [root@node1 program]# vim roles/httpd/tasks/remove.yml
    [root@node1 program]# cat roles/httpd/tasks/remove.yml
    ---
    #file: remove.yml
    - name: httpd stop
      service: name=httpd enabled=no state=stopped
    - name: remove httpd
      yum: name=httpd state=absent
    [root@node1 program]# vim roles/mysql/tasks/main.yml
    [root@node1 program]# cat roles/mysql/tasks/main.yml
    ---
    #file: main.yml
    - include: install.yml
      tags: insmysql
    - include: remove.yml
      tags: remmysql
    [root@node1 program]# vim roles/mysql/tasks/install.yml
    [root@node1 program]# cat roles/mysql/tasks/install.yml
    ---
    #file: install.yml
    - name: Install mysql
      yum: name=mysql-server
    - name: start mysql
      service: name=mysqld enabled=yes state=started
    [root@node1 program]# vim roles/mysql/tasks/remove.yml
    [root@node1 program]# cat roles/mysql/tasks/remove.yml
    ---
    #file: remove.yml
    - name: stopped mysql
      service: name=mysqld enabled=no state=stopped
    - name: remove mysql
      yum: name=mysql-server state=absent
    [root@node1 program]# vim roles/httpd/handlers/main.yml
    [root@node1 program]# cat roles/httpd/handlers/main.yml
    ---
    #file: main.yml
    - name: restart httpd
      service: name=httpd state=restarted
    [root@node1 program]# vim roles/php/tasks/main.yml
    [root@node1 program]# cat roles/php/tasks/main.yml
    ---
    #file: main.yml
    - include: install.yml
      tags: insphp
    - include: remove.yml
      tags: remphp    
    [root@node1 program]# vim roles/php/tasks/install.yml
    [root@node1 program]# cat roles/php/tasks/install.yml
    ---
    #file: install.yml
    - name: Install php
      yum: name=php
    - name: Install php-mysql
      yum: name=php-mysql
    [root@node1 program]# vim roles/php/tasks/remove.yml
    [root@node1 program]# cat roles/php/tasks/remove.yml
    ---
    #file: remove.yml
    - name: remove php
      yum: name=php state=absent
    - name: remove php-mysql
      yum: name=php-mysql state=absent          
    [root@node1 program]# tree .
    .
    ├── program.yml
    └── roles
        ├── httpd
        │?? ├── handlers
        │?? │?? └── main.yml
        │?? └── tasks
        │??     ├── copy.yml
        │??     ├── install.yml
        │??     ├── main.yml
        │??     └── remove.yml
        ├── mysql
        │?? ├── handlers
        │?? └── tasks
        │??     ├── install.yml
        │??     ├── main.yml
        │??     └── remove.yml
        └── php
            ├── handlers
            └── tasks
                ├── install.yml
                ├── main.yml
                └── remove.yml
    
    10 directories, 12 files
    [root@node1 program]# mkdir roles/httpd/files
    [root@node1 program]# cp /etc/httpd/conf/httpd.conf roles/httpd/files
    最近的目錄和文件樹以下:
    [root@node1 program]# tree .
    .
    ├── program.yml
    └── roles
        ├── httpd
        │?? ├── files
        │?? │?? └── httpd.conf
        │?? ├── handlers
        │?? │?? └── main.yml
        │?? └── tasks
        │??     ├── copy.yml
        │??     ├── install.yml
        │??     ├── main.yml
        │??     └── remove.yml
        ├── mysql
        │?? ├── handlers
        │?? └── tasks
        │??     ├── install.yml
        │??     ├── main.yml
        │??     └── remove.yml
        └── php
            ├── handlers
            └── tasks
                ├── install.yml
                ├── main.yml
                └── remove.yml
    
    11 directories, 13 files
    [root@node1 program]# ansible-playbook program.yml --syntax-check  測試語法是否有誤
    
    playbook: program.yml
    
    ERROR: cannot find role in /root/program/roles/apache or /root/program/apache or /etc/ansible/roles/apache
    [root@node1 program]# vim program.yml
    [root@node1 program]# cat program.yml
    ---
    #file: program.yml
    - hosts: lamp
      remote_user: root
      roles:
        - httpd   修改此處有原來的apache  -> httpd,由於沒有apache角色
        - php
    - hosts: dbserver
      remote_user: root
      roles:
        - mysql
    [root@node1 program]# ansible-playbook program.yml --syntax-check  再次進行測試語法ok了
    
    playbook: program.yml
    清楚node3上的httpd
    [root@node1 program]# ansible-playbook program.yml -t remhttpd
    
    PLAY [lamp] *******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    
    TASK: [httpd | httpd stop] ****************************************************
    changed: [192.168.21.234]
    
    TASK: [httpd | remove httpd] **************************************************
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0
    安裝httpd
    [root@node1 program]# ansible-playbook program.yml -t inshttpd
    
    PLAY [lamp] *******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    
    TASK: [httpd | Install httpd] *************************************************
    changed: [192.168.21.234]
    
    TASK: [httpd | start httpd] ***************************************************
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0
    安裝php  
    [root@node1 program]# ansible-playbook program.yml -t insphp
    
    PLAY [lamp] *******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    
    TASK: [php | Install php] *****************************************************
    changed: [192.168.21.234]
    
    TASK: [php | Install php-mysql] ***********************************************
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0   
    安裝mysql
    [root@node1 program]# ansible-playbook program.yml -t insmysql
    
    PLAY [dbserver] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [mysql | Install mysql] *************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    TASK: [mysql | start mysql] ***************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=3    changed=2    unreachable=0    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0   
    查看端口啓用正常與否
    [root@node1 program]# ansible lamp -m shell -a 'ss -tnlp|grep -E "80|3306"'
    192.168.21.234 | success | rc=0 >>
    LISTEN     0      50                        *:3306                     *:*      users:(("mysqld",17964,11))
    LISTEN     0      128                      :::80                      :::*      users:(("httpd",17433,5),("httpd",17436,5),("httpd",17437,5),("httpd",17438,5),("httpd",17439,5),("httpd",17440,5),("httpd",17441,5),("httpd",17442,5),("httpd",17443,5))
    
    [root@node1 program]# ansible dbserver -m shell -a 'ss -tnlp|grep 3306'
    192.168.21.234 | success | rc=0 >>
    LISTEN     0      50                        *:3306                     *:*      users:(("mysqld",17964,11))
    
    192.168.21.230 | success | rc=0 >>
    LISTEN     0      50                        *:3306                     *:*      users:(("mysqld",33420,11))
    清除兩臺機器上剛安裝的服務
    [root@node1 program]# ansible-playbook program.yml -t remhttpd
    
    PLAY [lamp] *******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    
    TASK: [httpd | httpd stop] ****************************************************
    changed: [192.168.21.234]
    
    TASK: [httpd | remove httpd] **************************************************
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0   
    
    [root@node1 program]# ansible-playbook program.yml -t remphp
    
    PLAY [lamp] *******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    
    TASK: [php | remove php] ******************************************************
    ok: [192.168.21.234]
    
    TASK: [php | remove php-mysql] ************************************************
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.234             : ok=3    changed=1    unreachable=0    failed=0   
    
    [root@node1 program]# ansible-playbook program.yml -t remmysql
    
    PLAY [dbserver] ***************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [192.168.21.234]
    ok: [192.168.21.230]
    
    TASK: [mysql | stopped mysql] *************************************************
    changed: [192.168.21.234]
    changed: [192.168.21.230]
    
    TASK: [mysql | remove mysql] **************************************************
    changed: [192.168.21.230]
    changed: [192.168.21.234]
    
    PLAY RECAP ********************************************************************
    192.168.21.230             : ok=3    changed=2    unreachable=0    failed=0   
    192.168.21.234             : ok=3    changed=2    unreachable=0    failed=0
    發現都ok

    安裝和啓動各遠程節點的服務,此處再也不演示

    [root@node1 program]# vim index.php
    [root@node1 program]# cat index.php
    <?php
      phpinfo();
    ?>
    [root@node1 program]# ansible lamp -m copy -a 'src=index.php dest=/var/www/html/'
    192.168.21.234 | success >> {
        "changed": true,
        "checksum": "26af88945e23289d15e128606a29932b3d78787c",
        "dest": "/var/www/html/index.php",
        "gid": 0,
        "group": "root",
        "md5sum": "62210a938d0199092c2d3976a45bf86d",
        "mode": "0644",
        "owner": "root",
        "size": 22,
        "src": "/root/.ansible/tmp/ansible-tmp-1427707616.78-214058087338938/source",
        "state": "file",
        "uid": 0
    }

    重啓一下httpd,在客戶端訪問192.168.21.234/index.php顯示

wKioL1UuX9aiNQBOAAJBw-H7lIA852.jpg

相關文章
相關標籤/搜索