塘下網(wǎng)站建設(shè)深圳網(wǎng)絡(luò)推廣公司排名
playbooks 概述以及實例操作
Playbooks 組成部分:
Inventory
Modules
Ad Hoc Commands
Playbooks
Tasks: 任務(wù),即調(diào)用模塊完成的某些操作
Variables: 變量
Templates: 模板
Handlers: 處理器,由某時間觸發(fā)執(zhí)行的操作
Roles: 角色
YAML 介紹
YAML 是一個可讀性高的用來表達(dá)資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發(fā)表了這種語言。
YAML Ain’t Markup Language,即YAML不是XML。
其特性:
可讀性好
和腳本語言的交互性好
使用時限語言的數(shù)據(jù)類型
有一個一直的信息模型
易于實現(xiàn)
可以基于流來處理
表達(dá)能力強,擴展型好
YAML 語法
YAML 的語法和其他高階語言類似,并且可以簡單表達(dá)清單、散列表、變量等數(shù)據(jù)結(jié)構(gòu)。其結(jié)構(gòu)(Structure)通過空格來展示,序列(Squence)里的項用-來代辦,Map里的鍵值對用:分割
案例
name: John Smith
age: 41
gender: Male
spouse:name: Jane Smithage: 37gennder: Female
children:- name: Jimmy Smithage: 17gender: Male- name: Jenny Smithage: 13gender: Female
YAML 文件擴展名通常為: .yaml,如 example.yaml
List
列表中的所有元素均使用-打頭,例如:
# A list of t asty fruits
- Apple
- Orange
- Strawberry
- Mango
Dictionary
字典通過key與value進(jìn)行表示,例如:
# An exployee record
name: Example Developer
job: Developer
skill: Elite
也可以將key:value 放置于{}中進(jìn)行描述
# An exployee record
{name: Example Developer, job: Developer, skill: Elite}
Ansible 基礎(chǔ)元素
變量
變量名僅能由字母、數(shù)字和下劃線組成,且只能以字母開頭。
facts
facts是由正在通信的遠(yuǎn)程目標(biāo)主機發(fā)揮的信息,這些信息被保存在ansible變量中,要獲取指定額遠(yuǎn)程主機所支持的所有facts,可以使用如下命令進(jìn)行:
#ansible hostname -m setup
registre
把任務(wù)的輸出定義為變量,然后用于其他任務(wù),示例如下:
tasks:
- shell: /usr/bin/fooregister: foo_resultignore_errors: true
通過命令傳遞變量
在運行playbook的時候也可以通過一些變量供playbook使用,示例如下:
ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"
通過roles傳遞變量
當(dāng)一個主機應(yīng)用角色的時候可以傳遞變量,然后在角色內(nèi)使用這些變量,示例如下:
- hosts: webservsroles:- common- { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
Inventory
ansible 的主要功能在于批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名。默認(rèn)的Inventory file 為 /etc/ansible/hosts。
inventory file 可以有多個,且也可以通過Dynamic Inventory來動態(tài)生成
主機變量
可以在inventory中定義主機時為其添加主機變量以便于在playbook中使用。例如:
[webservs]
10.0.0.65 http_port=80 maxRequestsPerChild=888
10.0.0.66 http_port=8080 maxRequestsPerChild=909
組變量
組變量是指賦予給特定組內(nèi)所有主機上在playbook中可用的變量。例如:
[webservs:vars]
ntp_server=ntp.aliyun.com
nfs_server=nfs.aliyun.com
注意:[組名:vars] 組名中的:vars 是固定用法
組嵌套
inventory中,組還可以包含其他的組,并且也可以像組中的主機指定變量。不過這些變量只能在ansible-playbook中使用,而不支持ansible。例如:
[apache]
http1.magedu.com
http2.magedu.com
[nginx]
nginx1.magedu.com
nginx2.magedu.com
[webservs:children]
apache
nginx
[webservs:vars]
ntp_server=ntp.magedu.com
注意::childer 同樣是固定用法
inventory 參數(shù)
ansible基于ssh鏈接inventory中指定的遠(yuǎn)程主機時,還可以通過參數(shù)指定其交互方式;這些擦桉樹如下所示:
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
ansible_connection
ansible_ssh_private_key_file
ansible_shell_type
ansible_python_interpreter
ansible_*_interpreter
編寫 ansible playbooks 劇本
playbook是由一個或多個play組成的列表。play的主要功能在于將事先歸并一組的主機裝扮成事先通過ansible中的tasks定義好的角色。從根據(jù)上來講,所謂task無非是調(diào)用ansible的一個module。將多個play組織在一個playbook中,既可以讓他們聯(lián)通起來按事先編排的機制同唱一臺大戲。下面是一個簡單的示例:
- hosts: webnodesvars:http_port: 80max_clients: 256remote_user: roottasks:- name: ensure apache is at the lastest versionyum: name=httpd state=latest- name: ensure apache is runningservice: name=httpd state=startedhandlers:- name: restart apacheservice:name=httpd state=restarted
playbook 基礎(chǔ)組件
Hosts 和 Users
playbook 中的每一個play的目的都是為了讓某個或某些主機一某個指定的用戶執(zhí)行任務(wù)。hosts用于指定要執(zhí)行指定任務(wù)的主機,其可以使一個或多個由冒號分割主機組;remote_user則用于指定遠(yuǎn)程主機上的執(zhí)行任務(wù)的用戶。例如上面示例中的:
- hosts: webnodesremote_user: root
不過,remote_user也可用于各task中,也可以通過指定其通過sudo的方式在遠(yuǎn)程主機上執(zhí)行任務(wù),其可用于play全局或某任務(wù),甚至可以在sudo時sudo_user指定sudo時切換的用戶。
- hosts: webnodesremote_user: mageedutasks:- name: test connectionping:remote_user: mageedusudo: yes
任務(wù)列表和action
play的主體部分是task list。task list中的個任務(wù)按次序逐個在hosts中指定的所有主機上執(zhí)行,即在所有主機上完成第一個任務(wù)后再開始第二個。在運行playbook 時,如果中途發(fā)生錯誤,所有已執(zhí)行任務(wù)都將會滾,因此,在更正playbook后重新執(zhí)行一次即可。
task的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的,這意味著多次執(zhí)行是安全的,因為其結(jié)果均一致。
每個task都應(yīng)該有其name,用于playbook的執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟,如果為提供name,則action的結(jié)果將用于輸出
定義task的可以使用"action: module options" 或 “module: options” 的格式,推薦使用候著以實現(xiàn)向后兼容。如果action一行的內(nèi)容過度,也使用在行首使用幾個空白字符進(jìn)行換行
tasks:
- name: make sure apache is runningservice: name=htpd state=running
在眾多模塊中,只有command 和shell模塊僅需要給一個列表而無需使用"key=vale"格式,例如:
tasks:
- name: disable selinuxcommand: /sbin/setenforce 0
如果命令或腳本的退出碼不為零,可以使用如下方式替代:
tasks:
- name: run this command and ignore the resultshell: /usr/bin/somecommand || /bin/trueignore_errors: true
或者使用ignore_errors來忽略錯誤信息
tasks:
- name: run this command and ignore the resultshell: /usr/bin/somecommandignore_errors: true
playbook 案例 1
在所有的webservs組的主機上創(chuàng)建nginx用戶和用戶組
并模擬拷貝文件到dbservs中
[root@node01 ansible]# cat nginx.yml
- hosts: webservsremote_user: roottasks:- name: create nginx groupgroup: name=nginx system=yes gid=208- name: create nginx useruser: name=nginx system=yes uid=208 group=nginx
- hosts: dbservsremote_user: roottasks:- name: copy file to dbservscopy: src=/etc/inittab dest=/tmp/inittab.ans
使用ansible-playbook命令執(zhí)行:
[root@node01 ansible]# ansible-playbook nginx.yml
PLAY [webservs] ***********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.65]
TASK [create nginx group] *************************************************************************************************
changed: [10.0.0.65]
TASK [create nginx user] **************************************************************************************************
changed: [10.0.0.65]
PLAY [dbservs] ************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.66]
TASK [copy file to dbservs] ***********************************************************************************************
ok: [10.0.0.66]
PLAY RECAP ****************************************************************************************************************
10.0.0.65 : ok=3 changed=2 unreachable=0 failed=0
10.0.0.66 : ok=2 changed=0 unreachable=0 failed=0
驗證: webservs的nginx用戶和組以及dbservs的/tmp/inittab.ans文件
[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/passwd'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:208::/home/nginx:/bin/bash
[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/group'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:
[root@node01 ansible]# ansible dbservs -a 'ls -l /tmp/inittab.ans'
10.0.0.66 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans