YAML語法
YAML最初是Yet Another Markup Language(另一種標記語言)的縮寫,後來爲了強調yaml是以數
據爲中心重新命名爲遞歸寫法YAML Ain’t
Markup Language(YAML 不是一種標記語言)。
散列表:(又叫哈希表),有鍵值對組成。
示例:
name: aaa
age: 12
或者
{name: aaa, age: 12}
列表:
示例:
- list1
- list2
- list3
或者
[list1, list2, list3]
散列表中是引用列表:
示例:
name:
- name1
- name2
列表中使用散列項:
示例:
- name: aaa
age: 18
或者
- {name: aaa, age: 18}
列表中使用列表項:
示例:
- [name, age, ]
或者
-
- name1
- name2
散列表中使用散列表:
示例:
names1:
name1: aaa
name2: bbb
name3: ccc
names2:
.....: ..
.....: ..
playbook組成結構:
Inventory
Modules
Ad Hoc Command
hosts
Playbook
Task:任務,即調用模塊完成的某操作
Variables:變量
Templates:模板
Handlers:處理器,由某事件觸發執行的操作
Roles:角色
示例:
- hosts: webnodes # hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組
vars:
http_port: 80
max_clients: 256
remote_user: root # remote_user則用於指定遠程主機上的執行任務的用戶。remote_user也可用於各task中
tasks: # 任務列表task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成
第一個任務後再開始第二個如果中途發生錯誤,所有已執行任務都有可能將回滾
- name: ensure apache is at the latest version # 在衆多模塊中,只有command和shell模塊僅需要給定
一個列表而無需使用“key=value
command: /sbin/setenforce 0
yum: name=httpd state=latest
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
運行playbook的方式:
(1) 測試
ansible-playbook --check
只檢測可能會發生的改變,但不真正執行操作;
ansible-playbook --list-hosts
列出運行任務的主機;
ansible-playbook --list-tasks
列出要運行的任務列表
ansible-playbook --syntax-check
語法檢查
handlers:
任務,在特定條件下觸發;
接收到其它任務的通知時被觸發;
notify: HANDLER TASK NAME
條件式觸發器
- hosts: web
remote_user: root
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: start nginx service
service: name=nginx enabled=true state=started
- hosts: db
remote_user: root
tasks:
- name: install redis package
yum: name=redis state=latest
- name: install conf file
copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
notify: restart redis service # 引用觸發器
tags: instconf
- name: start redis service
service: name=redis enabled=true state=started
tags: startredis
handlers: # 定義觸發器
- name: restart redis service
service: name=redis state=restarted
# 給play添加tags
- hosts: web
remote_user: root
tags: nginx service # play添加標籤
tasks:
- name: install nginx package
yum: name=nginx state=latest
- name: start nginx service
service: name=nginx enabled=true state=started
- hosts: db
remote_user: root
tags: redis service # play添加標籤
tasks:
- name: install redis package
yum: name=redis state=latest
- name: install conf file
copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
notify: restart redis service
tags: instconf
- name: start redis service
service: name=redis enabled=true state=started
tags: startredis
handlers:
- name: restart redis service
service: name=redis state=restarted
{default,file,handlers,meta,tasks,templates,vars}
例子:在webserver上面安裝nginx,在dbserver上面安裝redis,並且redis每次修改配置
文件後,會觸發重啓redis服務。
打上標籤後,可以只單獨運行標籤的那一部分
[ root@node1 ~ ]# ansible-playbook -t install nginx.yaml
- hosts: webserver
remote_user: root
tasks: #任務
- name: install nginx package
yum: name=nginx state=latest
- name: start nginx service
service: name=nginx enabled=true state=started
- hosts: dbserver
remote_user: root
tasks:
- name: install redis package
yum: name=redis state=latest
- name: install conf file
copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
tags: install
notify: restart redis service #觸發器,配置文件修改後會觸發後面的handlers
- name: start redis service
service: name=redis state=started
tags: startredis #使用標籤
handlers: #不主動使用,只能被前面觸發.
- name: restart redis service
service: name=redis state=restarted
變量
(1) facts:可直接調用;
注意:可使用setup模塊直接獲取目標主機的facters;
(2) 用戶自定義變量:
(a) ansible-playbook命令的命令行中的
-e VARS, --extra-vars=VARS
# 示例:ansible-playbook test.yml --extra-vars "name=nginx user=root"
Note:命令行的變量比playbook中的變量優先級高。
(b) 在playbook中定義變量的方法:
vars:
- var1: value1
- var2: value2
變量引用:{{ variable }}
例子:
[ root@node1 ~ ]# cat installpkc.yml
- hosts: webserver
remote_user: root
vars:
- pkgname: tree
tasks:
- name: install package {{ pkgname }}
yum: name={{ pkgname }} state=latest
[ root@node1 ~ ]# ansible-playbook -e "pkgname=memcached" -C installpkc.yml #這裏在命令行定義變量
PLAY [webserver] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.18.25.52]
ok: [172.18.25.51]
TASK [install package memcached] ***********************************************
changed: [172.18.25.51]
changed: [172.18.25.52]
(3) 通過roles傳遞變量;
(4) Host Inventory #主機清單
Note:變量優先級低
(a) 用戶自定義變量
(i) 向不同的主機傳遞不同的變量;
IP|HOSTNAME varaiable=value var2=value2
例子:
[webserver]
172.18.25.51 pkgname=redis
172.18.25.52 pkgname=memcached
(ii) 向組中的主機傳遞相同的變量;
[groupname:vars]
variable=value
例子:
[webserver]
172.18.25.51
172.18.25.52
[webserver:vars]
pkgname=redis
(b) invertory參數
用於定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansbile_sudo_pass
...
例子:一種不基於密鑰的連接方法,不推薦使用。
[webserver]
172.18.25.51 ansible_ssh_user=root ansible_ssh_pass=123
172.18.25.52 ansible_ssh_user=root
ansible_ssh_pass=centos