playbooks是 一個不一樣於使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來講,playbook是一個很是簡單的配置管理和多主機部署系統,不一樣於任何已經存在的模式,可做爲一個適合部署複雜應用程序的基礎。Playbook能夠定製配置,能夠按照指定的操做步驟有序執行,支持同步和異步方式。值得注意的是playbook是經過YAML格式來進行描述定義的。linux
語法:web
主要元素: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文件
在一個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
andlers也是一些task的列表,和通常的task並無什麼區別。
是由通知者進行的notify,若是沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
無論有多少個通知者進行了notify,等到play中的全部task執行完成以後,handlers也只會被執行一次
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目錄,就能夠用相對路徑
加條件
- 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}