palybook使用

####yaml语法
ansible中使用的yaml基础元素:
变量
Inventory
条件测试
迭代

playbook的组成结构
Inventory
Modules
Ad Hoc Commands
Playbooks
        Task:任务,即调用模块完成的某操作
        Variables:变量
        Templates:模板
        Handlers:处理器,由某事件触发执行的操作
        Roles:角色

#####定义/etc/ansible/hosts

两种方式:

基于ssh密码登录

不配置免密码登录,需要在hosts文件中配置

第一种:基于ssh密码登录

参数一:inventory
ansible的主要功能用于批量管理主机操作,便捷的使用部分主机,可以在inventory file中分组
默认的inventory file为/etc/ansible/hosts

1.inventory文件格式
同一主机归并到一个或者多个组中,主机使用非默认的22端口,也可以在主机名称后加冒号端口标明

  1. www.ab.com
    [webservers]
  2. www.abc.com:222
  3. www.abcd.com
  4.  
  5. [dbservers]
  6. db1.abc.com
  7. db2.abc.com
  8. db3.abc.com

如果主机遵循相似的命名模式,可以使用列表标记各个主机

  1. [webserver]
  2. www[01:30].example.com
  3.  
  4. [dbserver]
  5. db-[a:f].example.com

2.主机变量
可以在定义主机时添加远程主机变量便于在playbook中使用{http中的变量,在j2中配置}

  1. [webserver]
  2. www.ab.com http_port=80 maxRequestsPerChild=808
  3. www.abc.com http_port=8080 maxRequestsPerChild=909

3.组变量
赋予指定组内的所有主机在playbook中用的变量(vars)
可以调用组里面的变量。

  1. [webserver]
  2. www.ab.com
  3. www.bc.com
  4. [webserver:vars]
  5. host_port=80
  6. maxRequestsPerChild=890

4.组嵌套
组还包括其他组,可以在其他组中指定变量,只能在ansible-playbook中使用,ansible不支持
children中包括apache,nginx的主机。,共四台主机

  1. [apache]
  2. http1.abc.com
  3. http2.abc.com
  4. [nginx]
  5. nginx1.abc.com
  6. nginx2.abc.com
  7. [webservers:children]
  8. apache
  9. nginx
  10. [webservers:vars]
  11. host_port=80

ansible基于ssh连接inventory可以指定远程主机,通过参数指定交互式,参数如下:

  1. ansible_ssh_host
  2. ansible_ssh_port
  3. ansible_ssh_user
  4. ansible_ssh_pass
  5. ansible_sudo_pass
  6. ansible_connection
  7. ansible_ssh_private_key_file
  8. ansible_shell_type
  9. ansible_python_interpreter

第二种:不基于ssh免密码登录

即便是我们没有做关于秘钥的认证,我们也会自动使用账户和密码来登录该主机。

  1. [webservers]
  2. 192.168.133.2 ansible_ssh_user=root ansible_ssh_pass=123456
  3. 192.168.133.3 testvar="2.100

####基本结构

实例一:module_name: module_args   模块名和模块参数

  1. - host: webserver
  2. remote_user:
  3. task:
  4. - task1
  5. module_name: module_args
  6. - name: test connection
  7. ping:
  8. remote_user www
  9. sudo yes
  10. command: /sbin/setenforce 0
  11. shell /usr/bin/somecommand || /bin/true
  12. ignore_errors: True
  13. - task2
  14. module_name: module_args
  15.  
  16. - hostdbservers

在运行playbook是中途发生错误,可能会回滚,更正后,重新执行一次。
可以指定使用sudo的方式远程执行任务,用sudo到root用户执行命令。
众多模块中,只有command和shell模块仅使用给定一个列表而无需使用"key=value"
命令或脚本的退出码不为0,可以使用如上替代,命令不成功强行成功。
使用ignore_errors忽略错误信息

实例二:handlers:

  在notify中列出的操作为handler,比如之前配置了apache的配置文件,http.conf端口发生变化后,重新执行ansible-playbook后,查看远程的端口,并未发生变化。需要用到notify

