Ansible playbook简单示例

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 ~]#

5、playbook的条件和循环

Ansible中有众多的模块,可以写playbook,同时里面也可以写条件判断和循环,这样基本上脚本能做的事情ansible大体都可以作了。条件判断使用when,循环使用with_items,接下来看一下如何使用的简单实例。

5.1条件判断

需要开启facts变量功能, gather_facts: no 或者是false是关闭,gather_facts:yes 或者是true都是开启。

[root@node1 ~]# vi when.yml
[root@node1 ~]# cat when.yml 
---
- hosts: node2,node3
  gather_facts: true
  tasks:
     - name: "redhat-test"
       shell: echo "RedHat"  `date` by `hostname` >> /tmp/hello.log
       when:  ansible_os_family ==  "RedHat"
     - name:  "other linux"
       shell: echo "Not RedHat"  `date` by `hostname` >> /tmp/hello.log
       when:  ansible_os_family !=  "RedHat"
[root@node1 ~]#
[root@node1 ~]# ansible-playbook when.yml

PLAY [node2,node3] **************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [node2]
ok: [node3]

TASK [redhat-test] **************************************************************************************************************************************************************************
changed: [node3]
changed: [node2]

TASK [other linux] **************************************************************************************************************************************************************************
skipping: [node2]
skipping: [node3]

PLAY RECAP **********************************************************************************************************************************************************************************
node2                      : ok=2    changed=1    unreachable=0    failed=0   
node3                      : ok=2    changed=1    unreachable=0    failed=0   


