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