ansible使用指北(二)

前言
在上一篇文章里我们了解了ansible的常用模块,今天我们来了解下ansible-playbook,ansbile-playbook是一系统ansible命令的集合,其利用yaml 语言编写,ansbile-playbook命令根据自上而下的顺序依次执行。

playbook通过ansible-playbook命令使用,它的参数和ansible命令类似,如参数-k(–ask-pass) 和 -K (–ask-sudo) 来询问ssh密码和sudo密码,-u指定用户,这些指令也可以通过规定的单元写在playbook 。
ansible-playbook的简单使用方法: ansible-playbook play.yml

ansible Example

现在给出一个ansible-playbook示例

123456789101112131415161718
---- hosts: webservers  vars:    http_port: 80    max_clients: 200  remote_user: root  tasks:  - name: ensure apache is at the latest version    yum: name=httpd state=latest  - name: write the apache config file    template: src=/srv/httpd.j2 dest=/etc/httpd.conf    notify:    - restart apache  - name: ensure apache is running (and enable it at boot)    service: name=httpd state=started enabled=yes  handlers:    - name: restart apache      service: name=httpd state=restarted

hosts参数指定了对哪些主机进行操作
vars参数指定了变量
remote_user 则用于指定执行任务的用户
tasks指定了一个任务

  • name参数是对任务的描述
  • yum参数是执行的任务
  • template参数指拷贝的模板
  • notify触发条件,指config有变化是重启服务
    handlers指task 执行完成以后需要调用的任务
    备注:在 notify 中定义内容一定要和tasks中定义的 - name 内容一样,这样才能达到触发的效果,否则会不生效

从这个示例我们可以看出playbook的构成

12345
playbooks组成:  Target section:   定义要执行 playbook 主机组  Variable section: 定义 playbook 运行使用的变量  Task section:     定义执行的任务列表  Handler section:  定义 task 执行完成以后需要调用的任务

Include Statements

  • 普通的include:一个 task include file 由一个普通的 task 列表所组成,像这样:

    123456
    ---# possibly saved as tasks/foo.yml- name: placeholder foo  command: /bin/foo- name: placeholder bar  command: /bin/bar

    Include 指令看起来像下面这样,在一个 playbook 中,Include 指令可以跟普通的 task 混合在一起使用:

    12
    tasks:  - include: tasks/foo.yml
  • 参数化的 include
    如果我们要部署多个 wordpress 实例,我们可将所有的 wordpress task 写在一个 wordpress.yml 文件中, 然后像下面这样使用 wordpress.yml 文件
    1234
    tasks:  - include: wordpress.yml wp_user=timmy  - include: wordpress.yml wp_user=alice  - include: wordpress.yml wp_user=bob

    备注:Ansible 1.4 及以后的版本,include 语法可更为精简,这种写法同样允许传递列表和字典参数:

    12
    tasks: - { include: wordpress.yml, wp_user: timmy, ssh_keys: [ 'keys/one.txt', 'keys/two.txt' ] }
  • Include 语句也可用来将一个 playbook 文件导入另一个 playbook 文件。这种方式允许你定义一个 顶层的 playbook,这个顶层 playbook 由其他 playbook 所组成,先看一个例子吧
    12345678910
    - name: this is a play at the top level of a file  hosts: all  remote_user: root  tasks:  - name: say hi    tags: foo    shell: echo "hi..."- include: load_balancers.yml- include: webservers.yml- include: dbservers.yml