[root@node1 ~]# 
[root@node2 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
RedHat Sun Nov 12 08:44:00 EST 2017 by node2
[root@node2 ~]# 
[root@node3 ~]# cat /tmp/hello.log
/opt/jdk1.8.0_112
RedHat Sun Nov 12 08:44:00 EST 2017 by node3
[root@node3 ~]#

5.2循环

[root@node1 ~]# vi with_items.yml
[root@node1 ~]# cat with_items.yml
- hosts: node2,node3
  gather_facts: true
  tasks:
    - name:  "循环测试"
      shell: echo {{item}}  `date` by `hostname` >> /tmp/hello.log
      with_items:
        - message item1
        - message item2
        - message item3
        - message item4
        - message item5
[root@node1 ~]# ansible-playbook with_items.yml 

PLAY [node2,node3] ********************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************
ok: [node2]
ok: [node3]

TASK [循环测试] ***************************************************************************************************************
changed: [node2] => (item=message item1)
changed: [node3] => (item=message item1)
changed: [node3] => (item=message item2)
changed: [node2] => (item=message item2)
changed: [node3] => (item=message item3)
changed: [node2] => (item=message item3)
changed: [node2] => (item=message item4)
changed: [node3] => (item=message item4)
changed: [node2] => (item=message item5)
changed: [node3] => (item=message item5)

PLAY RECAP ****************************************************************************************************************
node2                      : ok=2    changed=1    unreachable=0    failed=0   
node3                      : ok=2    changed=1    unreachable=0    failed=0   

[root@node1 ~]# 
[root@node2 ~]# cat /tmp/hello.log
message item1 Sun Nov 12 08:54:50 EST 2017 by node2
message item2 Sun Nov 12 08:54:51 EST 2017 by node2
message item3 Sun Nov 12 08:54:51 EST 2017 by node2
message item4 Sun Nov 12 08:54:51 EST 2017 by node2
message item5 Sun Nov 12 08:54:52 EST 2017 by node2
[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log
message item1 Sun Nov 12 08:54:50 EST 2017 by node3
message item2 Sun Nov 12 08:54:51 EST 2017 by node3
message item3 Sun Nov 12 08:54:51 EST 2017 by node3
message item4 Sun Nov 12 08:54:52 EST 2017 by node3
message item5 Sun Nov 12 08:54:52 EST 2017 by node3
[root@node3 ~]# 

6、通过Playbook安装apache

yum模块: 目的:在指定节点上安装 apache 服务 命令:ansible all -m yum -a “state=present name=httpd” state=latest=>>安装最新版本 service模块: 目的:启动指定节点上的 httpd 服务,并让其开机自启动 命令:ansible 10.1.1.113 -m service -a ‘name=httpd state=restarted enabled=yes’

[root@node1 ~]# vi apache.yml 
[root@node1 ~]# cat apache.yml 
---
- hosts: node2
  remote_user: root
  gather_facts: true
  tasks:
   - name: "install apache on CentOS"
     yum: name=httpd state=present
     when: ansible_os_family =="RedHat"
   - name: "install apache on Debian"
     yum: name=apache2 state=present
     when: ansible_os_family =="Debian"
   - name: "启动Apache,并设置开机启动"
     service: name=httpd state=started enabled=yes
[root@node1 ~]# ansible-playbook apache.yml 

PLAY [node2] ********************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [node2]

TASK [install apache on CentOS] *************************************************************************************************
ok: [node2]

TASK [install apache on Debian] *************************************************************************************************
skipping: [node2]

TASK [启动Apache,并设置开机启动] *********************************************************************************************************
changed: [node2]

PLAY RECAP **********************************************************************************************************************
node2                      : ok=3    changed=1    unreachable=0    failed=0   

[root@node1 ~]# 
[root@node2 ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2017-11-13 08:40:59 EST; 1s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 2908 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
 Main PID: 2913 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─2913 /usr/sbin/httpd -DFOREGROUND
           ├─2914 /usr/sbin/httpd -DFOREGROUND
           ├─2915 /usr/sbin/httpd -DFOREGROUND
           ├─2916 /usr/sbin/httpd -DFOREGROUND
           ├─2917 /usr/sbin/httpd -DFOREGROUND
           └─2918 /usr/sbin/httpd -DFOREGROUND

Nov 13 08:40:59 node2 systemd[1]: Starting The Apache HTTP Server...
Nov 13 08:40:59 node2 httpd[2913]: AH00558: httpd: Could not reliably determine the server's fully qualified domain nam...message
Nov 13 08:40:59 node2 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node2 ~]#

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

记一次sql server 性能调优,查询从20秒至2秒

记一次sql server 性能调优,查询从20秒至2秒 一、需求 需求很简单,就是需要查询一个报表,只有1个表,数据量大约60万左右,但是中间有些逻辑。 先说...

2846
来自专栏高性能服务器开发

windows完成端口(二)

系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) ...

35811
来自专栏java一日一条

使用 RMI + ZooKeeper 实现远程调用框架

在 Java 世界里,有一种技术可以实现“跨虚拟机”的调用,它就是 RMI(Remote Method Invocation,远程方法调用)。例如,服务A 在 ...

312
来自专栏IT技术精选文摘

跟着实例学习ZooKeeper的用法: 临时节点

使用Curator也可以简化Ephemeral Node (临时节点)的操作。 临时节点驻存在ZooKeeper中,当连接和session断掉时被删除。 比如通...

2385
来自专栏杨建荣的学习笔记

有趣的rownum测试(r10笔记第49天)

rownum在平时的使用中总是一个很自然的语法。如果说这个rownum是否有规律,可能很多人都会模棱两可。到底是还是不是呢,我们来做几个测试来说明。 这个结果也...

32412
来自专栏函数式编程语言及工具

PICE(6):集群环境里多异类端点gRPC Streaming - Heterogeneous multi-endpoints gRPC streaming

   gRPC Streaming的操作对象由服务端和客户端组成。在一个包含了多个不同服务的集群环境中可能需要从一个服务里调用另一个服务端提供的服务。这时调用服...

763
来自专栏一英里广度一英寸深度的学习

Zookeeper 分布式环境中的注册表

ZooKeeper 典型的应用场景,限于篇幅就不详细展开,百度或https://www.jianshu.com/p/1e052bddba80

1053
来自专栏Jed的技术阶梯

zookeeper编程01-循环监听

客户端发起对节点的事务操作(以NodeChildrenChanged事件为例) 服务端监听到对应的事件后进行相应的操作

1532
来自专栏张善友的专栏

Net Framework 2.0 事务处理

事务 处理事务是构建许多业务逻辑的一个重要方面。 .NET Framework 2.0 中的事务 在 .NET Framework 2...

1678
来自专栏代码世界

Python之黏包的解决

黏包的解决方案 发生黏包主要是因为接收者不知道发送者发送内容的长度,因为tcp协议是根据数据流的,计算机操作系统有缓存机制, 所以当出现连续发送或连续接收的时候...

3039

扫码关注云+社区