引入变量:
    vars:在后面添加变量名,然后再引入变量,必须加{{}},用变量名替换。

  1. - host: webservers
  2. remote_user: root
    vars:
    - packages: httpd
  3. tasks:
  4. - name: install httpd packages
  5. yum: name={{ packages }} state=lastest
  6. - name: install configuration file for httpd
  7. copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  8. notify:
  9. - restart httpd
  10. - name: start httpd service
  11. service: enabled=true name={{ packages }} state=started
  12. handlers:
  13. - name: restart httpd
  14. service: name={{ packages }} state=restarted

实例三:将每台主机的ip地址(ansible_all_ipv4_addresses)发送到远程主机的/tmp/var.ansible文档中,查找变量名(ansible_all_ipv4_addresses用命令:ansible 192.168.133.4 -m setup ),也可以用主机传导一些变量。用组变量或者inventory变量。在主机webservers中定义变量testvar和调用ansible_ssh_host,在目标主机中调用这个变量。

  1. vi /etc/ansible/hosts
  2. [webservers]
  3. 192.168.133.2 testvar="1.100" ansible_ssh_host=root
  4. 192.168.133.3 testvar="2.100"
  5. vi test.yml
  6. - hosts: webservers
  7. remote_user: root
  8. tasks:
  9. - name: copy file
  10. copy: content="{{ ansible_all_ipv4_addresses }}, {{ testvar }}" dest=/tm/vars.ansible
  11.  
  12. 在远程主机上查看cat /tmp/vars.ansible
  13. 或者ssh 192.168.133.2 cat /tmp/vars.ansible

案例四:when条件变量

当检查系统为Debin系统时,关机。

  1. - name: "shutdown Debian system"
  2. command: /sbin/shutdown -h now
  3. when: ansible_os_family == "Debin"

当ansible_fqdn == "www.test.com"时,创建user10用户

  1. - hosts: all
  2. remote_user: root
  3. vars:
  4. - username: user10
  5. tasks:
  6. - name: create {{ username }} user
  7. user: name={{ username }}
  8. when: ansible_fqdn == "www.test.com"

案例五:迭代:
    当有需要重复性执行的任务时,可以用迭代机制,使用格式为将需要迭代的内容定义为item变量引用
    并通过with_items语句来指明迭代的元素列表即可

- name: add several users
      user: name={{ item }} state=present groups=wheel
      with_items:
         - testuser1
         - testuser2
    上面的语句功能等同于下面的语句:
    - name: add several users1
      user: name=testuser1 state=present groups=wheel
    - name: add several users2
      user: name=testuser2 state=present groups=wheel

事实上with_items可以使用元素还可为hashes,

注意:name: 'testuser1'调用的是item.name;group: 'wheel'调用的是item.groups,

其中item.后面的name是自己定义的,with_items中的子名字name是自己定义的,和item.后面定义的一致。

  1. - name: add several users
  2. user: name={{ item.name }} state=present groups={{ item.groups }}
  3. with_items:
  4. - { name: 'testuser1', group: 'wheel' }
  5. - { name: 'testuser2', group: 'root' }

案例六:template:模板
  比如两台远程服务器要监听的端口不同,maxclients不同,而且主机名不同。可以调用模板。j2代表模板。在本地创建模板文件httpd.conf.j2,在yml中定义template

  1. cd /root/ && mkdir templates && cp conf/httpd.conf templates/
  2. mv templates/httpd.conf template/httpd.conf.j2
  3. vim httpd.conf.j2
  4. Listen {{ http_port}}
  5. MaxClients {{ maxClients}}
  6. ServerName {{ ansbible_fqdn }}
  7.  
  8. vi /etc/ansible/hosts
  9. [webservers]
  10. 192.168.133.2 http_port=80 maxClients=100
  11. 192.168.133.3 http_port=8080 maxClients=200
  12.  
  13. vi apache.yml
  14. - host: webservers
  15. remote_user: root
  16. vars:
  17. - package: httpd
  18. tasks:
  19. - name: install httpd packages
  20. yum: name={{ package }} state=lastest
  21. - name: install configuration file for httpd
  22. template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  23. notify:
  24. - restart httpd
  25. - name: start httpd service
  26. service: enabled=true name={{ package }} state=started
  27. handlers:
  28. - name: restart httpd
  29. service: name=httpd state=restarted
  30.  
  31. ansible-playbook apache.yml