Playbook Roles

  • Roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles

    Ansible主要是通过一个inventory来定义role和主机之间的匹配,通过一个ini风格的配置文件来管理所有的主机,通过一个
    group_vars下与主机组同名的文件来管理变量,或者host_vars下与主机同名的文件来管理变量(和pillar类似),然后按照固定的目录
    结构在角色名目录下创建好files, handlers, tasks, templates,
    vars(角色级别的变量)等目录;最后通过ansible命令再跟一系列的参数指定好inventory, playbooks,
    user等来触发对所有主机的配置
    项目的结构如下

    1234567891011121314151617181920
    site.ymlwebservers.ymlfooservers.ymlroles/   common/     files/     templates/     tasks/     handlers/     vars/     defaults/     meta/   webservers/     files/     templates/     tasks/     handlers/     vars/     defaults/     meta/

    playbook 如下

    12345
    ---- hosts: webservers  roles:     - common     - webservers

    这个 playbook 为一个角色 ‘x’ 指定了如下的行为

    • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
    • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
    • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
    • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 and later)
    • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
    • 所有 script tasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
    • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路径。
    • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路径。

      如果 roles 目录下有文件不存在,这些文件将被忽略。比如 roles 目录下面缺少了 ‘vars/’ 目录,这也没关系。
      注意:你仍然可以在 playbook 中松散地列出 tasks,vars_files 以及 handlers,这种方式仍然可用,但 roles 是一种很好的具有组织性的功能特性,我们强烈建议使用它。如果你在 playbook 中同时使用 roles 和 tasks,vars_files 或者 handlers,roles 将优先执行

    也可以使用参数化的 roles,这种方式通过添加变量来实现,比如

    123456
    ---- hosts: webservers  roles:    - common    - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }    - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

    也可以为 roles 设置触发条件,像这样:

    12大专栏  ansible使用指北(二)"line">34
    ---- hosts: webservers  roles:    - { role: some_role, when: "ansible_os_family == 'RedHat'" }

    它的工作方式是:将条件子句应用到 role 中的每一个 task 上。关于”条件子句”的讨论参见本文档后面的章节。

    最后,你可能希望给 roles 分配指定的 tags。比如:

    1234
    ---- hosts: webservers  roles:    - { role: foo, tags: ["bar", "baz"] }

    如果 play 仍然包含有 ‘tasks’ section,这些 tasks 将在所有 roles 应用完成之后才被执行。
    如果你希望定义一些 tasks,让它们在 roles 之前以及之后执行,你可以这样做:

    12345678910
    ---- hosts: webservers  pre_tasks:    - shell: echo 'hello'  roles:    - { role: some_role }  tasks:    - shell: echo 'still busy'  post_tasks:    - shell: echo 'goodbye'

    备注:如果对 tasks 应用了 tags,需确保给 pre_tasks 以及 post_tasks 也同样应用 tags,并且将它们一并传递。特别是当 pre_tasks 和 post_tasks 被用来监视 “停止窗口控制” 或者 “负载均衡” 时要确保这样做

  • 角色默认变量(Role Default Variables)
    角色默认变量允许你为 included roles 或者 dependent roles(见下) 设置默认变量。要创建默认变量,只需在 roles 目录下添加 defaults/main.yml 文件。这些变量在所有可用变量中拥有最低优先级,可能被其他地方定义的变量(包括 inventory 中的变量)所覆盖
  • 角色依赖(Role Dependencies)
    “角色依赖” 使你可以自动地将其他 roles 拉取到现在使用的 role 中。”角色依赖” 保存在 roles 目录下的 meta/main.yml 文件中。这个文件应包含一列 roles 和 为之指定的参数,下面是在 roles/myapp/meta/main.yml 文件中的示例
    12345
    ---dependencies:  - { role: common, some_parameter: 3 }  - { role: apache, port: 80 }  - { role: postgres, dbname: blarg, other_parameter: 12 }
  • 实战nginx
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
    # mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default}# ansible all -m setup | grep ansible_processor_cores        "ansible_processor_cores": 1,  \获取ansible的要调用的相关函数# cd roles/nginx/templates/   \模板文件一定要放到此目录vim nginx.conf worker_processes {{  ansible_processor_cores }};  \调用获取到的函数
    
    # ls -l  roles/nginx/files/-rw-r--r--. 1 root root   1290 Nov 12  2014 default.conf-rw-r--r--. 1 root root 319456 Mar 29 20:44 nginx-1.4.7-1.el6.ngx.x86_64.rpm
    
    #cd  roles/nginx/tasks/[[email protected] tasks]# vim  main.yml   - name: copy nginx.rpm    copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm  dest=/tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm  - name: install nginx    shell: yum -y  install /tmp/nginx-1.4.7-1.el6.ngx.x86_64.rpm  - name: provides nginx.conf    template: src=nginx.conf  dest=/etc/nginx/nginx.conf    tags: nginxconf    notify:    - server restart  - name: provides default.conf    copy: src=default.conf dest=/etc/nginx/conf.d/default.conf     tags: nginxconf  - name: server start    service: name=nginx enabled=true state=started
    
    [[email protected] playbook]# cd roles/nginx/handlers/[[email protected] handlers]# vim  main.yml - name: server restart  service: name=nginx  state=restarted
    
    [[email protected] playbook]# cat site.yml - hosts: nginx  remote_user: root  roles:  - nginx
    
    [[email protected] ]# ansible-playbook site.yml   
    
    [[email protected] playbook]# tree roles/roles/└── nginx    ├── default    ├── files    │  ├── default.conf    │  └── nginx-1.4.7-1.el6.ngx.x86_64.rpm    ├── handlers    │  └── main.yml    ├── meta    ├── tasks    │  └── main.yml    ├── templates    │  └── nginx.conf    └── vars`

ansible Conditionals

  • Loops and Conditionals

    123456789
    #use listtasks:    - command: echo {{ item }}      with_items: [ 0, 2, 4, 6, 8, 10 ]      when: item > 5#use dict- command: echo {{ item.key }}  with_dict: "{{ mydict|default({}) }}"  when: item.value > 5
  • The When Statement
    1234567891011121314
    #group conditions(a logical 'or')tasks:  - name: "shut down CentOS 6 and Debian 7 systems"    command: /sbin/shutdown -t now    when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or          (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
    
    #multiple(a logical 'and')tasks:  - name: "shut down CentOS 6 systems"    command: /sbin/shutdown -t now    when:      - ansible_distribution == "CentOS"      - ansible_distribution_major_version == "6"

    备注: example requires the lsb_release package on the target host in order to return the ansible_lsb.major_release fact

