ansible詳解-playbook

playbook介紹

playbook是由一個或多個play組成的列表,ansible能夠直接調用playbook,按照事先定義好的規則在遠程主機一次執行playbook上的操做。ansible的playbook是採用YAML的形式,文件後綴爲.yaml,須要遵循YAML的語法進行定義。web

注意:
playbook一個-name只能有一個模塊被調用,不然會報錯服務器

playbook的核心元素

  • tasks:任務,由模塊定義的操做的列表
  • variables:變量
  • templates:模板,即便用了模板語法的文本文件
  • handlers:由特定條件觸發的tasks
  • roles:角色

playbook的基礎組件

  • hosts:指明要運行playbook的主機或者主機組
  • remote_user:指明以遠程主機哪一個用戶的身份運行playbook
  • sudo_user:非管理員須要擁有的sudo權限
  • tasks:指定具體要執行的任務列表

playbook經常使用命令:

ansible-playbook --syntax-check user.yml    #測試語法是否正確
ansible-playbook -C user.yml                        #測試執行,並非真正運行
ansible-playbook user.yml                             #運行playbook

playbook變量使用方法

  1. 使用內建變量facts
  2. 自定義變量:
    1. 命令行傳遞變量:
      -e VAR=VALUE
    2. 在inventoy中爲每一個主機定義專門的變量:
    [test]
    192.168.189.129 user=test_3
    調用方法:
    \- hosts: test remote_user: root tasks: \- name: add {{ user }} #經過{{ 變量名 }}調用變量 user: name={{ user }} state=present system=yes
    1. 在inventory中爲每一個主機組中的主機傳遞相同的變量:
    [test]
    192.168.189.129
    [test:vars]
    user=test_4
    1. 在playbook中定義:
    \ - hosts: test
      remote_user: root
      vars:
     \  - user: test_5
      \ - password: 1234567a
      tasks:
      \ - name: add {{ user }}
          user: name={{ user }} state=present system=yes password={{ password }}
    1. inventory中使用參數:
    • ansible_ssh_host
    • ansible_ssh_port
    • ansible_ssh_user
    • ansible_ssh_pass
    • ansible_sudo_pass
    [test]
    192.168.189.129 ansible_ssh_pass=1234567a

playbook中handlers的使用

- hosts: test
  vars:
    - service: httpd
  remote_user: root
  tasks:
    - name: install {{ service }}
      yum: name={{ service }} state=latest
    - name: install configure file
      copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd
    - name: start {{ service }}
      service: name= {{ service }} state=started enabled=yes

  handlers:
    - name: restart httpd
      service: name=httpd  state=restarted

playbook中when的用法

- hosts: test
  remote_user: root
  tasks:
    - name: print hello world
      copy: content='hello world' dest=/tmp/test.log
      when: facter_ipaddress == '192.168.189.129'    #只有當條件知足的時候才執行此tasks

playbook中的迭代用法

playbook常常須要重複執行某指令,此時可使用迭代,迭代固定用法以下:ssh

- hosts: test
  remote_user: root
  tasks:
    - name: del user
      user: name={{ item }} state=present    #此處固定必須爲item,表示調用迭代對象
      with_items:    #此處固定爲with_items,下面一次列出迭代對象
        - test_2
        - test_3
        - test_4
        - test_5

也能夠採用字典列表的方式來進行item調用:測試

- hosts: all
  remote_user: root
  tasks:
  - name: create groups
    group: name={{ item }} state=present
    with_items:
   - groupx1
    - groupx2
    - groupx3
    - name: create users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - {name: 'userx1', group: 'groupx1'}
    - {name: 'userx2', group: 'groupx2'}
    - {name: 'userx3', group: 'groupx3'}

playbook的templates使用

template文件可使用變量來代替某些固定的值,這樣能夠針對不一樣的服務器提供不一樣的配置文件。
變量支持以下類型:命令行

  • 主機變量
  • 主機組變量
  • facts
- hosts: test
  vars:
    - service: httpd
  remote_user: root
  tasks:
    - name: install {{ service }}
      yum: name={{ service }} state=latest
    - name: install configure file
      template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf    #template文件能夠用j2結尾,表明是jinjia2文件
      notify: restart httpd
    - name: start {{ service }}
      service: name= {{ service }} state=started enabled=yes

  handlers:
    - name: restart httpd
      service: name=httpd  state=restarted

playbook中tags的應用

能夠對某一個task打上tag標籤,這樣在執行playbook的時候能夠直接指定要執行的tag,就不用總體在把全部的task再執行一遍了rest

- hosts: test
  vars:
    - service: httpd
  remote_user: root
  tasks:
    - name: install {{ service }}
      yum: name={{ service }} state=latest
    - name: install configure file
      template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd
      tags: conf    #此處的conf表示tag名
    - name: start {{ service }}
      service: name= {{ service }} state=started enabled=yes

  handlers:
    - name: restart httpd

調動tag的命令:code

ansible-playbook httpd.yml -t conf
ansible-playbook httpd.yml --tags conf

playbook中roles的應用

roles能夠對多個playbook進行復用,好比說A主機須要安裝httpd,B主機也須要安裝httpd,可是他們又沒有在一個主機組,這個時候正常來講須要寫兩遍playbook,就形成了重複現象。此時能夠採用roles,對兩個主機都指定role爲httpd所在的roles便可進行playbook的複用。
roles有特定的格式,首先須要有一個roles目錄,而後在目錄下面須要有各個role的主目錄,主目錄下面爲各個分目錄:對象

  • roles
    • site.yml:此文件用於調用須要role文件
    • 項目目錄
      • tasks:存放須要執行的任務,其下面必須有一個main.yml文件用於定義各個任務
        • main.yml
      • files:用於存放各個須要供copy模塊調用的靜態文件
      • template:用於存放模板文件
      • handlers:存放觸發器文件,下面必須有main.yml用於定義各個觸發器
        • main.yml
      • meta:能夠新建main.yml文件,設置該role和其餘role的關聯關係
      • vars:定義須要調用的變量,須要有main.yml文件
        • main.yml
      • default:設定默認變量的時候使用此目錄中的main.yml
#site.yml文件,下面文件表明給test配置websers何dbsers的role
- hosts: test
  remote_user: root
  roles:
  - websers
  - dbsers
#tasks下main.yml文件
- name: install httpd
  yum: name=httpd state=latest
- name: install config
  template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf    #template和copy模塊的src能夠直接調用相對路徑,相對roles/websers/files
  notify: restart httpd
  tags: conf
- name: start httpd
  service: name=httpd state=started enabled=yes
#handlers下的main.yml文件
- name: restart httpd
  service: name=httpd state=restarted
相關文章
相關標籤/搜索