案例七:tags

多次运行playbook时,其中某些task不需要运行,只需运行某个task,可以单独标记该task,在yml中指定tags。
在playbook可以为某个或某些任务定义为一个标签,在执行playbook时,通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks而非所有的。

其中tags中的conf和service为自己命名的。特殊:不能定义为always

  1. vi apache.yml
  2. - host: webservers
  3. remote_user: root
  4. vars:
  5. - package: httpd
  6. tasks:
  7. - name: install httpd packages
  8. yum: name={{ package }} state=lastest
  9. - name: install configuration file for httpd
  10. template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  11. tags
  12. - conf
  13. notify:
  14. - restart httpd
  15. - name: start httpd service
  16. service: enabled=true name={{ package }} state=started
    tags
    - service
  17. handlers:
  18. - name: restart httpd
  19. service: name=httpd state=restarted
  20.  
  21. ansible-playbook apache.yml --tags="conf"
  1. ansible-playbook apache.yml --tags="service"

案例八:roles,推荐使用

推荐使用此种模式

roles:
1.目录名同文件名
2.目录结构有固定格式
    files:静态文件
    templates:Jinjia2模板文件
    tasks:至少有main.yml文件,定义各tasks
    handlers:至少一个main.yml文件,定义各handlers
    vars:至少有一个main.yml文件,定义变量
    meta:定义依赖关系等信息
3.site.yml中定义playbook,额外有其他的yml文件。

roles能根据层次型结构目录装载变量文件,task已经handlers,使用roles需要在playbook中
使用include指令即可。roles通过将变量,文件,任务,模块,处理器放置到单独的目录找那中

  1. roles案例:
  2. tree ansible_playbook
  3. site.yml
  4. webservers.yml
  5. dbservers.yml
  6. roles/
  7. common/
  8. files/
  9. templates/
  10. tasks/
  11. handlers/
  12. vars/
  13. meta/
  14. webservers/
  15. files/
  16. templates/
  17. tasks/
  18. handlers/
  19. vars/
  20. meta/
  21.    

在playbook中,可以这样使用roles:
- hosts: webservers
  roles:
    - common
    - webservers

也可以向 roles传递参数,例如:

  1. - hosts: webservers
  2. roles
  3. - common
  4. - { role: foo app instance, dir:'/opt/a, port: 5000 }
  5. - { role: foo app instance, dir: '/opt/b', port: 5001 }

甚至也可以条件式地使用 roles,例如

  1. - hosts: webservers
  2. roles
  3. I - { role: some_role, when:"ansible_os_ family =='RedHat'" }

1.创建role的步骤
(1)创建以 roles命名的目录
(2)在 roles目录中分别创建以各角色名称命名的目录,如 webservers等
(3)在每个角色命名的目录中分别创建f11es、 handlers、meta、 tasks、 templates和vars目录:用不到的目录可以创建为空目录,也可以不创建
(4)在p1 abook文件中,调用各角色
2.role内各目录中可用的文件
tasks目录:至少应该包含一个名为man.ym1的文件,其定义了此角色的任务列表:此文件可以使用 include包含其它的位于此目录中的task文件;
fi1es目录,存放由copy或script等模块调用的文件
templates目录: template模块会自动在此目录中寻找]inja2模板文件
handlers目录:此目录中应当包含一个main
ym1文件,用于定义此角色用到的各 handler;在 handler中使用 include包含的其它的 handler文件也应该位于此目录中
vars目录:应当包含一个main,ym1文件,用于定义此角色用到的变量
meta目录:应当包含一个main,ym1文件,用于定义此角色的特殊设定及其依赖关系; ansi1e1.3及其以后的版本才支持
default目录:为当前角色设定默认变量时使用此目录:应当包含一个main.ym1文件

Tags
tags用于让用户选择运行或路过 playbook中的部分代码。 ansi1e具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生
变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

