1、什麼是playbooks
playbooks是ansible的腳本、如同shell腳本同樣,它是控制遠程主機的一系列命令的集合,經過YAML語言編寫。執行一些簡單的任務,咱們可使用ad-hoc命令就能夠解決,對於一些較複雜的任務,ad-hoc就不能勝任了,這時候playbooks就派上用場了,在playbooks中能夠編排有序的執行過程,甚至能夠在多組機器間來回有序的執行特定的步驟,而且能夠同步或異步發起任務。html
2、YAML語法
一、文件開始符mysql
---
二、數組linux
- name - hosts - user
三、字典nginx
name: restart apache service: name=httpd state=restarted
字典與字典的嵌套:git
vars: http_port: 80 max_clients: 200
字典與數組的嵌套:github
tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started
此外,Ansible 使用 "{{ var }}"來引用變量.,若是一個值以 "{" 開頭, YAML 將認爲它是一個字典, 因此咱們必須引用它, 像這樣:foo: "{{ variable }}"web
3、playbooks的基本用法
最基本的playbook分爲四部分:sql
hosts users
variable
tasks
handlers
簡單示例:shell
--- - name: Install apache hosts: webservers user: root gather_facts: false vars: http_port: 80 max_clients: 200 tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started handlers: - name: restart apache service: name=httpd state=restarted
說明:apache
一、主機和用戶
key | 含 義 |
hosts | 爲主機的IP,或者主機組名,或者關鍵字all |
user | 在遠程以哪一個用戶身份執行。 |
become | 切換成其它用戶身份執行,值爲yes或者no |
become_method | 與became一塊兒用,指能夠爲‘sudo’/’su’/’pbrun’/’pfexec’/’doas’ |
become_user | 與bacome一塊兒用,能夠是root或者其它用戶名 |
通常用法:
--- - hosts: webserver, [all] user: root
還能夠在每一個 task 中,定義遠程執行用戶
--- - hosts: webserver user: root tasks: - name: test connection ping: remote_user: root
也支持 sudo 方法,在 task中一樣支持,在sudo須要密碼時,能夠加上選項 –ask-sudo-pass
--- - hosts: all user: test sudo: yes task: - service: name=nginx state=started sudo: yes sudo_user: root
二、任務列表
tasks 是從上到下順序執行,若是中間發生錯誤,整個 playbook 便會中斷。
每個 task 是對module的一次調用,一般會帶有特定參數,參數可使用變量。
每個 task 有一個 name 屬性,name 值會在命令行中輸出,以提示用戶,若是沒有定義,aciton 的值會做爲輸出信息來標記task。
語法:
tasks: - name: make sure apache is running service: name=httpd state=running // 若是參數過長,可使用空格或者縮進分隔爲多行 tasks: - name: copy ansible inventory file to client copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts owner=root group=root mode=0644 // 或者使用 yaml 的字典做爲參數 tasks: - name: copy ansible inventory file to client copy: src: /etc/ansible/hosts dest: /etc/ansible/hosts owner: root group: root mode: 0644 // 大部分的模塊都是使用 `key-value` 這種格式的,其中有兩個比較特殊,command 和 shell 模塊。 tasks: - name: disable selinux command: /sbin/setenforce 0 tasks: - name: run this command and ignore the result shell: /usr/bin/command || /bin/true tasks: - name: run some command and ignore the reslut shell: /usr/bin/somecommadn ignore_error: True
執行狀態:
task中每一個action會調用一個module,在module中會去檢查當前系統狀態是否須要從新執行。
若是本次執行了,那麼action會獲得返回值changed
若是不須要執行,那麼action獲得返回值ok
三、響應事件
每一個主流的編程語言都會有event機制,那麼handler就是playbook的event。
Handlers裏面的每個handler,也是對module的一次調用。而handlers與tasks不一樣,tasks會默認的按定義順序執行每個task,handlers則不會,它須要在tasks中被調用,纔有可能被執行。Tasks中的任務都是有狀態的,changed或者ok。 在Ansible中,只在task的執行狀態爲changed的時候,纔會執行該task調用的handler,這也是handler與普通的event機制不一樣的地方。
什麼狀況下使用handlers呢?
若是你在tasks中修改了apache的配置文件。須要重起apache。此外還安裝了apache的插件。那麼還須要重起apache。像這樣的應該場景中,重啓apache就能夠設計成一個handler。
特性:
在全部的任務裏表執行以後執行,若是有多個task notify同一個handler,那麼只執行一次。
在下面的例子裏apache只執行一次
--- - hosts: lb remote_user: root vars: random_number1: "{{ 10000 | random }}" random_number2: "{{ 10000000000 | random }}" tasks: - name: Copy the /etc/hosts to /tmp/hosts.{{ random_number1 }} copy: src=/etc/hosts dest=/tmp/hosts.{{ random_number1 }} notify: - call in every action - name: Copy the /etc/hosts to /tmp/hosts.{{ random_number2 }} copy: src=/etc/hosts dest=/tmp/hosts.{{ random_number2 }} notify: - call in every action handlers: - name: call in every action debug: msg="call in every action, but execute only one time"
只有當TASKS種的action的執行狀態是changed時,纔會觸發notify handler的執行。
下面的腳本執行兩次,執行結果是不一樣的:
第一次執行是,tasks的狀態都是changed,會觸發兩個handler
第二次執行是,
第一個task的狀態是OK,那麼不會觸發handlers"call by /tmp/hosts",
第二個task的狀態是changed,觸發了handler"call by /tmp/hosts.random_number"
//示例代碼 --- - hosts: lb remote_user: root vars: random_number: "{{ 10000 | random }}" tasks: - name: Copy the /etc/hosts to /tmp/hosts copy: src=/etc/hosts dest=/tmp/hosts notify: - call by /tmp/hosts - name: Copy the /etc/hosts to /tmp/hosts.{{ random_number }} copy: src=/etc/hosts dest=/tmp/hosts.{{ random_number }} notify: - call by /tmp/hosts.random_number handlers: - name: call by /tmp/hosts debug: msg="call first time" - name: call by /tmp/hosts.random_number debug: msg="call by /tmp/hosts.random_number"
andlers是按照在handlers中定義個順序執行的,而不是安裝notify的順序執行的。
下面的例子定義的順序是1>2>3,notify的順序是3>2>1,實際執行順序:1>2>3
--- - hosts: lb remote_user: root gather_facts: no vars: random_number1: "{{ 10000 | random }}" random_number2: "{{ 10000000000 | random }}" tasks: - name: Copy the /etc/hosts to /tmp/hosts.{{ random_number1 }} copy: src=/etc/hosts dest=/tmp/hosts.{{ random_number1 }} notify: - define the 3nd handler - name: Copy the /etc/hosts to /tmp/hosts.{{ random_number2 }} copy: src=/etc/hosts dest=/tmp/hosts.{{ random_number2 }} notify: - define the 2nd handler - define the 1nd handler handlers: - name: define the 1nd handler debug: msg="define the 1nd handler" - name: define the 2nd handler debug: msg="define the 2nd handler" - name: define the 3nd handler debug: msg="define the 3nd handler"
四、變量
playbook中經常使用變量的幾種狀況:
用戶能夠在Playbook中,經過vars關鍵字自定義變量,使用時用{{ }}引用以來便可。
示例:
--- - hosts: web vars: http_port: 80 remote_user: root tasks: - name: insert firewalld rule for httpd firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes
當變量比較多的時候,或者變量須要在多個playbook中重用的時候,能夠把變量放到一個單獨的文件中。經過關鍵字var_files把文件中定義的變量引入playbook中,使用變量的方法和在本文件中定義的變量相同。
- hosts: web remote_user: root vars_files: - vars/server_vars.yml tasks: - name: insert firewalld rule for httpd firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes #cat vars/server_vars.yml http_port: 80
定義複雜的變量
當變量的值不是簡單的字符串或者數字,而是一個字典,語法以下
foo: field1: one field2: two
訪問複雜變量中的子屬性,能夠利用中括號或者點號:
foo['field1'] 或 foo.field1
ansible會經過module setup來收集主機的系統信息,這些收集到的系統信息叫作facts,這些facts信息能夠直接以變量的形式使用。
有哪些facts變量能夠引用呢?在命令行上經過調用setup module命令能夠查看:
$ ansible all -m setup -u root
系統變量在playbook中能夠直接使用:
--- - hosts: all user: root tasks: - name: echo system shell: echo {{ ansible_os_family }} - name install ntp on Debian linux apt: name=git state=installed when: ansible_os_family == "Debian" - name install ntp on redhat linux yum: name=git state=present when: ansible_os_family == "RedHat"
對於複雜的、多層級的facts變量,能夠經過下面的兩種方式的任意一種訪問複雜的變量中的子屬性:
中括號:
{{ ansible_ens3["ipv4"]["address"] }}
點號:
{{ ansible_ens3.ipv4.address }}
關係facts變量,一旦關閉以後就不用調用了。關閉方法:
- hosts: webserver gather_facts: no
把task的執行結果也能夠做爲一個變量值。這個時候就須要用到「註冊變量」,將執行結果註冊到一個變量中,待後面的action使用。
--- - hosts: web tasks: - shell: ls register: result ignore_errors: True - shell: echo "{{ result.stdout }}" when: result.rc == 5 - debug: msg="{{ result.stdout }}"
註冊變量常常和debug module一塊兒使用,這樣能夠獲得更多action的輸出信息,幫助用戶調試。
爲了使Playbook更靈活、通用性更強,容許用戶在執行的時候傳入變量的值,這個時候就須要用到「額外變量」。
定義命令行變量
在test.yml文件裏,hosts和user都定義爲變量,須要從命令行傳遞變量值。
--- - hosts: '{{ hosts }}' remote_user: '{{ user }}' tasks: ...
在命令行裏面傳值得的方法:
ansible-playbook testyml --extra-vars "hosts=web user=root"
還能夠用json格式傳遞參數:
ansible-playbook test.yml --extra-vars "{'hosts':'vm-rhel7-1', 'user':'root'}"
還能夠將參數放在文件裏面:
ansible-playbook test.yml --extra-vars "@vars.json"
五、如何執行playbook
語法:
$ ansible-playbook deploy.yml
查看輸出的細節
$ ansible-playbook playbook.yml --verbose
查看該腳本影響哪些hosts
$ ansible-playbook playbook.yml --list-hosts
並行執行腳本
$ ansible-playbook playbook.yml -f 10
4、playbooks的高級用法
一、邏輯控制
主機爲Debian Linux馬上關機:
tasks: - name: "shutdown Debian flavored systems" command: /sbin/shutdown -t now when: ansible_os_family == "Debian"
根據action的執行結果,來決定接下來執行的action
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
遠程中的系統變量facts變量做爲when的條件,用「|int」還能夠轉換返回值的類型:
--- - hosts: web tasks: - debug: msg="only on Red Hat 7, derivatives, and later" when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6
條件表達式
基本:
tasks: - shell: echo "This certainly is epic!" when: epic
否認:
tasks: - shell: echo "This certainly isn't epic!" when: not epic
變量定義:
tasks: - shell: echo "I've got '{{ foo }}' and am not afraid to use it!" when: foo is defined - fail: msg="Bailing out. this play requires 'bar'" when: bar is not defined
數值表達:
tasks: - command: echo {{ item }} with_items: [ 0, 2, 4, 6, 8, 10 ] when: item > 5
與Include一塊兒用:
- include: tasks/sometasks.yml when: "'reticulating splines' in output"
與Role一塊兒用:
- hosts: webservers roles: - { role: debian_stock_config, when: ansible_os_family == 'Debian' }
標準循環
爲了保持簡潔,重複的任務能夠用如下簡寫的方式:
- name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1
若是你在變量文件中或者 'vars' 區域定義了一組YAML列表,你也能夠這樣作:
vars: somelist: ["testuser1", "testuser2"] tasks: -name: add several user user: name={{ item }} state=present groups=wheel with_items: "{{somelist}}"
使用 'with_items' 用於迭代的條目類型不只僅支持簡單的字符串列表.若是你有一個哈希列表,那麼你能夠用如下方式來引用子項:
- name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel' } - { name: 'testuser2', groups: 'root' }
注意:若是同時使用 when 和 with_items (或其它循環聲明),when聲明會爲每一個條目單獨執行。
嵌套循環:
- name: give users access to multiple databases mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo with_nested: - [ 'alice', 'bob' ] - [ 'clientdb', 'employeedb', 'providerd'] 或者 - name: give users access to multiple databases mysql_user: name={{ item.0 }} priv={{ item.1 }}.*:ALL append_privs=yes password=foo with_nested: - [ 'alice', 'bob' ] - [ 'clientdb', 'employeedb', 'providerd']
對字典使用循環:
--- vars: users: alice: name: Alice Appleworth telephone: 123-456-7890 bob: name: Bob Bananarama telephone: 987-654-3210 tasks: - name: Print phone records debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})" with_dict: "{{users}}"
對文件列表使用循環
with_fileglob 能夠以非遞歸的方式來模式匹配單個目錄中的文件.以下面所示:
tasks: # first ensure our target directory exists - file: dest=/etc/fooapp state=directory # copy each file over that matches the given pattern - copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600 with_fileglob: - /playbooks/files/fooapp/*
多個action組裝成塊,能夠根據不一樣條件執行一段語句 :
tasks: - block: - yum: name={{ item }} state=installed with_items: - httpd - memcached - template: src=templates/src.j2 dest=/etc/foo.conf - service: name=bar state=started enabled=True when: ansible_distribution == 'CentOS' become: true become_user: root
組裝成塊處理異常更方便:
tasks: - block: - debug: msg='i execute normally' - command: /bin/false - debug: msg='i never execute, cause ERROR!' rescue: - debug: msg='I caught an error' - command: /bin/false - debug: msg='I also never execute :-(' always: - debug: msg="this always executes"
二、重用playbook
Playbook支持兩種重用機制,一種是重用靜態Playbook腳本,另一種是相似於編程語言中函數的機制。
Include語句的功能,基本的代碼重用機制。主要重用tasks。同時Include可將tasks分割成多個文件,避免Playbook過於臃腫,使用戶更關注於總體的架構,而不是實現的細節上。
普通用法
像其它語言的Include語句同樣,直接Include:
--- # possibly saved as tasks/firewall_httpd_default.yml - name: insert firewalld rule for httpd firewalld: port=80/tcp permanent=true state=enabled immediate=yes main.yml文件中調用include的方法: tasks: - include: tasks/firewall_httpd_default.yml
高級用法-使用參數
include文件中還能夠定義參數
被include的文件tasks/firewall_httpd_default.yml中,使用{{ port }}定義了一個名字爲port的參數。
--- - name: insert firewalld rule for httpd firewalld: port={{ port }}/tcp permanent=true state=enabled immediate=yes
傳參數的各類方法
在執行的playbook傳參數,能夠加在行尾,使用空格分隔:
tasks: - include: tasks/firewall.yml port=80 - include: tasks/firewall.yml port=3260 - include: tasks/firewall.yml port=423
還可使用yml的字典傳參數:
tasks: - include: wordpress.yml vars: wp_user: timmy ssh_keys: - keys/one.txt - keys/two.txt
還能夠把一條task簡寫成成一個類JSON的形式傳參數:
- { include: wordpress.yml, wp_user: timmy, ssh_keys: [ 'keys/one.txt', 'keys/two.txt' ] }
固然在playbook中已經定義了的參數,就不須要再顯示傳入值了,能夠直接寫成下面的:
--- - hosts: lb vars: port: 3206 remote_user: root tasks: - include: tasks/firewall.yml
Role是比include更強大靈活的代碼重用和分享機制。Include相似於編程語言中的include,是重用單個文件的,功能有限。
而Role相似於編程語言中的「Package」,能夠重用一組文件造成完整的功能。例如安裝和配置apache,須要tasks實現安裝包和拷貝模版等,httpd.conf和index.html的模版文件,和handler文件實現重起功能。這些文件均可以放在一個role裏面,供不一樣的playbook文件重用。
Ansible很是提倡在playbook中使用role,而且提供了一個分享role的平臺Ansible Galaxy, https://galaxy.ansible.com/, 在galaxy上能夠找到別人寫好的role。
在ansible中,經過遵循特定的目錄結構,就能夠實現對role的定義:
下面的目錄結構定義了一個role:名字爲myrole。在site.yml,調用了這個role。
role的目錄結構:
site.yml roles/ ├── myrole ├── tasks │ └── main.yml ├── handlers │ └── main.yml ├── defaults │ └── main.yml ├── vars │ └── main.yml ├── files ├── templates ├── README.md ├── meta │ └── main.yml └── tests ├── inventory └── test.yml
site.yml中調用role
--- - hosts: webservers roles: - myrole
ansible並不要求role包含上述全部的目錄及文件,根據role的功能須要加入對應的目錄和文件。下面是每一個目錄和文件的功能。
若是 roles/x/tasks/main.yml 存在, 其中列出的 tasks 將被添加到 play 中,因此這個文件也能夠視做role的入口文件,想看role作了什麼操做,能夠今後文件看起。
若是 roles/x/handlers/main.yml 存在, 其中列出的 handlers 將被添加到 play 中
若是 roles/x/vars/main.yml 存在, 其中列出的 variables 將被添加到 play 中
若是 roles/x/meta/main.yml 存在, 其中列出的 「角色依賴」 將被添加到 roles 列表中
roles/x/tasks/main.yml中全部tasks,能夠引用 roles/x/{files,templates,tasks}中的文件,不須要指明文件的路徑。
在寫role的時候,通常都要包含role入口文件roles/x/tasks/main.yml,其它的文件和目錄,能夠根據需求選擇加入。
參數在role中是如何定義的呢
定義一個帶參數的role,名字是myrole,那麼目錄結構爲:
main.yml roles role_with_var tasks main.yml
在roles/myrole/tasks/main.yml中,使用{{ }}定義的變量就能夠了
--- - name: use param debug: msg="{{ param }}"
使用帶參數的role
那麼在main.yml就能夠用以下的方法使用myrole
--- - hosts: webservers roles: - { role: myrole, param: 'Call some_role for the 1st time' } - { role: myrole, param: 'Call some_role for the 2nd time' }
或者寫成YAML字典格式:
--- - hosts: webservers roles: - role: myrole param: 'Call some_role for the 1st time' - role: myrole param: 'Call some_role for the 2nd time'
role指定默認的參數
指定默認參數後,若是在調用時傳參數了,那麼就使用傳入的參數值.若是調用的時候沒有傳參數,那麼就使用默認的參數值.
指定默認參數很簡單,以上面的role_with_var爲例
main.yml roles: myrole tasks main.yml defaults main.yml
在roles/myrole/defaults/main.yml中,使用yml的字典定義語法定義param的值,以下:
param: "I am the default value"
這樣在main.yml中,下面兩種調用方法均可以
--- - hosts: webservers roles: - role_with_var - { role: role_with_var, param: 'I am the value from external' }
role與條件語句when一塊兒執行,下面的例子中,my_role只有在RedHat系列的server上才執行。
--- - hosts: webservers roles: - { role: my_role, when: "ansible_os_family == 'RedHat'" } 一樣也能夠寫成YAML字典格式 --- - hosts: webservers roles: - role: my_role when: "ansible_os_family == 'RedHat'" roles和tasks的執行順序
若是一個playbook同時出現role和tasks,他們的調用順序以下:
pre_tasks > role > tasks > post_tasks
--- - hosts: lb user: root pre_tasks: - name: pre shell: echo 'hello' roles: - { role: some_role } tasks: - name: task shell: echo 'still busy' post_tasks: - name: post shell: echo 'goodbye' 執行的結果爲: PLAY [lb] ********************************************************************** TASK [setup] ******************************************************************* ok: [rhel7u3] TASK [pre] ********************************************************************* changed: [rhel7u3] TASK [some_role : some role] *************************************************** ok: [rhel7u3] => { "msg": "Im some role" } TASK [task] ******************************************************************** changed: [rhel7u3] TASK [post] ******************************************************************** changed: [rhel7u3] PLAY RECAP ********************************************************************* rhel7u3 : ok=5 changed=3 unreachable=0 failed=0
三、tags的用法
若是playbook文件比較大,在執行的時候只是想執行部分功能,這個時候沒有有解決方案呢?Playbook提供了tags便籤能夠實現部分運行。
tags的基本用法
例如,文件example.yml如何所示,標記了兩個tag:packages和configuration
tasks: - yum: name={{ item }} state=installed with_items: - httpd tags: - packages - name: copy httpd.conf template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf tags: - configuration - name: copy index.html template: src=templates/index.html.j2 dest=/var/www/html/index.html tags: - configuration
那麼咱們在執行的時候,若是不加任何tag參數,那麼會執行全部的tasks
$ ansible-playbook example.yml
指定執行安裝部分的tasks,則能夠利用關鍵字tags
$ ansible-playbook example.yml --tags "packages"
指定不執行packages部分的task,則能夠利用關鍵字skip-tags
$ ansible-playbook example.yml --skip-tags "configuration"
特殊的Tags:「always」
tags的名字是用戶自定義的,可是若是你把tags的名字定義爲「always」,那麼就有點特別了。只要在執行playbook時,沒有明確指定不執行always tag,那麼它就會被執行。
在下面的例子中,即便你只指定執行packages,那麼always也會被執行。
tasks: - debug: msg="Always print this debug message" tags: - always - yum: name= state=installed with_items: - httpd tags: - packages - template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf tags: - configuration
指定運行packages時,仍是會執行always tag對應的tasks
$ ansible-playbook tags_always.yml --tags "packages" 「tagged」,「untagged」和「all」 tasks: - debug: msg="I am not tagged" tags: - tag1 - debug: msg="I am not tagged" 分別指定--tags爲「tagged」,「untagged」和「all」試下效果吧: $ ansible-playbook tags_tagged_untagged_all.yml --tags tagged $ ansible-playbook tags_tagged_untagged_all.yml --tags untagged $ ansible-playbook tags_tagged_untagged_all.yml --tags all
在include中和role中使用tags
include語句指定執行的tags的語法:
- include: foo.yml tags: [web,foo]
調用role中的tags的語法爲:
roles: - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }
四、playbook文件加密
ansible-vault命令能夠對配置文件進行基於密碼的加密,防止敏感信息泄漏。
加密已存在文件
$ ansible-vault encrypt site.yml
加密並建立文件
$ ansible-vault create filename
執行加密後的playbook
$ ansible-playbook site.yml --ask-vault-pass
解密
$ ansible-vault decrypt site.yml
5、編譯安裝nginx的playbook的實例
playbooks目錄結構:
$ tree playbooks playbooks ├── group_vars ├── roles │ └── nginx │ ├── files │ │ ├── nginx-1.8.0.tar.gz │ │ └── pcre-8.33.tar.gz │ ├── handlers │ │ └── main.yml │ ├── tasks │ │ └── main.yml │ └── templates │ └── default.conf └── site.yml
yml文件內內容以下:
$ cat playbooks/site.yml --- - name: Install Nginx hosts: test user: admin roles: - nginx $ cat playbooks/roles/nginx/tasks/main.yml --- - name: Copy nginx software copy: src=nginx-1.8.0.tar.gz dest=/app/admin/soft/nginx-1.8.0.tar.gz - name: Copy pcre software copy: src=pcre-8.33.tar.gz dest=/app/admin/soft/pcre-8.33.tar.gz - name: Install Pcre shell: cd /app/admin/soft;tar zxf pcre-8.33.tar.gz;cd pcre-8.33;./configure;make;make install sudo: yes - name: Install Nginx shell: cd /app/admin/soft;tar zxf nginx-1.8.0.tar.gz;cd nginx-1.8.0;./configure --user=admin --group=app --prefix=/app/admin/nginx --with-http_stub_status_module --with-http_ssl_module;make;make install - name: Copy nginx configuration template: src=default.conf dest=/app/admin/nginx/conf/nginx.conf notify: restart nginx [admin@wts-vm-01 ~]$ cat playbooks/roles/nginx/handlers/main.yml --- - name: restart nginx shell: /app/admin/nginx/sbin/nginx sudo: yes
6、其它官方例子Ansible官方提供了一些比較經常使用的、通過測試的Playbook例子:https://github.com/ansible/ansible-examplesPlaybook分享平臺:https://galaxy.ansible.com/