zoukankan      html  css  js  c++  java
  • ansible入门02

    1.常用模块

    1.1 group模块

    添加或删除组
                name=
                state=:present(添加),absent(删除)
                system=:1或true为添加系统组
                gid=
    ansible all -m group -a "name=test state=present system=1 gid=600"
    ansible all -m group -a "name=test2 state=present gid=1010"

    1.2 script模块:

    运行本地的脚本在远程主机上。依赖于某个文件才能运行,需要指定某个脚本文件的路径(本地的脚本文件),它会自动复制到远程主机上运行
                -a "/PATH/TO/SCRIPT_FILE"
    类似于command或shell。这个路径是本机文件路径。

    1.3 template模块:

    基于模板方式生成一个文件复制到远程主机
                src=:源地址
                dest=:目标地址
                owner=:属主
                group=:属组
                mode=:权限0644

    2. playbook的其它组件

    2.1 变量:

    变量的定义:
    ansible facts:系统变量可以直接调用
    ansible-playbook  -e "var=value":自己定义变量,传递变量
    host variable: host iventory:定义主机变量,在hosts文件中添加
    group variable:组变量定义方式。定义的变量对于组内所有主机生效
    [groupname:vars]
    var=value
    roles

    变量调用:{{ variable }}
     
    在playbook中定义变量的方法:
                vars:
                - var1: value1
                - var2: value2

    2.2 模板:templates

    模板文件是一种文本文件,嵌套有脚本(使用模板编程语言编写)
    python中的嵌入式编程语言是Jinja2

    jinjia2的语法:
    字面量:
    字符串:使用单引号或双引号;
    数字:整数,浮点数;
    列表:[item1, item2, ...],值可变数据类型
    元组:(item1, item2, ...),值不可变
    字典:{key1:value1, key2:value2, ...}
    布尔型:true/false

    算术运算:
    +, -, *(乘), /(除), //(整除), %(取余), **(次方)

    比较操作:
    ==(等值比较), !=(不等值比较), >, >=, <, <=

    逻辑运算:
    and, or, not
    示例:   
    在nginx配置文件中修改配置文件nginx.conf.j2:
    worker_processes {{ ansible_processor_vcpus }};
    #或者worker_processes {{ ansible_processor_vcpus-1 }}; #使用减法运算
    listen {{ http_port }};       #设置监听端口,也可以使用我们自定义的变量(在hosts文件中对每一个分别设置)
    在/etc/ansible下添加playbook文件如下:
    - hosts: websrvs
      remote_user: root
      tasks:
      - name: install nginx
        yum: name=nginx state=present
      - name: install conf file
        template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
        notify: restart nginx
        tags: instconf
      - name: start nginx service
        service: name=nginx state=started
      handlers:
      - name: restart nginx
        service: name=nginx state=restarted  
    ansible-playbook nginx.conf.yaml
     
    模板配置文件 :nginx.conf.j2
    worker_processes {{ ansible_processor_vcpus }};
    listen {{ http_port }};

    2.3 条件判断

    判断系统版本,系统类型,根据这些不同做出不同的应对
    ansible all -m setup | grep ansible_os_family #查看系统家族,CentOS显示RedHat
    条件测试:
    when语句,在task列表中使用,jinja2的语法格式
    tasks:
    - name: install conf file to centos7
      template: src=files/nginx.conf.c7.j2
      when: ansible_distribution_major_version == "7"   #如果是CentOS7的时候
    - name: install conf file to centos6
      template: src=files/nginx.conf.c6.j2
      when: ansible_distribution_major_version == "6"   #如果是CentOS6时
    scp root@172.18.100.69:/etc/nginx/nginx.conf files/nginx.conf.c6.j2 
    #把远程主机(CentOS6)上的文件拉取到本地

    2.4 循环

    循环:迭代,需要重复执行的任务;
    对迭代项的引用,固定变量名为”item“
    而后,要在task中使用with_items定义给定要迭代的元素列表;

    列表方法:
    1.字符串
    2.字典:每一个元素是一个字典

    列表方法1:字符串方式
                - name: install some packages
                  yum: name={{ item }} state=present
                  with_items:
                  - nginx
                  - memcached
                  - php-fpm
    - hosts: all
      remote_user: root
      tasks:
      - name: install some packages
        yum: name={{ item }} state=present
        with_items:
        - nginx
        - memcached
        - php-fpm
    ansible-playbook item.yaml  #如果没有定义好yum源,出现问题就会终止

    列表方法2:字典方式
    - hosts: all
      remote_user: root
      tasks:
      - name: add some groups
        group: name={{ item }} state=present
        with_items:
        - group11
        - group12
        - group13
      - name: add some users
        user: name={{ item.name }} group={{ item.group }} state=present
        with_items:
        - { name: 'user11', group: 'group11' }  #键值与键值之间用“:”隔开
        - { name: 'user12', group: 'group12' }
        - { name: 'user13', group: 'group13' }
    ansible-playbook useradd.yaml

    2.5 角色(roles):

    如何实现yaml定义的模块重用?
    服务器角色并不单一
    如果能够把配置的每个配置段独立化,模块化
    角色调用,直接调用服务器主机的公共模块,谁用谁调,直接方便
    好处:跟远程主机分离,调用方便

    角色集合:其实就是一个目录,角色名就是目录名
    roles/
        mysql/
        httpd/
        nginx/
        memcached/

    角色的格式:
            每个角色,以特定的层级目录结构进行组织:
                mysql/
                    files/ :存放由copy(复制的文件)或script(脚本文件)模块等调用的文件;
                    templates/:template模块查找所需要模板文件的目录;
                    tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;(基本组件,必须有)
                    handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                    vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                    meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
                    default/:设定默认变量时使用此目录中的main.yml文件;
    mkdir -pv roles/{httpd,nginx,mysql}/{files,templates,tasks,handlers,vars,meta,default}
    在playbook调用角色方法1:
    一个主机上可以调用多个角色
    - hosts: websrvs
      remote_user: root
      roles:
      - mysql
      - memcached
      - nginx
    在playbook调用角色方法2:传递变量给角色
    - hosts:
      remote_user:
      roles:
      - { role: nginx, username: nginx }
     键role用于指定角色名称;后续的k/v用于传递变量给角色;

     例:
    mkdir /etc/ansible/roles/nginx
    cp /root/working/files/nginx.conf.j2 templates/ #复制准备好的配置文件/templates文件夹中
    #在roles/nginx/tasks/main.yaml中配置
    - name: install nginx packages
      yum: name=nginx state=present
    - name: install conf file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
    - name: start nginx
      service: name=nginx state=started enabled=true
    #创建执行文件nginx.yaml
    - hosts: all
      remote_user: root
      roles:
      - nginx
    ansible-playbook --check nginx.yaml
    ansible-playbook nginx.yaml


    定义一个触发器:
    #创建roles/nginx/handlers/main.yaml
    - name: restart nginx
      service: name=nginx state=restarted
    #在tasks/main.yaml中重新定义
    - name: install nginx packages
      yum: name=nginx state=present
      tags:install
    - name: install conf file
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx   #定义通知机制,当模版发生改变时就通知handlers模块,重启服务
      tags:conf
    - name: start nginx
      service: name=nginx state=started enabled=true
      tags:nginxst
    
    ansible-playbook -t install,conf nginx.yaml

    使用变量:
    1.直接定义
    #编辑user.yaml
    - hosts: all
      romote_user: root
      vars:
      - username: testuser1
      - groupname: testgroup1
      tasks:
      - name: creat group
        group: name={{ groupname }} state=present
      - name: creat user
        user: name={{ username }} state=present
    从命令行传递参数,直接把下面定义的变量覆盖掉,例:
    ansible-playbook -e "groupname=mygrp1" -e "username=myuser1" myuser.yaml
    2.在角色中定义变量
    #在要传给远程主机的nginx配置文件中修改
    user {{ username }};
    #在roles/nginx/vars/main.yaml
    ansible-playbook --check nginx.yaml
    ansible-playbook nginx.yaml
    
    ansibel-playbook -e "username=adm" --check nginx.yaml
    ansibel-playbook -t conf -e "username=adm" nginx.yaml #直接修改
    
    3.在playbook调用角色方法:传递变量给角色
    - hosts: all
      remote_user: root
      roles:
      - { role: nginx, username: nginx }
    ansible-playbook运行过后可以看到,运行nginx的用户为nginx

    注意:1.键role用于指定角色名称;后续的k/v用于传递变量给角色;
               2.还可以基于条件测试实现角色调用;
                roles:
                - { role: nginx, when: "ansible_distribution_major_version == '7' " }
                   只有当系统主版本号为“7”的时候,才会运行nginx角色
                这里可以定义n个角色
    - hosts: all
      remote_user: root
      roles:
      - { role: nginx, username: nginx, when: "ansible_distribution_major_version == '7' " }
    例:
    mkdir -pv /etc/ansible/roles/memcached/tasks
    vim tasks/main.yaml
    #下面是main.yaml的内容
    - name: install package
      yum: name=memcached state=present
    - name: start memcached
      service: name=memcached state=started enabled=true
    vim mem.yaml
    #下面是mem.yaml的内容
    - hosts: all
      remote_user: root
      roles:
      - { role: nginx, when: ansible_distribution_major_version == '7' }
      - { role: memcached, when: ansible_hostname == 'memcached' }

    例:如何设置memcached所使用的空间是系统闲置空间的1/4?
    把/etc/sysconfig/memcached中的“CACHESIZE="64" ”改为1/4
    mkdir roles/memcached/templates
    scp root@172.18.100.69:/etcsysconfig/memcached ./roles/memcached/templates #从远程主机上下载配置文件
    ansible all -m setup
    
    
    vim ./roles/memcached/templates/memcached
    #将CACHESIZE="64"改为
    CACHESIZE="{{ ansible_memtotal_mb //4 }}"
    mv ./roles/memcached/templates/memcached{,.j2}  #改后缀名j2
    vim ./roles/memcached/tasks/main.yaml
    
    
    #以下是main.yaml中的内容
    - name: install package
      yum: name=memcached state=present
    - name: install conf file
      templates: src=/etc/ansible/roles/templates/memcached.j2 dest=/etc/sysconfig/memcached
      notify: restart memcached
      tags: memconf
    - name: start memcached
      service: name=memcached state=started enabled=true
    
    mkdir memcached/handlers
    vim ./handlers/main.yaml
    
    
    #main.yaml
    - name: restart memcached
      service: name=memcached state=restarted
    
    
    ansible-playbook /etc/ansible/roles/mem.yaml
    测试使用
    使用ansible一键搞定:
    1.3台主机配置主/备模式高可用keepalived+nginx(proxy)
       两台主机:httpd+php
       一台主机:mysql-server或mariadb-server;
    建议sudo的时候把sudo用户加到管理员组里面,给与与root用户相同的权限
    http://www.ansible.com.cn

















  • 相关阅读:
    我理解的Node.js
    How to handle the issue of node.js msi to roll back under windows 8
    转:.Net 中AxShockwaveFlash的解析
    鱼哥的C++学习笔记(一)编译方法
    TabControl样式编写
    Cocos2d on VS12 step by step
    C# 控制Windows系统音量
    系统环境换成Win8+Vs2012碰到的问题记录
    Http学习笔记(一)
    WPF ListBox Template解析
  • 原文地址:https://www.cnblogs.com/zhangpf/p/7410327.html
Copyright © 2011-2022 走看看