案例:172.168.100.1配置成webserver,172.168.100.2配置成dbservers,172.168.100.3配置成web和db

  1. mkdir -pv ansible_playbook/roles/{webservers,dbservers}/{tasks,files,templates,meta,handlers,vars}
  2. cd roles/webservers/
  3. cp /etc/httpd/conf/httpd.conf files/
  4. vim tasks/main.yml
  5. - name: install httpd packages
  6. - yum: name=httpd
  7. - nane: install configuration file
  8. - copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  9. tags:
  10. - conf
  11. notify:
  12. - restart httpd
  13. - name: start httpd
  14. service: name=httpd state=started
  15.  
  16. vim handler/main.yml
  17. - name: restart httpd
  18. - service: name=httpd state=restarted
  19. 如果有vars可以配置,此示例中不使用
  20. vim vars/main.yml
  21. - http_port: 80
  22. - maxClients: 200
  23.  
  24. 如果想掉用webservers,在roles目录之外创建site.yml文件
  25. vim ansible_playbook/site.yml
  26. - hosts: webservers
  27. remote_user: root
  28. roles:
  29. - webservers
  30.  
  31. - hosts: 172.168.100.1
  32. remote_user: root
  33. roles:
  34. - dbservers
  35.  
  36. - hosts: 172.168.100.2
  37. remote_user: root
  38. roles:
  39. - dbservers
  40. - webservers

同理在dbservers进行配置。
ansible-playbook site.yml

ansible中playbook使用的更多相关文章

  1. 二、Ansible中playbook的变量

    先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debug模块,debug模块将其打印输出 verbosity:debug的任务级别   1:在playbo ...

  2. Ansible中playbook的变量

    转自:http://www.cnblogs.com/lemon-le/p/6862788.html 先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debu ...

  3. ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢?根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等 ...

  4. Ansible进阶--playbook的使用

    一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...

  5. ansible基础-playbook剧本的使用

    ansible基础-playbook剧本的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高,用来表达数据序 ...

  6. Ansible之playbook的使用总结 - 运维笔记

    之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...

  7. ansible中常用模块详解

    ansible中常用的模块详解: file模块 ansible内置的可以查看模块用法的命令如下: [root@docker5 ~]# ansible-doc -s file - name: Sets ...

  8. Ansible 之Playbook

    ansbile playbook是一系列ansible命令的集合,利用yaml 语言编写,playbook命令根据自上而下的顺序依次执行.同时,playbook开创了很多特性,它可以允许你传输某个命令 ...

  9. Ansible的Playbook的编写

    在Ansible中,将各个模块组合起来成为一个YAML格式的配置文件,这个配置文件叫做Playbook, Playbook和模块的关系类似于shell脚本和Linux命令之间的关系. Playbook ...

随机推荐

  1. 《Ruby on Rails教程》学习笔记

    本文是我在阅读 Ruby on Rails 教程的简体中文版时所做的摘录,以及学习时寻找的补充知识.补充知识主要来自于 Ruby on Rails 實戰聖經. Asset Pipeline 在最新版 ...

  2. innobackupex备份脚本

    #!/bin/bash # 10 23 * * * /bin/bash /data/script/backup.sh BDATE=`date +%Y%m%d%H%M%S`BPATH=/data/bac ...

  3. Codeforces Round #324 (Div. 2) A B C D E

    A,水题不多说. #include<bits/stdc++.h> using namespace std; //#define LOCAL int main() { #ifdef LOCA ...

  4. python_69_内置函数1

    #abs()取绝对值 ''' all(iterable) Return True if all elements of the iterable are true (or if the iterabl ...

  5. python_输入一个数,判断是否是素数

    while True: n=int(input('n=')) for i in range(2,n): if n%i==0: print("n is not 素数") break ...

  6. 解决Postgresql服务启动又关闭的问题

    查看日志发现如下错误消息:%t LOG: could not receive data from client: An operation was attempted on something tha ...

  7. CUDA 中dim3含义

  8. highcharts与ajax的应用

    整理一份完整的例子,以供参考: <1>页面chart.html: <span style="font-size:14px;"><!DOCTYPE HT ...

  9. Java十进制转成二进制 八进制 十六进制

    int a = 357;//十进制转成二进制System.out.println(Integer.toBinaryString(a)); package com.swift; import java. ...

  10. SQLite3 of python

    SQLite3 of python 一.SQLite3 数据库 SQLite3 可使用 sqlite3 模块与 Python 进行集成,一般 python 2.5 以上版本默认自带了sqlite3模块 ...