1、 YAML基本语法
- YAML使用的Unicode字符。
- 使用空白字符为文件缩排来表示结构;不过不能使用跳格字符。
- 注解由#开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
- 每个清单成员以单行表示,并用短杠+空白( - )起始。或使用方括号( [ ] ),并用逗号+空白( , )分开成员。
- 每个杂凑表的成员用冒号+空白( : )分开键值和内容。或使用大括号( { } ),并用逗号+空白( , )分开。 杂凑表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。
- 字串平常并不使用引号,但必要的时候可以用双引号 ( ” )或单引号 ( ’ )框住。使用双引号表示字串时,可用倒斜线( \ )开始的跳脱字符(这跟C语言类似)表示特殊字符。
- 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
- 在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( … )用来表示档案结尾。
- 重复的内容可使从参考标记星号 ( * )复制到锚点标记( & )。
- 指定格式可以使用两个惊叹号 ( !! ),后面接上名称。
- 档案中的单一文件可以使用指导指令,使用方法是百分比符号( % )。有两个指导指令
2、 入门示例
[root@node1 ~]# vi hello.yml
[root@node1 ~]# cat hello.yml
---
- hosts: node2,node3
tasks:
- name: "helloworld"
shell: echo "Hello World" `date` by `hostname` > /tmp/hello.log
playbook的说明:
- hosts: 用于指定操作对象节点,多个节点用逗号分隔
- tasks: 用于指定要处理的内容
- name:task的名称,ansible可以把很多task使用playbook编排起来,通过名称,实际执行的时候可以清楚地看到执行情况
- shell: ansible的shell模块,在前面的实例中我们已经知道command/shell/raw等的区别,所以可以知道这个简单的例子中使用哪个模块都能实现这个简单的功能
[root@node1 ~]# ansible-playbook hello.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [node3]
ok: [node2]
TASK [helloworld] ***************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=2 changed=1 unreachable=0 failed=0
node3 : ok=2 changed=1 unreachable=0 failed=0
- 结果,基本上已经无需说明。
- changed有2个,unreachable和失败的都没有。
[root@node2 ~]# cat /tmp/hello.log
Hello World Sun Nov 12 07:50:48 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
Hello World Sun Nov 12 07:50:48 EST 2017 by node3
[root@node3 ~]#
什么会有setup这个task呢,那是因为default的情况下,facts是会被收集的的,我们可以通过设定参数gather_facts让其不被收集。
[root@node1 ~]# vi hello.yml
[root@node1 ~]# cat hello.yml
---
- hosts: node2,node3
gather_facts: false
tasks:
- name: "helloworld"
shell: echo "Hello World" `date` by `hostname` > /tmp/hello.log
[root@node1 ~]# ansible-playbook hello.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [helloworld] ***************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=1 changed=1 unreachable=0 failed=0
node3 : ok=1 changed=1 unreachable=0 failed=0
[root@node1 ~]#
3、playbook变量使用
Ansbile还内嵌了七个很有用的变量,使用得当也会带来很大的便利。
ansible的playbook中的变量引用使用{{ }}。
hostvars变量
groups变量
group_names变量
inventory_hostname变量
inventory_hostname_short
inventory_dir
inventory_file
在vars后设定变量message,并将此message内容输出到log中
gather_facts参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;
[root@node1 ~]# vi hello.yml
[root@node1 ~]# cat hello.yml
---
- hosts: node2,node3
vars:
- message: "hello,world"
gather_facts: false
tasks:
- name: "helloworld"
shell: echo {{message}} `date` by `hostname` > /tmp/hello.log
[root@node1 ~]# ansible-playbook hello.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [helloworld] ***************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=1 changed=1 unreachable=0 failed=0
node3 : ok=1 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# cat /tmp/hello.log
hello,world Sun Nov 12 07:51:48 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
hello,world Sun Nov 12 07:51:48 EST 2017 by node3
[root@node3 ~]#
4、Ansible中使用环境变量
[root@node1 ~]# vi java.yml
[root@node1 ~]# cat java.yml
---
- hosts: node2,node3
gather_facts: false
tasks:
- name: "java-test"
shell: echo ${JAVA_HOME} >/tmp/hello.log
[root@node1 ~]# ansible-playbook java.yml
PLAY [node2,node3] **************************************************************************************************************************************************************************
TASK [java-test] ****************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]
PLAY RECAP **********************************************************************************************************************************************************************************
node2 : ok=1 changed=1 unreachable=0 failed=0
node3 : ok=1 changed=1 unreachable=0 failed=0
[root@node1 ~]#
[root@node2 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
[root@node3 ~]#