Ansible之Playbook使用
一、Playbook是什么
playbook-劇本(也稱編排) 介紹
playbooks是 一個不同于使用Ansible命令行執行方式的模式,其功能更強大靈活。簡單來說,playbook是一個非常簡單的配置管理和多主機部署系統,不同于任何已經存在的模式,可作為一個適合部署復雜應用程序的基礎。Playbook可以定制配置,可以按照指定的操作步驟有序執行,支持同步和異步方式。我們完成一個任務,例如安裝部署一個httpd服務,我們需要多個模塊(一個模塊也可以稱之為task)提供功能來完成。而playbook就是組織多個task的容器,他的實質就是一個文件,有著特定的組織格式,它采用的語法格式是YAML(Yet Another Markup Language)。YAML語法能夠簡單的表示散列表,字典等數據結構。具體請參考YAML詳細語法。
YAML基本語法
列表:每一個列表成員前面都要有一個短橫線和一個空格。
fruits:
? ? - Apple
? ? - Orange
? ? - Strawberry
? ? - Mango
或者:
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']
字典:每一個成員由鍵值對組成,注意冒號后面要有空格。
martin:
? ? name: Martin D'vloper
? ? job: Developer
? ? skill: Elite
或者
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
列表和字典可以混合使用
- ?martin:
? ? name: Martin D'vloper
? ? job: Developer
? ? skills:
? ? ? - python
? ? ? - perl
? ? ? - pascal
- ?tabitha:
? ? name: Tabitha Bitumen
? ? job: Developer
? ? skills:
? ? ? - lisp
? ? ? - fortran
? ? ? - erlang
二、playbook基礎組件
- hosts:運行執行任務(task)的目標主機
- remote_user:在遠程主機上執行任務的用戶
- tasks:任務,由模板定義的操作列表
- handlers:任務,與tasks不同的是只有在接受到通知(notify)時才會被觸發
- templates:模板,使用模板語言的文本文件,使用jinja2語法。
- variables:變量,變量替換{{ variable_name }}
- roles:角色
hosts:用于指定要執行指定任務的主機,須事先定義在主機清單中。
示例:
- hosts: websrvs
remote_user:執行身份
(1)可用于hosts和task中。
(2)通過指定其通過sudo的方式在遠程主機上執行任務,其可用于play全局或某任務。
(3)可以在sudo時使用sudo_user指定sudo時切換的用戶
示例:
- hosts: websrvs
? remote_user: root
? tasks:
?? - name: test connection
???? ping:
???? remote_user: fz.hou
???? sudo: yes ? ? #默認sudo為root
???? sudo_user:fl ?#sudo為fl
task:任務列表
格式:
(1) action: module arguments
(2) module: arguments 建議使用
注意:shell和command模塊后面跟命令,而非key=value
示例:
tasks:
?- name: disable selinux
?? command: /sbin/setenforce 0
notify與handlers:
某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers,繼而執行handlers之后的命令。
tags:標簽
任務可以通過”tags“打標簽,而后可在ansible-playbook命令上使用-t指定進行調用
注意:如果多個任務標簽相同,標簽被調用時,任務都會被執行。
示例:安裝httpd,修改httpd配置文件,并重啟服務。
- hosts: webservers
? remote_user: root
? tasks:
??? - name: install httpd
????? yum: name=httpd
??? - name: modify config
????? copy: src=~/httpd.conf dest=/etc/httpd/conf/httpd.conf
????? tags: modify
????? notify: restart httpd
??? - name: start httpd
????? service: name=httpd state=started enabled=yes
? handlers:
??? - name: restart httpd
????? service: name=httpd state=restarted
注意:如果命令或腳本的退出碼不為零,可以使用如下方式替代:
tasks:
? - name: run this command and ignore the result
? ? shell: /usr/bin/somecommand || /bin/true
或者使用ignore_errors來忽略錯誤信息:
tasks:
? - name: run this command and ignore the result
??? shell: /usr/bin/somecommand
??? ignore_errors: True
運行playbook
運行playbook的方式
ansible-playbook <filename.yml> ... [options]
常見選項
–check 只檢測可能會發生的改變,但不真正執行操作
–list-hosts 列出運行任務的主機
–limit?主機列表 只針對主機列表中的主機執行
-v 顯示過程 -vv -vvv 更詳細
playbook變量
變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
變量來源:
1、ansible setup facts 遠程主機的所有變量都可直接調用
示例:
ansible myhosts -m setup -a 'filter=ansible_nodename'
filter是用來匹配后面的字符串,可以使用正則表達式。
也可以使用grep過濾,-C選項查看上下文三行。???????
2、在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高于公共變量
公共(組)變量:針對主機組中所有主機定義統一變量
普通變量示例:在/etc/ansible/hosts文件中定義
[myhosts]
172.18.18.22 http_port=85 hname=nginx
172.18.18.23 http_port=86 hname=httpd
編寫playbook:
cat /root/ansible/vars4.yml
? ---
? - hosts: myhosts
??? remote_user: root
??? tasks:
???? - name: set hostname
?????? hostname: name={{ hname }}-{{ http_port }}
公共(組)變量示例:在/etc/ansible/hosts文件中定義
[myhosts:vars]
myh=HFZ
編寫playbook:
cat /root/ansible/vars5.yml
? ---
? - hosts: myhosts
??? remote_user: root
??? tasks:
???? - name: set hostname
?????? hostname: name={{ myh }}-{{ hname }}-{{ http_port }}
3、通過命令行指定變量,優先級最高
ansible-playbook –e varname=value
示例:
cat /root/ansible/vars.yml
? ---
? - hosts: myhosts
??? remote_user: root
??? tasks:
???? - name: install package
?????? yum: name={{ pkname }}
4、在playbook中定義
示例:
cat cat vars2.yml
? ---
? - hosts: myhosts
??? remote_user: root
??? vars:
???? - username: user1
???? - groupname: group1
??? tasks:
???? - name: create group
?????? group: name={{ groupname }} state=present
???? - name: create user
?????? user: name={{ username }} group{{ groupname }} home=/home/{{ username }}dir
5、可以在文件中定義變量,并在playbook中調用文件。
示例:在vars.yml文件中定義變量
hi: hello
wd: world
編寫playbook:
- hosts: myhosts
? remote_user: root
? vars_files:
?? - vars.yml
? tasks:
?? - name: create file
???? file: name=/root/{{ hi }}-{{ wd }}.log state=touch
6、在role中定義
playbook中的templates模板
templates特點:
基于Jinja2語言的文本文件,嵌套有腳本。
templates功能:
根據模塊文件動態生成對應的配置文件
templates格式:
templates文件必須存放于templates目錄下,且命名為 .j2 結尾。
yaml/yml 文件需和templates目錄平級,目錄結構如下:
./
?├── temnginx.yml
?└── templates
?? └── nginx.conf.j2
Jinja2語言:
使用字面量:
??? 字符串:使用單引號或雙引號
??? 數字:整數,浮點數
??? 列表:[item1, item2, ...]
??? 元組:(item1, item2, ...)
??? 字典:{key1:value1, key2:value2, ...}
??? 布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and, or, not
流表達式:for、if、when
示例:在centos6與centos7主機上安裝httpd服務,并修改相應配置文件。
1、創建文件夾
mkdir ~/ansible/templats -pv
2、拷貝centos6與centos7主機上的httpd配置文件到主機。并修改文件名
ansible myhosts -m fetch -a 'src=/etc/httpd/conf/httpd.conf dest=~/ansible/'
3、復制文件到templats文件夾下并修改文件名,修改文件內容
mv ~/ansible/172.18.18.22/httpd.conf ~/ansible/templats/httpd-7.conf.j2
mv ~/ansible/172.18.18.22/httpd.conf ~/ansible/templats/httpd-6.conf.j2
4、編寫playbook,注意httpd.yml與templats文件夾同級
cat httpd.yml
??? - hosts: myhosts
????? remote_user: root
????? tasks:
??????? - name: install httpd
????????? yum: name=httpd
??????? - name: templates-7
????????? template: src=httpd-7.conf.j2 dest=/etc/httpd/conf/httpd.conf
????????? when: ansible_distribution_major_version == "7"
????????? notify: restart httpd
????????? tags: conf
??????? - name: templates-6
????????? template: src=httpd-6.conf.j2 dest=/etc/httpd/conf/httpd.conf
????????? when: ansible_distribution_major_version == "6"
????????? notify: restart httpd
????????? tags: conf
??????? - name: start httpd
????????? service: name=httpd state=started
????? handlers:
???????? - name: restart httpd
?????????? service: name=httpd state=restarted
條件判斷
?
多條件判斷
??
組條件判斷
自定義條件判斷
- when的值是一個條件表達式,如果條件判斷成立,這個task就執行,如果判斷不成立,則task不執行
- 如果需要根據變量、facts(setup)或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
- 在task后添加when子句即可使用條件測試:when子句支持jinjia2表達式或語法,例如:
playbook迭代
迭代:當有需要重復性執行的任務時,可以使用迭代機制
對迭代項的引用,固定變量名為”item”
要在task中使用with_items給定要迭代的元素列表
列表格式:
字符串
字典
示例:創建固定組,并把新建用戶加入到固定組中。
cat items.yml:
??? - hosts: myhosts
????? remote_user: root
????? tasks:
??????? - name: create groups
????????? group: name={{item}}
????????? with_items:
??????????? - itemgroup1
??????????? - itemgroup2
??????????? - itemgroup3
??????? - name: create users
????????? user: name={{item.username}} group={{item.groupname}}
????????? with_items:
??????????? - {username: 'testuser1',groupname: 'itemgroup1'}
??????????? - {username: 'testuser2',groupname: 'itemgroup2'}
??????????? - {username: 'testuser3',groupname: 'itemgroup3'}
playbook中template for if
示例:利用for-if和templates編寫playbook
cat for-if.yml
?? ?- hosts: myhosts
????? remote_user: root
????? vars:
??????? hosts:
????????? - {listen_port: 8080,web: nginx1,name: web1.fz.com}
????????? - {listen_port: 8081,web: nginx2,name: web2.fz.com}
????????? - {listen_port: 8082,web: nginx3}
????? tasks:
??????? - name: for-if
????????? template: src=for-if.j2 dest=/root/for-if
cat templates/for-if.j2
??? {% for host in hosts %}
??? server{
??????????? listen: {{host.listen_port}};
??? {%if host.name is defined%}
??????????? name: {{host.name}};
??? {%endif%}
??????????? web: {{host.web}};
??? }
??? {%endfor%}
playbook加密
??? - ansible-vault:管理加密解密yml文件
??? - ansible-vault encrypt hello.yml 加密
??? - ansible-vault decrypt hello.yml 解密
??? - ansible-vault view hello.yml 查看
??? - ansible-vault edit hello.yml 編輯加密文件
??? - ansible-vault rekey hello.yml 修改口令
??? - ansible-vault create new.yml 創建新文件
整理自???Ansible之Playbook詳解、案例_不學Python 改學GO的技術博客_51CTO博客
總結
以上是生活随笔為你收集整理的Ansible之Playbook使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2014年360浏览器抢票版
- 下一篇: IDE工具(16) eclipse创建动