Ansible playbook简单示例
来源:互联网 发布:windows桌面管理工具 编辑:程序博客网 时间:2024/06/05 01:16
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.ymlPLAY [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.logHello World Sun Nov 12 07:50:48 EST 2017 by node2[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.logHello 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.ymlPLAY [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.ymlPLAY [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.loghello,world Sun Nov 12 07:51:48 EST 2017 by node2[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.loghello,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.ymlPLAY [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.ymlPLAY [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_112RedHat Sun Nov 12 08:44:00 EST 2017 by node2[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.log/opt/jdk1.8.0_112RedHat 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.logmessage item1 Sun Nov 12 08:54:50 EST 2017 by node2message item2 Sun Nov 12 08:54:51 EST 2017 by node2message item3 Sun Nov 12 08:54:51 EST 2017 by node2message item4 Sun Nov 12 08:54:51 EST 2017 by node2message item5 Sun Nov 12 08:54:52 EST 2017 by node2[root@node2 ~]#
[root@node3 ~]# cat /tmp/hello.logmessage item1 Sun Nov 12 08:54:50 EST 2017 by node3message item2 Sun Nov 12 08:54:51 EST 2017 by node3message item3 Sun Nov 12 08:54:51 EST 2017 by node3message item4 Sun Nov 12 08:54:52 EST 2017 by node3message 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 -DFOREGROUNDNov 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...messageNov 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 ~]#
- Ansible playbook简单示例
- Ansible playbook
- ansible-playbook
- ansible playbook
- ansible playbook
- ansible小结(八)ansible-playbook简单使用
- ansible playbook最佳实践
- ansible-playbook简介
- Ansible Playbook 介绍
- ansible之playbook入门
- Ansible 基础入门-Playbook
- 部署ansible以及简单示例
- Ansible系列(5): Playbook
- Ansible playbook lookups 和 conditionals
- Ansible之playbook学习一
- ansible使用playbook安装nginx
- ansible之创建可复用playbook
- ansible-playbook批量部署nginx
- Linux下非ROOT权限安装MySQL
- Redis 专栏(使用介绍、源码分析、常见问题...)
- 测试人眼中的车联网(比亚迪云服务-3.2.1)——车辆定位、寻车
- 实战一、电力窃漏用户自动识别
- 股票数据定向爬虫
- Ansible playbook简单示例
- elasticsearch调优经验
- poj3463 Sightseeing(最短路计数+次短路计数)
- websocket的应用场景
- Java Web后端--入职技能任务单(Mysql5.7安装和数据准备)四
- table隔行变色
- Java NIO Selector
- 【WEB】JS常见错误与处理错误策略
- 按键检测