zoukankan      html  css  js  c++  java
  • Ansible 详细用法说明(二)

    setup:获取指定主机的facts。

    ===================================
    facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

    例:获取某台主机的变量

    ansible 10.1.6.68 -m setup

    =====================================
    script:发送脚本到各被管理节点,并执行。不需要参数

    =====================================

    ansible all -m script -a 'test.sh'

    直接在-a 后面指定脚本即可。

    ===============================
    selinux: 管理selinux。

    ===============================

    conf     #指定应用selinux的配置文件。
    state=enforcing|permissive|disabled      #对应于selinux配置文件的SELINUX。
    policy=targeted|minimum|mls     #对应于selinux配置文件的SELINUXTYPE

    关闭selinux:

    ansible all -m selinux -a 'state=disabled'

    ===============================
    template:使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。

    ===============================

    五、playbook:“跑剧本”

    playbook就是一个用yaml语法把多个模块堆起来的一个文件而已。

    1.简介

    YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

    2、特点

    • YAML的可读性好

    • YAML和脚本语言的交互性好

    • YAML使用实现语言的数据类型

    • YAML有一个一致的信息模型

    • YAML易于实现

    • YAML可以基于流来处理

    • YAML表达能力强,扩展性好

    YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。下面是一个示例。

        - hosts: 10.1.0.1        #定义主机
          vars:                      #定义变量
               var1: value
               var2: value
          tasks:                    #定义任务
               - name:           #任务名称。
           #这里就可以开始用模块来执行具体的任务了。
    
          handlers:     #定义触发通知所作的操作。里面也是跟tasks一样,用模块定义任务。
               - name:
    
          remote_user:             #远程主机执行任务时的用户。一般都是root,一般也不用指定。
    
        - hosts: web
          vars:
          tasks:
          handlers:
          remote_user:

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

    Playbooks


    1.核心元素:

    • Tasks:任务,由模块定义的操作的列表;

    • Variables:变量

    • Templates:模板,即使用了模板语法的文本文件;

    • Handlers:由特定条件触发的Tasks;

    • Roles:角色;

    2.playbook的基础组件:

    Hosts:运行指定任务的目标主机;
    remote_user:在远程主机以哪个用户身份执行;
        sudo_user:非管理员需要拥有sudo权限;
    tasks:任务列表
        模块,模块参数:
            格式:
                (1) action: module arguments
                (2) module: arguments

    示例1:

    vim test.yaml 也可以是 .yml

    - hosts: all
      remote_user: root
      tasks:
      - name: install a group
        group: name=mygrp system=true 
      - name: install a user
        user: name=user1 group=mygrp system=true
    
     - hosts: websrvs      
       remote_user: root
       tasks:
        - name: install httpd package
          yum: name=httpd
        - name: start httpd service 
          service: name=httpd state=started

    3.运行playbook,使用ansible-playbook命令

    (1) 检测语法

    ansible-playbook –syntax-check /path/to/playbook.yaml

    (2) 测试运行

    ansible-playbook -C /path/to/playbook.yaml

        --list-hosts
        --list-tasks
        --list-tags

    ansible-playbook –check /path/to/playbook.yaml

    (3) 运行

    ansible-playbook /path/to/playbook.yaml

        -t TAGS, --tags=TAGS
        --skip-tags=SKIP_TAGS  跳过指定的标签
        --start-at-task=START_AT 从哪个任务后执行

    tags:给指定的任务定义一个调用标识;

        - name: NAME
          module: arguments
          tags: TAG_ID

    可以一次调用多个名称相同的标签。也可以调用不同的标签用 “,” 分割。

    改变监听端口

    写剧本把此文件传过去

    指明标签的检查

    查看标签

    playbook执行过程

    跳过标签的事件

    handlers:由特定条件触发的Tasks;

    - name: TASK_NAME
      module: arguments
      notify: HANDLER_NAME
    handlers:
    - name: HANDLER_NAME
      module: arguments


    第一次的话都会运行,后边如果文件内容发生改变就会触发notify,然后会直接执行handlers的内容(这里notify后边的事件就都不会执行了)。估计是md5那种的校验。删了个#号竟然也会通知。

    六、 Variables:变量

    内建:

    (1) facts

    自定义:

    (1) 命令行传递;这个优先级最高

        -e VAR=VALUE

    (2) 在hosts Inventory(/etc/ansible/hosts)中为每个主机定义专用变量值;


        (a) 向不同的主机传递不同的变量;
    
            IP/HOSTNAME variable_name=value
                [web]
                10.1.6.72 qzx=httpd
                10.1.6.73 qzx=nginx
    
        (b) 向组内的所有主机传递相同的变量 ;
    
            [groupname:vars]
            variable_name=value
    
            [web:qzx]
            qzx=httpd
    
            [web]
            10.1.6.72
            10.1.6.73

    (3) 在playbook中定义,建议使用这个!

        vars:
        - var_name: value
        - var_name: value

    (4) Inventory还可以使用参数:

        用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;
            ansible_ssh_host
            ansible_ssh_port
            ansible_ssh_user
            ansible_ssh_pass
            ansible_sudo_pass
            ...

    (5) 在角色调用时传递

        roles:
        - { role: ROLE_NAME, var: value, ...}

    变量调用:有空格
    {{ var_name }}

    七、Templates:模板

    文本文件,内部嵌套有模板语言脚本(使用模板语言编写)

    Jinja2 是由python编写的。 在我们打算使用基于文本的模板语言时,jinja2是很好的解决方案。yeml是写playbookjinja2是写配置文件模板

    功用

    将模板的文件的变量值转换成对应的本地主机的确定值。例如:ansible端写一个内建变量{{ ansible_processor_vcpus }},当这个文件被复制到对应主机时会自动生成对应主机 cpu的颗数的结果替换之。

    Jinja2语法:

    字面量:
        字符串:使用单引号或双引号; 
        数字:整数、浮点数;
        列表:[item1, item2, ...]
        元组:(item1, item2, ...)
        字典:{key1:value1, key2:value2, ...}
        布尔型:true/false
    
    算术运算:
        +, -, *, /, //, %, **
    
    比较操作:
        ==, !=, >, <, >=, <=
    
    逻辑运算:and, or, not

    执行模板文件中的脚本,并生成结果数据流,需要使用template模块

    ===============================
    template:使用了Jinjia2格式作为文件模版,进行文档内变量的替换的模块。相当于copy

    ===============================
    将jinja2的文件模板理解并执行,转化为各个主机间的对应值

    backup       建立个包括timestamp在内的文件备份,以备不时之需.
    dest       远程节点上的绝对路径,用于放置template文件。
    group      设置远程节点上的的template文件的所属用户组
    mode       设置远程节点上的template文件权限。类似Linux中chmod的用法
    owner      设置远程节点上的template文件所属用户
    src        本地Jinjia2模版的template文件位置。

    注意:此模板不能在命令行使用,而只能用于playbook;用法同copy

    1、普通示例:

    这里/root/nginx.conf内容发生了改变。

      - hosts: ngxsrvs
        remote_user: root
        tasks:
        - name: install nginx package
          yum: name=nginx state=latest
        - name: install conf file
          template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
          tags: ngxconf
          notify: reload nginx service
        - name: start nginx service
          service: name=nginx state=started enabled=true
        handlers:
        - name: reload nginx service
          shell: /usr/sbin/nginx -s reload

    2、条件测试:

    when语句:在tasks中使用,Jinja2的语法格式;

    -     hosts: all
        remote_user: root
        tasks:
        - name: install nginx package
          yum: name=nginx state=latest
        - name: start nginx service on CentOS6
          shell: service nginx start
          when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
        - name: start nginx service
          shell: systemctl start nginx.service
          when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

    3、循环:迭代,需要重复执行的任务;

    对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素; 这个是以任务为中心,围绕每个任务来跑主机,如果中间某个任务中断,那么所有主机以后的任务就无法安装。

    元素:

    • 列表

    • 字符串

    • 字典

    基于字符串列表给出元素示例:

     -    hosts: websrvs
        remote_user: root
        tasks:
        - name: install packages
          yum: name={{ item }} state=latest
          with_items:
          - httpd
          - php
          - php-mysql
          - php-mbstring
          - php-gd

    基于字典列表给元素示例:item.name .后边的表示键

    - hosts: all
      remote_user: root
      tasks:
      - name: create groups
        group: name={{ item }} state=present
        with_items:
        - groupx1
        - groupx2
        - groupx3
      - name: create users
        user: name={{ item.name }} group={{ item.group }} state=present
        with_items:
        - {name: 'userx1', group: 'groupx1'}
        - {name: 'userx2', group: 'groupx2'}
        - {name: 'userx3', group: 'groupx3'}

    八、 角色:roles

    以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个事件切割成片段来执行。

    mkdir ./{nginx,memcached,httpd,mysql}/{file,templates,vars,handlers,meta,default,tasks} -pv

    role_name/

        files/:存储由copy或script等模块调用的文件; 
    
        tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
    
        handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
    
        vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
    
        templates/:存储由template模块调用的模板文本;
    
        meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
    
        default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

    在playbook中调用角色的方法:

    - hosts: HOSTS
      remote_user: USERNAME
      roles:
      - ROLE1
      - ROLE2
      - { role: ROLE3, VARIABLE: VALUE, ...}
      - { role: ROLE4, when: CONDITION }

    事例: 基于角色的方式安装 nginx

    1、创建需要的文件

    mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv


    3、写tasks/下的主main.yml

    - name: copy nginx package
      copy: src=nginx-1.10.0-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm
    
    - name: install nginx package
      yum: name=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm  state=present
    
    - name: install nginx.conf file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      tags: ngxconf
      notify: reload nginx service
    
    - name: install default.conf file
      template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
      tags: ngxconf
      notify: reload nginx service
    
    - name: start nginx service
      service: name=nginx enabled=true state=started

    2.复制相应的安装包和模板到对应目录下

    3、根据需要修改nginx的配置文件模板。(这里改的是work进程生成数和监听的端口)


    4、写handlers目录和vars/下的main.yml 文件


    5、写需要运行的主yml文件

    7、测试


    8、运行

    成功
    9、该端口测试、传递参数方式







  • 相关阅读:
    作业:ATM
    软件开发目录规范
    re模块
    logging模块
    ConfigParser模块&hashlib模块&subprocess模块
    json模块&pickle模块&shelve模块&xml模块
    时间模块time&datetime
    vue里面render详细写法
    node.js创建服务
    vue退出功能的实现
  • 原文地址:https://www.cnblogs.com/sanyuanempire/p/6169492.html
Copyright © 2011-2022 走看看