ref

Docs-Conditionals



您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。

原文地址:https://www.cnblogs.com/lijianming180/p/12268155.html

时间: 2024-10-08 06:45:51

ansible使用指北(二)的相关文章

[转] iOS开发者的Weex伪最佳实践指北

[From] http://www.cocoachina.com/ios/20170601/19404.html 引子 这篇文章是笔者近期关于Weex在iOS端的一些研究和实践心得,和大家一起分享分享,也算是对学习成果的总结.文章里面提到的做法也许不是最佳实践,也许里面的方法称不算是一份标准的指南手册,所以标题就只好叫"伪最佳实践指北"了.有更好的方法欢迎大家一起留言讨论,一起学习. 由于笔者不太了解Android,所以以下的文章不会涉及到Android. 一. React Nativ

常用STL使用指北

常用STL使用指北 set和multiset set和multiset都是基于红黑树(显然是一个二叉搜索树)的STL. 定义 我们可以使用(multi)set<元素类型>名称来定义一个(multi)set. 自定义排序 默认排序方式都是从小到大.因为结构体之间没有定义<,所以我们需要自定义一个比较函数. 如果元素不是结构体: //自定义比较函数myComp,重载"()"操作符 struct myComp { bool operator()(const int &

webpack 最佳配置指北

webpack 最佳配置指北 前言 对于入门选手来讲,webpack 配置项很多很重,如何快速配置一个可用于线上环境的 webpack 就是一件值得思考的事情.其实熟悉 webpack 之后会发现很简单,基础的配置可以分为以下几个方面: entry . output . mode . resolve . module . optimization . plugin . source map . performance 等,本文就来重点分析下这些部分. 内附一张 webpack 零配置对比图片,关

Apache OFBiz指北1-概述

Apache ofbiz是Apache Open for Business的简写,顾名思义,这是一个开源的商业业务系统,项目的最新版本是12.04. 说起这个项目,用过的人(包括我在内)多半都是又爱又恨,爱是因为它为这个项目的核心内容非常的丰富,从前端销售,如网店,目录管理,内容管理:到后端的业务系统,订单,库存,采购,物流,制造(这个功能我没有用过,不熟悉)等:以及企业管理的一些模块,如财务,绩效,协作等.这些基本上把一个销售型企业的常见业务都囊括了.项目自己也实现了一套开发框架,如果是一个初

中文文案排版指北

中文文案排版指北 統一中文文案.排版的相關用法,降低團隊成員之間的溝通成本,增強網站氣質. Other languages: English Chinese Traditional Chinese Simplifed 目次 空格 中英文之間需要增加空格 中文與數字之間需要增加空格 數字與單位之間需要增加空格 全形標點與其他字符之間不加空格 -ms-text-autospace to the rescue? 標點符號 不重複使用標點符號 全形和半形 使用全形中文標點 數字使用半形字符 遇到完整的英

Android 内存分析指北

android 内存泄漏分析指北 简单来说内存泄漏就是当对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用 java 垃圾回收介绍: Java 虚拟机运行所管理的内存包括以下几个运行时的数据区域 如下图: 程序计数器: 一块比较小的内存区域,可以看作是当前线程所执行的字节码的行号指示器.且每个线程都有一个独立的程序计数器. java 虚拟机栈: 线程私有的,描述的是java 方法执行的内存模型,每个线程执行的时候都会创建一个栈帧用于储存 局部变量.操作数栈.动态链接.方法出

VMware Workstation 安装以及Linux虚拟机安装 指北

最近有挺多小伙伴跟我说起虚拟机这个东西,所以,今天就给大家写一篇虚拟机安装使用指北吧. 虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件.(该段说明来自wiki) 我们即将安装的软件 VMware 则是系统虚拟机.可以轻松在一个操作系统上面安装多一个或者多个操作系统,如kali.Ubuntu.centos等Linux,windows系统,甚至Mac系统都可以

Markdown 标记语言指北 - 源码

这是上一篇博客的源代码. 这是班刊约稿的一篇文章. 全文约6000字, 预计需要 60 分钟读完. # Markdown 标记语言指北 #### TOC 1. [什么是 Markdown?](#%E4%BB%80%E4%B9%88%E6%98%AF-Markdown) 1. [Markdown 可以用来干什么?](#Markdown-%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%9D%A5%E5%B9%B2%E4%BB%80%E4%B9%88) 1. [第一步?](#%E7%AC

[Android Studio] 2019年Android Studio配置指北

Android Studio是我学习Android开发路上的第一块绊脚石,新建一个项目,一行代码没动,直接编译不起来,本文为什么叫指北,因为我太难了 本文讲解在9102年如何在国内网络不通畅的情况下流畅的使用Android Studio 1. 关闭代理 网上能搜索出一堆通过增加国内镜像站的代理来使下载SDK的速度飞快,然而我一个都用不了,建议不要使用代理 2. 改hosts dl.google.com的DNS无法解析,这是导致很多问题的元凶,通过手动在hosts中增加域名和ip的映射来解决这个问