ansible - playbook(劇組)

ansible - playbook(劇組)

playbooks是 一個不一樣於使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來講,playbook是一個很是簡單的配置管理和多主機部署系統,不一樣於任何已經存在的模式,可做爲一個適合部署複雜應用程序的基礎。Playbook能夠定製配置,能夠按照指定的操做步驟有序執行,支持同步和異步方式。值得注意的是playbook是經過YAML格式來進行描述定義的。linux

語法:web

  • 同層縮進必須保持對齊
    • 後面要有空格
  • : 後面必需要與空格
  • 不容許tab
  • =不能空格

主要元素:redis

  • Tasks: 任務,由模板定義的操做列表sql

  • Variables: 變量shell

  • Templates: 模板,即便用模板語法的文件vim

  • Handlers: 處理器, 當某條件知足時, 觸發執行的操做安全

  • Roles: 角色服務器

hosts和users介紹:ssh

在playbook中的每個play均可以選擇在哪些服務器和以什麼用戶完成,hosts一行能夠是一個主機組、主機、多個主機,中間以冒號分隔,可以使用通配模式。其中remote_user表示執行的用戶帳號。

---
- hosts: abc               #指定主機組,能夠是一個或多個組。
    remote_user: root                #指定遠程主機執行的用戶名

指定遠程主機sudo切換用

# vim ping.yml
---
- hosts: abc
    remote_user: root            
    become: yes                #2.6版本之後的參數,以前是sudo,意思爲切換用戶運行
    become_user: mysql          #指定sudo用戶爲mysql

執行playbook
# ansible-playbook ping.yml -K

Tasks list和action介紹

1:Play的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在全部主機上完成第一個任務後再開始第二個任務。
在運行playbook時(從上到下執行),若是一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,而後從新執行便可。
Task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量,模塊執行時冪等的,這意味着屢次執行是安全的,由於其結果一致。

2:每個task必須有一個名稱name,這樣在運行playbook時,從其輸出的任務執行信息中能夠很好的辨別出是屬於哪個task的。若是沒有定義name,‘action’的值將會用做輸出信息中標記特定的task。

3:定義一個task,常見的格式:」module: options」 例如:yum: name=httpd
4:ansible的自帶模塊中,command模塊和shell模塊無需使用key=value格式

經常使用命令

ansible-playbook [yaml文件名,也能夠結尾]

例如: ansible-playbook a.yml

參數:

-k(–ask-pass) 用來交互輸入ssh密碼

-K(-ask-become-pass) 用來交互輸入sudo密碼

-u 指定用戶

.

# ansible-playbook a.yml --syntax-check    #檢查yaml文件的語法是否正確
    # ansible-playbook a.yml --list-task       #檢查tasks任務
    # ansible-playbook a.yml --list-hosts      #檢查生效的主機
    # ansible-playbook a.yml --start-at-task='Copy Nginx.conf'     #指定從某個task開始運行

示例:

# vim a.yml
---
- hosts: 192.168.200.129                  //指定主機
    remote_user: root                         //指定在被管理的主機上執行任務的用戶
    tasks:                                            //任務列表↓
     - name: disable selinux                //任務名關閉防火牆
       command: '/sbin/setenforce 0'    //調用command模塊 執行關閉防火牆命令
     - name: start httpd                         //任務名 開啓httpd
       service: name=httpd state=started         //調用service模塊 開啓httpd 服務
# ansible-playbook a.yml --syntax-check    #檢查yaml文件的語法是否正確
# ansible-playbook a.yml

五種傳參方式

第一種:

- hosts: web
  tasks:
  - name: creste{{user}}
    user: name{{user}}


ansible-playbook -e user=hui pp.yml

第二種:

在 /etc/ansible/hosts 中定義參數:

10.0.0.[132:133] user=alex14
10.0.0.135  user=alex12


ansible-playbook pp.yml

第三種:

在 /etc/ansible/hosts 中:

[web(組名):vars]
user=KongHui


ansible-playbook pp.yml

第四種:

- hosts: web
  vars:
  - user: KongHui
    user: name={{user}}


ansible-playbook pp.yml

第五種傳參方式:

- hosts: web
 tasks:
 - name: yunbc
   yum: name=bc
 - name: sum
   shell: echo 8+9|bc
   register: user
 - name: echo
   shell: echo{{user.stdout}} >/tem/sum.txt
 - name: createuser{{user.stdout}}
   user: name=alex{{user.stdout}}

優先級

-e > playbook的vars > hosts文件

經常使用元素詳解

tags

在一個playbook中, 咱們通常會定義不少個task, 若是咱們只想執行其中的某一個taskh=或多個task時就可使用tags標籤功能了

- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    copy: dest=/etc/redis.conf src=/etc/redis.conf
    tags: copyfile
  - name: sredistart
    service: name=redis state=started 
 ansible-playbook -t copyfile p7.yml

handlers

andlers也是一些task的列表,和通常的task並無什麼區別。
是由通知者進行的notify,若是沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
無論有多少個通知者進行了notify,等到play中的全部task執行完成以後,handlers也只會被執行一次

template

Jinja是基於Python的模板引擎。template類是Jinja的另外一個重要組件,能夠看做一個編譯過的模塊文件,用來生產目標文本,傳遞Python的變量給模板去替換模板中的標記。

能夠獲取setup獲取的變量

- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: dest=/etc/redis.conf src=/etc/redis.conf
    tags: copy
    notify: restart
  - name: start
    service: name=redis state=started
  handlers:
  - name: restart
    service: name=redis state=restarted

.

- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: dest=/etc/redis.conf src=redis.conf
    tags: copy
    notify: restart
  - name: start
    service: name=redis state=started
  handlers:
  - name: restart
    service: name=redis state=restarted
須要在本地的目錄下建立一個templates目錄,就能夠用相對路徑

when

加條件

- hosts: web
  tasks:
  - name: file
    copy: content="大弦嘈嘈如急雨" dest=/opt/file
    when: ansible_distribution_major_version=="7"
  - name: file
    copy: content="小弦切切如私語" dest=/opt/file
    when: ansible_distribution_major_version=="6"

.

- hosts: web
  tasks:
  - name: file
    copy: content="大弦嘈嘈如急雨\n" dest=/opt/file
    when: sum=="7"
  - name: file
    copy: content="小弦切切如私語\n" dest=/opt/file
    when: sum=="6"
ansible-playbook -e sum=7 p11.yml

循環

- hosts: web
  tasks:
  - name: file
    user: name={{item}}
    with_items:
    - alex20
    - alex21

.

- hosts: web
  tasks:
  - name: creategroup
    group: name={{item}}
    with_items:
    - wusir20
    - wusir21
  - name: file
    user: name={{item}}
    with_items:
    - alex22
    - alex23

嵌套循環

- hosts: web
  tasks:
  - name: creategroup
    group: name={{item}}
    with_items:
    - wusir22
    - wusir23
  - name: file
    user: name={{item.name}} group={{item.group}}
    with_items:
    - {"name":alex24,"group":wusir22}
    - {"name":alex25,"group":wusir23}
相關文章
相關標籤/搜索