zoukankan      html  css  js  c++  java
  • Ansible Playbooks 介绍 和 使用 一

    Ansible Playbooks

    Playbooks 组成部分:

    • Inventory
    • Modules
    • Ad Hoc Commands
    • Playbooks
      • Tasks: 任务,即调用模块完成的某些操作
      • Variables: 变量
      • Templates: 模板
      • Handlers: 处理器,由某时间触发执行的操作
      • Roles: 角色

    YAML 介绍

    YAML 是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言。
    YAML Ain't Markup Language,即YAML不是XML。

    其特性:

    • 可读性好
    • 和脚本语言的交互性好
    • 使用时限语言的数据类型
    • 有一个一直的信息模型
    • 易于实现
    • 可以基于流来处理
    • 表达能力强,扩展型好

    YAML 语法

    YAML 的语法和其他高阶语言类似,并且可以简单表达清单、散列表、变量等数据结构。其结构(Structure)通过空格来展示,序列(Squence)里的项用-来代办,Map里的键值对用:分割

    案例:

    name: John Smith
    age: 41
    gender: Male
    spouse:
        name: Jane Smith
        age: 37
        gennder: Female
    children:
        -   name: Jimmy Smith
            age: 17
            gender: Male
        -   name: Jenny Smith
            age: 13
            gender: Female
    

    YAML 文件扩展名通常为: .yaml,如 example.yaml

    List

    列表中的所有元素均使用-打头,例如:

    # A list of t asty fruits
    - Apple
    - Orange
    - Strawberry
    - Mango
    

    Dictionary

    字典通过key与value进行表示,例如:

    # An exployee record
    name: Example Developer
    job: Developer
    skill: Elite
    

    也可以将key:value 放置于{}中进行描述

    # An exployee record
    {name: Example Developer, job: Developer, skill: Elite}
    

    Ansible 基础元素

    变量

    变量名仅能由字母、数字和下划线组成,且只能以字母开头。

    facts

    facts是由正在通信的远程目标主机发挥的信息,这些信息被保存在ansible变量中,要获取指定额远程主机所支持的所有facts,可以使用如下命令进行:

    # ansible hostname -m setup

    registre

    把任务的输出定义为变量,然后用于其他任务,示例如下:

    tasks:
    - shell: /usr/bin/foo
      register: foo_result
      ignore_errors: true
    

    通过命令传递变量

    在运行playbook的时候也可以通过一些变量供playbook使用,示例如下:

    ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"
    

    通过roles传递变量

    当一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量,示例如下:

    - hosts: webservs
      roles:
      - common
      - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
    

    Inventory

    ansible 的主要功能在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的Inventory file 为 /etc/ansible/hosts。
    inventory file 可以有多个,且也可以通过Dynamic Inventory来动态生成

    主机变量

    可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:

    [webservs]
    10.0.0.65 http_port=80 maxRequestsPerChild=888
    10.0.0.66 http_port=8080 maxRequestsPerChild=909
    

    组变量

    组变量是指赋予给特定组内所有主机上在playbook中可用的变量。例如:

    [webservs:vars]
    ntp_server=ntp.aliyun.com
    nfs_server=nfs.aliyun.com
    

    注意:[组名:vars] 组名中的:vars 是固定用法

    组嵌套

    inventory中,组还可以包含其他的组,并且也可以像组中的主机指定变量。不过这些变量只能在ansible-playbook中使用,而不支持ansible。例如:

    [apache]
    http1.magedu.com
    http2.magedu.com
    
    [nginx]
    nginx1.magedu.com
    nginx2.magedu.com
    
    [webservs:children]
    apache
    nginx
    
    [webservs:vars]
    ntp_server=ntp.magedu.com
    

    注意::childer 同样是固定用法

    inventory 参数

    ansible基于ssh链接inventory中指定的远程主机时,还可以通过参数指定其交互方式;这些擦桉树如下所示:

    • ansible_ssh_host
    • ansible_ssh_port
    • ansible_ssh_user
    • ansible_ssh_pass
    • ansible_sudo_pass
    • ansible_connection
    • ansible_ssh_private_key_file
    • ansible_shell_type
    • ansible_python_interpreter
    • ansible_*_interpreter

    编写 ansible playbooks 剧本

    playbook是由一个或多个play组成的列表。play的主要功能在于将事先归并一组的主机装扮成事先通过ansible中的tasks定义好的角色。从根据上来讲,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可以让他们联通起来按事先编排的机制同唱一台大戏。下面是一个简单的示例:

    - hosts: webnodes
      vars:
        http_port: 80
        max_clients: 256
      remote_user: root
      tasks:
      - name: ensure apache is at the lastest version
        yum: name=httpd state=latest
      - name: ensure apache is running
        service: name=httpd state=started
      handlers:
      - name: restart apache
        service:name=httpd state=restarted
    

    playbook 基础组件

    Hosts 和 Users

    playbook 中的每一个play的目的都是为了让某个或某些主机一某个指定的用户执行任务。hosts用于指定要执行指定任务的主机,其可以使一个或多个由冒号分割主机组;remote_user则用于指定远程主机上的执行任务的用户。例如上面示例中的:

    - hosts: webnodes
      remote_user: root
    

    不过,remote_user也可用于各task中,也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务,甚至可以在sudo时sudo_user指定sudo时切换的用户。

    - hosts: webnodes
      remote_user: mageedu
      tasks:
      - name: test connection
        ping:
        remote_user: mageedu
        sudo: yes
    

    任务列表和action

    • play的主体部分是task list。task list中的个任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。在运行playbook 时,如果中途发生错误,所有已执行任务都将会滚,因此,在更正playbook后重新执行一次即可。

    • task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。

    • 每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽可能清晰地描述任务执行步骤,如果为提供name,则action的结果将用于输出

    • 定义task的可以使用"action: module options" 或 "module: options" 的格式,推荐使用候着以实现向后兼容。如果action一行的内容过度,也使用在行首使用几个空白字符进行换行

    tasks:
    - name: make sure apache is running
      service: name=htpd state=running
    

    在众多模块中,只有command 和shell模块仅需要给一个列表而无需使用"key=vale"格式,例如:

    tasks:
    - name: disable selinux
      command: /sbin/setenforce 0
    

    如果命令或脚本的退出码不为零,可以使用如下方式替代:

    tasks:
    - name: run this command and ignore the result
      shell: /usr/bin/somecommand || /bin/true
      ignore_errors: true
    

    或者使用ignore_errors来忽略错误信息

    tasks:
    - name: run this command and ignore the result
      shell: /usr/bin/somecommand
      ignore_errors: true
    

    playbook 案例 1

    在所有的webservs组的主机上创建nginx用户和用户组
    并模拟拷贝文件到dbservs中

    [root@node01 ansible]# cat nginx.yml 
    - hosts: webservs
      remote_user: root
      tasks:
      - name: create nginx group
        group: name=nginx system=yes gid=208
      - name: create nginx user
        user: name=nginx system=yes uid=208 group=nginx
    
    - hosts: dbservs
      remote_user: root
      tasks:
      - name: copy file to dbservs
        copy: src=/etc/inittab dest=/tmp/inittab.ans
    

    使用ansible-playbook命令执行:

    [root@node01 ansible]# ansible-playbook nginx.yml 
    
    PLAY [webservs] ***********************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************
    ok: [10.0.0.65]
    
    TASK [create nginx group] *************************************************************************************************
    changed: [10.0.0.65]
    
    TASK [create nginx user] **************************************************************************************************
    changed: [10.0.0.65]
    
    PLAY [dbservs] ************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************
    ok: [10.0.0.66]
    
    TASK [copy file to dbservs] ***********************************************************************************************
    ok: [10.0.0.66]
    
    PLAY RECAP ****************************************************************************************************************
    10.0.0.65                  : ok=3    changed=2    unreachable=0    failed=0   
    10.0.0.66                  : ok=2    changed=0    unreachable=0    failed=0   
    
    

    验证: webservs的nginx用户和组以及dbservs的/tmp/inittab.ans文件

    [root@node01 ansible]# ansible webservs -a 'grep nginx /etc/passwd'
    10.0.0.65 | CHANGED | rc=0 >>
    nginx:x:208:208::/home/nginx:/bin/bash
    
    [root@node01 ansible]# ansible webservs -a 'grep nginx /etc/group'
    10.0.0.65 | CHANGED | rc=0 >>
    nginx:x:208:
    
    [root@node01 ansible]# ansible dbservs -a 'ls -l /tmp/inittab.ans'
    10.0.0.66 | CHANGED | rc=0 >>
    -rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans
    
  • 相关阅读:
    flume杀掉重启
    Tomcat访问日志浅析 (转)
    httpclient Accept-Encoding 乱码
    解决Maven报Plugin execution not covered by lifecycle configuration
    mahout基于Hadoop的CF代码分析(转)
    hadoop Mahout中相似度计算方法介绍(转)
    nginx配置文件结构,语法,配置命令解释
    nginx 中文和英文资料
    使用异步 I/O 大大提高应用程序的性能
    nginx AIO机制与sendfile机制
  • 原文地址:https://www.cnblogs.com/winstom/p/9798519.html
Copyright © 2011-2022 走看看