1、簡介php
Ansible is a radically simple configuration-management, application deployment, task-execution, and multinode orchestration engine.html
Design Principlesnode
Have a dead simple setup process and a minimal learning curvepython
Be super fast & parallel by defaultmysql
Require no server or client daemons; use existing SSHdlinux
Use a language that is both machine and human friendlynginx
Focus on security and easy auditability/review/rewriting of contentgit
Manage remote machines instantly, without bootstrappingweb
Allow module development in any dynamic language, not just Pythonsql
Be usable as non-root
Be the easiest IT automation system to use, ever.
2、安裝
ansible依賴於Python 2.6或更高的版本、paramiko、PyYAML及Jinja2。
2.1 編譯安裝
解決依賴關係
# yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
# tar xf ansible-1.5.4.tar.gz
# cd ansible-1.5.4
# python setup.py build
# python setup.py install
# mkdir /etc/ansible
# cp -r examples/* /etc/ansible
2.2 rpm包安裝
# yum install -y ansible
注意:不一樣版本的ansible的功能差別可能較大。
3、簡單應用
配置文件 /etc/ansible/
ansible.cfg #主配置文件
hosts #主機列表定義
管理方式通常分2種:
ssh key : 祕鑰登陸 (推薦)
[root@ansible ~]# ssh-keygen -t rsa (直接回車便可)
[root@ansible ~]# for i in {1..4}; do ssh-copy-id -i 192.168.78.1$i; done
祕鑰認證舉個例子吧: vi /etc/ansible/hosts
[web]
192.168.78.11
192.168.78.12
[mysql]
192.168.78.13
192.168.78.14
passwd : 密碼登陸
注:須要在ansible.cfg主配置文件中開啓 host_key_checking = False 不然將提示下面錯誤信息
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.
(將須要參數寫在hosts中)
ansible_ssh_host #用於指定被管理的主機的真實IP
ansible_ssh_port #用於指定鏈接到被管理主機的ssh端口號,默認是22
ansible_ssh_user #ssh鏈接時默認使用的用戶名
ansible_ssh_pass #ssh鏈接時的密碼
ansible_sudo_pass #使用sudo鏈接用戶時的密碼
ansible_sudo_exec #若是sudo命令不在默認路徑,須要指定sudo命令路徑
ansible_ssh_private_key_file #祕鑰文件路徑,祕鑰文件若是不想使用ssh-agent管理時可使用此選項 ansible_shell_type #目標系統的shell的類型,默認sh
ansible_connection #SSH 鏈接的類型: local , ssh , paramiko,在 ansible 1.2 以前默認是 paramiko ,後來智能選擇,優先使用基於 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter #用來指定Python解釋器的路徑,默認爲/usr/bin/python 一樣能夠指定ruby 、perl 的路徑
ansible_*_interpreter #其餘解釋器路徑,用法和ansible_python_interpreter相似,這裏"*"能夠是ruby或才perl等其餘語言
太亂了,密碼認證舉個例子吧: vi /etc/ansible/hosts
[test]
192.168.1.1 ansible_ssh_user=root ansible_ssh_pass='P@ssw0rd'
192.168.1.2 ansible_ssh_user=breeze ansible_ssh_pass='123456'
192.168.1.3 ansible_ssh_user=bernie ansible_ssh_port=3055 ansible_ssh_pass='456789'
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
Options:
-m MODULE\_NAME, --module-name=MODULE\_NAME 要執行的模塊,默認爲 command
-a MODULE_ARGS, --args=MODULE_ARGS 模塊的參數
-u REMOTE_USER, --user=REMOTE_USER ssh 鏈接的用戶名,默認用 root,ansible.cfg 中能夠配置
-k, --ask-pass 提示輸入 ssh 登陸密碼,當使用密碼驗證登陸的時候用
-s, --sudo sudo 運行
-U SUDO_USER, --sudo-user=SUDO_USER sudo 到哪一個用戶,默認爲 root
-K, --ask-sudo-pass 提示輸入 sudo 密碼,當不是 NOPASSWD 模式時使用
-B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N/A)
-P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using
-B (default=15)
-C, --check 只是測試一下會改變什麼內容,不會真正去執行
-c CONNECTION 鏈接類型(default=smart)
-f FORKS, --forks=FORKS fork 多少個進程併發處理,默認 5
-i INVENTORY, --inventory-file=INVENTORY 指定 hosts 文件路徑,默認 default =/etc/ansible/hosts
-l SUBSET, --limit=SUBSET 指定一個 pattern,對<host_pattern>已經匹配的主機中再過濾一次
--list-hosts 只打印有哪些主機會執行這個 playbook 文件:不是實際執行該 playbook
-M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認爲/usr/share/ansible/
-o, --one-line 壓縮輸出,摘要輸出
--private-key=PRIVATE_KEY_FILE 私鑰路徑
-T TIMEOUT, --timeout=TIMEOUT ssh 鏈接超時時間,默認 10 秒
-t TREE, --tree=TREE 日誌輸出到該目錄,日誌文件名會以主機名命名
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)
[-m module_name] [-a args] 下面介紹一些常常用到的模塊及實例
copy模塊:
目的:把主控端/root目錄下的a.sh文件拷貝到到指定節點上
命令:ansible 10.1.1.113 -m copy -a ‘src=/root/a.sh dest=/tmp/ owner=root group=root mode=0755‘
file模塊:
目的:更改指定節點上/tmp/t.sh的權限爲755,屬主和屬組爲root
命令:ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root"
cron模塊:
目的:在指定節點上定義一個計劃任務,每隔3分鐘到主控端更新一次時間
命令:ansible all -m cron -a ‘name="custom job" minute=\*/3 hour=\* day=\* month=\* weekday=\* job="/usr/sbin/ntpdate 172.16.254.139"‘
group模塊:
目的:在全部節點上建立一個組名爲nolinux,gid爲2014的組
命令:ansible all -m group -a ‘gid=2014 name=nolinux‘
user模塊:
目的:在指定節點上建立一個用戶名爲nolinux,組爲nolinux的用戶
命令:ansible 10.1.1.113 -m user -a ‘name=nolinux groups=nolinux state=present‘
刪除用戶
命令:ansible 10.1.1.113 -m user -a ‘name=nolinux state=absent remove=yes‘
yum模塊:
目的:在指定節點上安裝 apache 服務
命令:ansible all -m yum -a "state=present name=httpd"
state=latest=>>安裝最新版本
service模塊:
目的:啓動指定節點上的 httpd 服務,並讓其開機自啓動
命令:ansible 10.1.1.113 -m service -a ‘name=httpd state=restarted enabled=yes‘
script模塊:
目的:在指定節點上執行/root/a.sh腳本(該腳本是在ansible主控端)
命令:ansible 10.1.1.113 -m script -a ‘/root/a.sh‘
ping模塊:
目的:檢查指定節點機器是否還能連通
命令:ansible 10.1.1.113 -m ping
command模塊:
目的:在指定節點上運行hostname命令
命令:ansible 10.1.1.113 -m command -a ‘hostname‘
raw模塊:
目的:在10.1.1.113節點上運行ifconfig命令
命令:ansible 10.1.1.113 -m raw-a ‘ifconfig|eth0‘
get_url模塊:
目的:將http://10.1.1.116/favicon.ico文件下載到指定節點的/tmp目錄下
命令:ansible 10.1.1.113 -m get_url -a ‘url=http://10.1.1.116/favicon.ico dest=/tmp‘
stat模塊:
目的:獲取遠程文件狀態信息,包括atime、ctime、mtime、md五、uid、gid等信息
ansible web -m stat -a ‘path=/etc/sysctl.conf‘
synchronize模塊:
目的:將主控方/root/a目錄推送到指定節點的/tmp目錄下
命令:ansible 10.1.1.113 -m synchronize -a ‘src=/root/a dest=/tmp/ compress=yes‘
執行效果:
delete=yes 使兩邊的內容同樣(即以推送方爲主)
compress=yes 開啓壓縮,默認爲開啓
--exclude=.git 忽略同步.git結尾的文件
mode=pull 更改推送模式爲拉取模式
目的:將10.1.1.113節點的/tmp/a目錄拉取到主控節點的/root目錄下
命令:ansible 10.1.1.113 -m synchronize -a ‘mode=pull src=/tmp/a dest=/root/‘
注:模塊太多了,須要更多模塊請使用ansible-doc -l查詢模塊名稱, 而後ansible-doc -s MODULES_NAME 查詢詳細的使用參數
ansible-doc: Show Ansible module documentation
-l, --list List available modules
-s, --snippet Show playbook snippet for specified module(s)
#工做案例:批量切換倉庫
#批量co
ansible gameservers -a 'mkdir -p /data/wwwroot/mxw2code/'
ansible gameservers -m shell -a "echo 'yes'|/usr/bin/svn co --username='mxw2code' --password='d8cjI7erXIr9v0d' svn://192.168.10.71/mxw2_php /data/wwwroot/mxw2code/"
ansible gameservers -a '/usr/bin/svn info /data/wwwroot/mxw2code/'
#切換倉庫 115.182.55.139
ansible gameservers -m shell -a "chdir=/data/wwwroot/mxw2code/ echo 'yes'|/usr/bin/svn switch --relocate svn://192.168.10.71/mxw2_php svn://192.168.10.73/mxw2_php --username='mxw2code' --password='d8cjI7erXIr9v0d'"
ansible gameservers -m shell -a "/usr/bin/svn up /data/wwwroot/mxw2code/"
#執行啓動命令
ansible gameservers -m shell -a "chdir=/data/wwwroot/mxw2code/server/bin/ sh restart.sh"
#檢查進程數
ansible gameservers -m shell -a 'ps aux|grep -E "dbsvrd|proxyd|sceneserver|platform|tcpsvrd|gstcpsvrd"|grep -v grep|wc -l'
#####分割線以上能掌握已經解決了大部分批量管理工做,若是須要自動化流程工做,須要下面高級的內容,劇本和roles功能#######
4、YAML
4.1 YAML介紹
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其餘多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy dt Net與Oren Ben-Kiki也是這語言的共同設計者。
YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思實際上是:"Yet Another Markup Language"(還是一種標記語言)。其特性:
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據類型
YAML有一個一致的信息模型
YAML易於實現
YAML能夠基於流來處理
YAML表達能力強,擴展性好
更多的內容及規範參見http://www.yaml.org。
4.2 YAML語法
YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構。其結構(Structure)經過空格來展現,序列(Sequence)裏的項用"-"來表明,Map裏的鍵值對用":"分隔。下面是一個示例。
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age 13
gender: Female
YAML文件擴展名一般爲.yaml,如example.yaml。
4.2.1 list
列表的全部元素均使用「-」打頭,例如:
# A list of tasty fruits
- Apple
- Orange
- Strawberry
- Mango
4.2.2 dictionary
字典經過key與value進行標識,例如:
---
# An employee record
name: Example Developer
job: Developer
skill: Elite
也能夠將key:value放置於{}中進行表示,例如:
---
# An employee record
{name: Example Developer, job: Developer, skill: Elite}
5、Ansible基礎元素
5.1 變量
5.1.1 變量命名
變量名僅能由字母、數字和下劃線組成,且只能以字母開頭。
5.1.2 facts
facts是由正在通訊的遠程目標主機發回的信息,這些信息被保存在ansible變量中。要獲取指定的遠程主機所支持的全部facts,可以使用以下命令進行:
# ansible hostname -m setup
5.1.3 register
把任務的輸出定義爲變量,而後用於其餘任務,示例以下:
tasks:
- shell: /usr/bin/foo
register: foo_result
ignore_errors: True
5.1.4 經過命令行傳遞變量
在運行playbook的時候也能夠傳遞一些變量供playbook使用,示例以下:
ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"
5.1.5 經過roles傳遞變量
當給一個主機應用角色的時候能夠傳遞變量,而後在角色內使用這些變量,示例以下:
- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
5.2 Inventory
ansible的主要功用在於批量主機操做,爲了便捷地使用其中的部分主機,能夠在inventory file中將其分組命名。默認的inventory file爲/etc/ansible/hosts。
inventory file能夠有多個,且也能夠經過Dynamic Inventory來動態生成。
5.2.1 inventory文件格式
inventory文件遵循INI文件風格,中括號中的字符爲組名。能夠將同一個主機同時歸併到多個不一樣的組中;此外,當如若目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口號來標明。
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
若是主機名稱遵循類似的命名模式,還可使用列表的方式標識各主機,例如:
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
5.2.2 主機變量
能夠在inventory中定義主機時爲其添加主機變量以便於在playbook中使用。例如:
[webservers]
www1.magedu.com http_port=80 maxRequestsPerChild=808
www2.magedu.com http_port=8080 maxRequestsPerChild=909
5.2.3 組變量
組變量是指賦予給指定組內全部主機上的在playboo中可用的變量。例如:
[webservers]
www1.magedu.com
www2.magedu.com
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
5.2.4 組嵌套
inventory中,組還能夠包含其它的組,而且也能夠向組中的主機指定變量。不過,這些變量只能在ansible-playbook中使用,而ansible不支持。例如:
[apache]
httpd1.magedu.com
httpd2.magedu.com
[nginx]
ngx1.magedu.com
ngx2.magedu.com
[webservers:children]
apache
nginx
[webservers:vars]
ntp_server=ntp.magedu.com
5.2.5 inventory參數
ansible基於ssh鏈接inventory中指定的遠程主機時,還能夠經過參數指定其交互方式;這些參數以下所示:
ansible_ssh_host
The name of the host to connect to, if different from the alias you wish to give to it.
ansible_ssh_port
The ssh port number, if not 22
ansible_ssh_user
The default ssh user name to use.
ansible_ssh_pass
The ssh password to use (this is insecure, we strongly recommend using --ask-pass or SSH keys)
ansible_sudo_pass
The sudo password to use (this is insecure, we strongly recommend using --ask-sudo-pass)
ansible_connection
Connection type of the host. Candidates are local, ssh or paramiko. The default is paramiko before Ansible 1.2, and 'smart' afterwards which detects whether usage of 'ssh' would be feasible based on whether ControlPersist is supported.
ansible_ssh_private_key_file
Private key file used by ssh. Useful if using multiple keys and you don't want to use SSH agent.
ansible_shell_type
The shell type of the target system. By default commands are formatted using 'sh'-style syntax by default. Setting this to 'csh' or 'fish' will cause commands executed on target systems to follow those shell's syntax instead.
ansible_python_interpreter
The target host python path. This is useful for systems with more
than one Python or not located at "/usr/bin/python" such as \*BSD, or where /usr/bin/python
is not a 2.X series Python. We do not use the "/usr/bin/env" mechanism as that requires the remote users
path to be set right and also assumes the "python" executable is named python, where the executable might
be named something like "python26".
ansible\_\*\_interpreter
Works for anything such as ruby or perl and works just like ansible_python_interpreter.
This replaces shebang of modules which will run on that host.
5.3 條件測試
若是須要根據變量、facts或此前任務的執行結果來作爲某task執行與否的前提時要用到條件測試。
5.3.1 when語句
在task後添加when子句便可使用條件測試;when語句支持Jinja2表達式語法。例如:
tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "Debian"
when語句中還可使用Jinja2的大多「filter」,例如要忽略此前某語句的錯誤並基於其結果(failed或者sucess)運行後面指定的語句,可以使用相似以下形式:
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
此外,when語句中還可使用facts或playbook中定義的變量。
5.4 迭代
當有須要重複性執行的任務時,可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句來指明迭代的元素列表便可。例如:
- name: add several users
user: name=` item ` state=present groups=wheel
with_items:
- testuser1
- testuser2
上面語句的功能等同於下面的語句:
- name: add user testuser1
user: name=testuser1 state=present groups=wheel
- name: add user testuser2
user: name=testuser2 state=present groups=wheel
事實上,with_items中可使用元素還可爲hashes,例如:
- name: add several users
user: name=` item`.`name ` state=present groups=` item`.`groups `
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', groups: 'root' }
ansible的循環機制還有更多的高級功能,具體請參見官方文檔(http://docs.ansible.com/playbooks_loops.html)。
7、ansible playbooks
playbook是由一個或多個「play」組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色。從根本上來說,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,便可以讓它們聯同起來按事先編排的機制同唱一臺大戲。下面是一個簡單示例。
- hosts: webnodes
vars:
http_port: 80
max_clients: 256
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
7.1 playbook基礎組件
7.1.1 Hosts和Users
playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用於指定要執行指定任務的主機,其能夠是一個或多個由冒號分隔主機組;remote_user則用於指定遠程主機上的執行任務的用戶。如上面示例中的
-hosts: webnodes
remote_user: root
不過,remote_user也可用於各task中。也能夠經過指定其經過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶。
- hosts: webnodes
remote_user: mageedu
tasks:
- name: test connection
ping:
remote_user: mageedu
sudo: yes
7.1.2 任務列表和action
play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的全部主機上執行,即在全部主機上完成第一個任務後再開始第二個。在運行自下而下某playbook時,若是中途發生錯誤,全部已執行任務都將回滾,所以,在更正playbook後從新執行一次便可。
task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致。
每一個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟。若是未提供name,則action的結果將用於輸出。
定義task的可使用「action: module options」或「module: options」的格式,推薦使用後者以實現向後兼容。若是action一行的內容過多,也中使用在行首使用幾個空白字符進行換行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
在衆多模塊中,只有command和shell模塊僅須要給定一個列表而無需使用「key=value」格式,例如:
tasks:
- name: disable selinux
command: /sbin/setenforce 0
若是命令或腳本的退出碼不爲零,可使用以下方式替代:
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
7.1.3 handlers
用於當關注的資源發生變化時採起必定的操做。
「notify」這個action可用於在每一個play的最後被觸發,這樣能夠避免屢次有改變發生時每次都執行指定的操做,取而代之,僅在全部的變化發生完成後一次性地執行指定操做。在notify中列出的操做稱爲handler,也即notify中調用handler中定義的操做。
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handler是task列表,這些task與前述的task並無本質上的不一樣。
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
案例:
heartbeat.yaml
- hosts: hbhosts
remote_user: root
tasks:
- name: ensure heartbeat latest version
yum: name=heartbeat state=present
- name: authkeys configure file
copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
- name: authkeys mode 600
file: path=/etc/ha.d/authkeys mode=600
notify:
- restart heartbeat
- name: ha.cf configure file
copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
notify:
- restart heartbeat
handlers:
- name: restart heartbeat
service: name=heartbeat state=restarted
8、roles
ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中,並能夠便捷地include它們的一種機制。角色通常用於基於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。
一個roles的案例以下所示:
site.yml
webservers.yml
dbservers.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'" }
8.1 建立role的步驟
(1) 建立以roles命名的目錄;
(2) 在roles目錄中分別建立以各角色名稱命名的目錄,如webservers等;
(3) 在每一個角色命名的目錄中分別建立files、handlers、meta、tasks、templates和vars目錄;用不到的目錄能夠建立爲空目錄,也能夠不建立;
(4) 在playbook文件中,調用各角色;
8.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文件;
9、Tags
tags用於讓用戶選擇運行playbook中的部分代碼。ansible具備冪等性,所以會自動跳過沒有變化的部分,即使如此,有些代碼爲測試其確實沒有發生變化的時間依然會很是地長。此時,若是確信其沒有變化,就能夠經過tags跳過此些代碼片段。
10、Jinja2相關
10.1 字面量
表達式最簡單的形式就是字面量。字面量表示諸如字符串和數值的 Python 對象。下面 的字面量是可用的:
「Hello World」:
雙引號或單引號中間的一切都是字符串。不管什麼時候你須要在模板中使用一個字 符串(好比函數調用、過濾器或只是包含或繼承一個模板的參數),它們都是 有用的。
42 / 42.23:
直接寫下數值就能夠建立整數和浮點數。若是有小數點,則爲浮點數,不然爲 整數。記住在 Python 裏, 42 和 42.0 是不同的。
[‘list’, ‘of’, ‘objects’]:
一對中括號括起來的東西是一個列表。列表用於存儲和迭代序列化的數據。例如 你能夠容易地在 for 循環中用列表和元組建立一個連接的列表:
<ul>
{% for href, caption in [('index.html', 'Index'), ('about.html', 'About'),
('downloads.html', 'Downloads')] %}
<li><a href="` href `">` caption `</a></li>
{% endfor %}
</ul>
(‘tuple’, ‘of’, ‘values’):
元組與列表相似,只是你不能修改元組。若是元組中只有一個項,你須要以逗號 結尾它。元組一般用於表示兩個或更多元素的項。更多細節見上面的例子。
{‘dict’: ‘of’, ‘key’: ‘and’, ‘value’: ‘pairs’}:
Python 中的字典是一種關聯鍵和值的結構。鍵必須是惟一的,而且鍵必須只有一個 值。字典在模板中不多使用,罕用於諸如 xmlattr() 過濾器之類。
true / false:
true 永遠是 true ,而 false 始終是 false 。
10.2 算術運算
Jinja 容許你用計算值。這在模板中不多用到,可是爲了完整性容許其存在。支持下面的 運算符:
+
把兩個對象加到一塊兒。一般對象是素質,可是若是二者是字符串或列表,你能夠用這 種方式來銜接它們。不管如何這不是首選的鏈接字符串的方式!鏈接字符串見 ~ 運算符。 {{ 1 + 1 }} 等於 2 。
-
用第一個數減去第二個數。 ` 3 - 2 ` 等於 1 。
/
對兩個數作除法。返回值會是一個浮點數。 {{ 1 / 2 }} 等於 ` 0`.`5 ` 。
//
對兩個數作除法,返回整數商。 {{ 20 // 7 }} 等於 2 。
%
計算整數除法的餘數。 {{ 11 % 7 }} 等於 4 。
*
用右邊的數乘左邊的操做數。 {{ 2 * 2 }} 會返回 4 。也能夠用於重 復一個字符串屢次。 {{ ‘=’ * 80 }} 會打印 80 個等號的橫條。
**
取左操做數的右操做數次冪。 {{ 2**3 }} 會返回 8 。
10.3 比較操做符
==
比較兩個對象是否相等。
!=
比較兩個對象是否不等。
>
若是左邊大於右邊,返回 true 。
>=
若是左邊大於等於右邊,返回 true 。
<
若是左邊小於右邊,返回 true 。
<=
若是左邊小於等於右邊,返回 true 。
10.4 邏輯運算符
對於 if 語句,在 for 過濾或 if 表達式中,它能夠用於聯合多個表達式:
and
若是左操做數和右操做數同爲真,返回 true 。
or
若是左操做數和右操做數有一個爲真,返回 true 。
not
對一個表達式取反(見下)。
(expr)
表達式組。