• ansible学习笔记


    原文地址:http://www.yunweipai.com/34601.html

    主要内容

    • 简介

    • 安装

    • 基本使用

    • 常用模块

    • ansible-playbook

    • template

    • role

    简介

    官网:https://www.ansible.com/
    官方文档:https://docs.ansible.com/
    中文文档:http://www.ansible.com.cn/

    ansible特性

    • 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
    • Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
    • 基于Python语言实现
    • 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
    • 安全,基于OpenSSH
    • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
    • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
    • 较强大的多层解决方案role

    ansible架构

    组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

    • INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
    • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
    • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
    • API:供第三方程序调用的应用程序编程接口

    Ansible 命令执行来源

    • USER 普通用户,即SYSTEM ADMINISTRATOR
    • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
    • CMDB(配置管理数据库) API 调用
    • PUBLIC/PRIVATE CLOUD API调用
    • USER-> Ansible Playbook -> Ansibile

    安装

    ansible只需要安装在主控端就行。执行ansible的主机一般称为主控端,中控,master或堡垒机。

    安装要求

    • 主控端Python版本需要2.6或以上
    • 被控端Python版本小于2.4,需要安装python-simplejson
    • 被控端如开启SELinux需要安装libselinux-python
    • windows 不能做为主控端

    安装方法

    python虚拟环境中安装

    推荐使用这种安装,可以和系统环境隔离。

    创建虚拟环境

    #python2
    virtualenv venv
    
    #python3
    python3 -m venv venv
    

    启动虚拟环境

    source venv/bin/activate
    

    在虚拟环境中安装ansible

    #需要先安装paramiko、Jinja2、PyYAML、httplib2、six、uWSGI
    pip install paramiko Jinja2 PyYAML httplib2 six uWSGI -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
    
    #安装ansible
    pip install ansible -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
    
    #可以指定版本
    pip install ansible==2.4.0.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
    
    #更新ansible版本
    pip install ansible --upgrade
    

    查看是否安装成功

    #查看版本
    ansible --version
    

    全局安装

    全局pip安装,在系统python环境下安装,不需要创建虚拟环境。直接用pip install ansible安装即可。

    yum安装(针对centos)

    sudo yum install ansible
    

    apt安装(针对ubuntu)

    sudo apt install ansible
    

    Git安装

    git clone git://github.com/ansible/ansible.git --recursive
    cd ./ansible
    source ./hacking/env-setup
    

    查看是否安装成功

    #查看版本
    ansible --version
    

    基本使用

    Ansible相关工具

    • ansible 主程序,临时命令执行工具
    • ansible-doc 查看配置文档,模块功能查看工具
    • ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
    • ansible-playbook 定制自动化任务,编排剧本工具
    • ansible-pull 远程执行命令的工具
    • ansible-vault 文件加密工具
    • ansible-console 基于Console界面与用户交互的执行工具

    利用ansible实现管理的主要方式

    • Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
    • Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

    ansible命令执行过程

    1.加载自己的配置文件,

    默认/etc/ansible/ansible.cfg

    2.加载自己对应的模块文件,如:command

    3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件

    4.给文件+x执行

    5.执行并返回结果

    6.删除临时py文件,退出

    ansible-doc

    此工具用来显示模块帮助

    格式

    ansible-doc [options] [module...]
    -l, --list          #列出可用模块
    -s, --snippet       #显示指定模块的playbook片段
    

    范例:

    #列出所有模块
    ansible-doc -l  
    #查看指定模块帮助用法
    ansible-doc ping  
    #查看指定模块帮助用法
    ansible-doc -s  ping 
    

    ansible

    此工具通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能

    建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点

    ansible默认就是基于密钥认证的方式连接远程主机,如果要用账号密码的方式连接,需要在ansible命令后加上-u,表示用户,-k或者--ask-pass,表示密码。

    范例:利用sshpass批量实现基于key验证

    #!/bin/bash
    ssh-keygen -f /root/.ssh/id_rsa  -P ''
    NET=192.168.100
    export SSHPASS=magedu
    for IP in {1..200};do 
        sshpass -e ssh-copy-id  NET.IP 
    done
    

    格式:

    ansible <host-pattern> [-m module_name] [-a args]
    

    选项说明:

    --version           #显示版本
    -m module           #指定模块,默认为command
    -v                  #详细过程 –vv  -vvv更详细
    --list-hosts        #显示主机列表,可简写 --list
    -k, --ask-pass      #提示输入ssh连接密码,默认Key验证    
    -C, --check         #检查,并不执行
    -T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
    -u, --user=REMOTE_USER #执行远程执行的用户
    -b, --become        #代替旧版的sudo 切换
    --become-user=USERNAME  #指定sudo的runas用户,默认为root
    -K, --ask-become-pass  #提示输入sudo时的口令
    -a					# 指定命令参数
    

    主机清单inventory

    主机清单表示的是需要ansible管理的远程主机。

    1. 主机清单配置在默认的文件中(/etc/ansible/hosts)

    如果是pip安装的ansible,默认是没有这个文件的,需要手动创建。

    1. 主机清单配置在单独的文件中,可以建立一个文件夹(inventories)来存放主机清单,使用的时候用 -i inventories/{{ file_name }} 来指定主机清单。

    主机清单格式

    [appservers]
    192.168.0.1
    192.168.0.2
    

    列出所有主机清单

    ansible all --list-hosts
    

    范例

    ansible all –m ping
    

    常用模块

    范例有时候是自己主机上测试的,有时候是直接复制参考文档里的。

    列出ansible总共有多少模块

    ansible-doc -l | wc -l
    
    • command
    • shell
    • scrip
    • copy
    • fetch
    • file
    • unarchive
    • archive
    • hostname
    • cron
    • yum
    • service
    • user
    • group
    • setup

    command

    功能:在远程主机执行命令,此为默认模块,可忽略-m选项

    注意:此命令不支持 $VARNAME < > | ; & 等,用shell模块实现

    范例

    [xxf1074@localhost ~]$ ansible all --list-hosts
      hosts (1):
        127.0.0.1
    [xxf1074@localhost ~]$ ansible all -m command -a 'chdir=/etc cat centos-release'
    127.0.0.1 | SUCCESS | rc=0 >>
    CentOS release 6.10 (Final)
    
    [xxf1074@localhost ~]$ ansible all -a 'ls test'
    127.0.0.1 | SUCCESS | rc=0 >>
    index.html
    mytest
    test1
    test2
    

    shell

    功能:和command相似,但是支持通配符、管道等

    可以把shell模块设置成默认模块

    [root@ansible ~]#vim /etc/ansible/ansible.cfg
    #修改下面一行
    module_name = shell
    

    范例

    [xxf1074@localhost ~]$ ansible all -m shell -a 'echo $HOSTNAME'
    127.0.0.1 | SUCCESS | rc=0 >>
    localhost.localdomain
    

    script

    功能:在远程主机上运行ansible服务器上的脚本

    范例:

    ansible all -m script -a /data/test.sh
    

    /data/test.sh是本地的文件,它会自动复制到远程主机执行。

    copy

    功能:从ansible服务器主控端复制文件到远程主机

    范例:

    #如目标存在,默认覆盖,此处指定先备份
    ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh    owner=wang  mode=600 backup=yes"
    #指定内容,直接生成目标文件    
    ansible websrvs -m copy -a "content='test line1
    test line2' dest=/tmp/test.txt"
    #复制/etc/下的文件,不包括/etc/目录自身
    ansible websrvs -m copy -a "src=/etc/ dest=/backup"
    

    fetch

    功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

    范例:

    ansible websrvs -m fetch -a 'src=/root/test.sh dest=/data/scripts'
    

    file

    功能:设置文件属性

    范例:

    #创建空文件
    ansible all -m  file  -a 'path=/data/test.txt state=touch'
    ansible all -m  file  -a 'path=/data/test.txt state=absent'
    ansible all -m file -a "path=/root/test.sh owner=wang mode=755“
    #创建目录
    ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
    #创建软链接
    ansible all -m file -a "src=/data/testfile  dest=/data/testfile-link state=link"
    

    unarchive

    功能:解包解压缩

    实现有两种用法:
    1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes
    2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

    常见参数:

    • copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
    • remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
    • src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
    • dest:远程主机上的目标路径
    • mode:设置解压缩后的文件权限

    范例:

    ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo'
    ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
    ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
    

    archive

    功能:打包压缩

    范例:

    ansible websrvs -m archive  -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2  owner=wang mode=0600'
    

    hostname

    功能:管理主机名,即修改远程主机的主机名

    范例:

    ansible node1 -m hostname -a "name=websrv"
    ansible 192.168.100.18 -m hostname -a 'name=node18.magedu.com'
    

    cron

    功能:计划任务
    支持时间:minute,hour,day,month,weekday

    范例:

    #备份数据库脚本
    [root@centos8 ~]#cat mysql_backup.sh 
    mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip > /data/mysql_date +%F_%T.sql.gz
    
    #创建任务
    ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
    ansible websrvs   -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime"
    #禁用计划任务
    ansible websrvs   -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=yes"
    #启用计划任务
    ansible websrvs   -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=no"
    #删除任务
    ansible websrvs -m cron -a "name='backup mysql' state=absent"
    ansible websrvs -m cron -a 'state=absent name=Synctime'
    

    yum

    功能:管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本

    范例:

    ansible websrvs -m yum -a 'name=httpd state=present'  #安装
    ansible websrvs -m yum -a 'name=httpd state=absent'  #删除
    

    service

    功能:管理服务

    范例:

    ansible all -m service -a 'name=httpd state=started enabled=yes'
    ansible all -m service -a 'name=httpd state=stopped'
    ansible all -m service -a 'name=httpd state=reloaded’
    ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
    ansible all -m service -a 'name=httpd state=restarted' 
    

    user

    功能:管理用户

    范例:

    #创建用户
    ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
    
    ansible all -m user -a 'name=nginx comment=nginx uid=88 group=nginx groups="root,daemon" shell=/sbin/nologin system=yes create_home=no  home=/data/nginx non_unique=yes'
    
    #删除用户及家目录等数据
    ansible all -m user -a 'name=nginx state=absent remove=yes'
    

    group

    功能:管理组

    范例:

    #创建组
    ansible websrvs -m group  -a 'name=nginx gid=88 system=yes'
    #删除组
    ansible websrvs -m group  -a 'name=nginx state=absent'
    

    setup

    功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度,可以使用gather_facts: no来禁止 Ansible 收集 facts 信息

    范例:

    ansible all -m setup
    ansible all -m setup -a "filter=ansible_nodename"
    ansible all -m setup -a "filter=ansible_hostname"
    ansible all -m setup -a "filter=ansible_domain"
    ansible all -m setup -a "filter=ansible_memtotal_mb"
    ansible all -m setup -a "filter=ansible_memory_mb"
    ansible all -m setup -a "filter=ansible_memfree_mb"
    ansible all -m setup -a "filter=ansible_os_family"
    ansible all -m setup -a "filter=ansible_distribution_major_version"
    ansible all -m setup -a "filter=ansible_distribution_version"
    ansible all -m setup -a "filter=ansible_processor_vcpus"
    ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
    ansible all -m setup -a "filter=ansible_architecture"
    ansible all -m  setup  -a "filter=ansible_processor*"
    

    ansible-playbook

    playbook介绍

    playbook 剧本是由一个或多个“play”组成的列表
    play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
    Playbook 文件是采用YAML语言编写的

    YAML语言

    YAML 官方网站:http://www.yaml.org

    • 在单一文件第一行,用连续三个连字号“-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
    • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
    • 使用#号注释代码
    • 缩进必须是统一的,不能空格和tab混用
    • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
      YAML文件内容是区别大小写的,key/value的值均需大小写敏感
    • 多个key/value可同行写也可换行写,同行使用,分隔
    • v可是个字符串,也可是另一个列表
    • 一个完整的代码块功能需最少元素需包括 name 和 task
    • 一个name只能包括一个task
    • YAML文件扩展名通常为yml或yaml

    List列表

    范例:

    # A list of tasty fruits
    - Apple
    - Orange
    - Strawberry
    - Mango
    
    [Apple,Orange,Strawberry,Mango]
    

    Dictionary字典

    范例:

    # An employee record
    name: Example Developer
    job: Developer
    skill: Elite
    
    # 也可以将key:value放置于{}中进行表示,用,分隔多个key:value
    # An employee record
    {name: "Example Developer", job: "Developer", skill: "Elite"}
    

    范例:

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

    Playbook核心元素

    • Hosts 执行的远程主机列表
    • Tasks 任务集
    • Variables 内置变量或自定义变量在playbook中调用
    • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
    • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

    范例:

    #Playbook实现安装Apache
    ---
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: "安装Apache"
          yum: name=httpd
        - name: "复制配置文件"
          copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
        - name: "复制配置文件"
          copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
        - name: "启动Apache,并设置开机启动"
          service: name=httpd state=started enabled=yes
    

    playbook命令

    格式

    ansible-playbook <filename.yml> ... [options]
    

    常见选项

    -C --check          #只检测可能会发生的改变,但不真正执行操作
    --list-hosts        #列出运行任务的主机
    --list-tags         #列出tag
    --list-tasks        #列出task
    --limit 主机列表      #只针对主机列表中的主机执行
    -v -vv  -vvv        #显示过程
    

    范例

    ansible-playbook  file.yml  --check #只检测
    ansible-playbook  file.yml  
    ansible-playbook  file.yml  --limit websrvs
    

    playbook中使用变量

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

    变量定义:

    variable=value
    

    变量调用方式:

    通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用“{{ variable_name }}”才生效

    变量来源:

    1.ansible 的 setup facts 远程主机的所有变量都可直接调用

    2.通过命令行指定变量,优先级最高

       ansible-playbook -e varname=value
    

    3.在playbook文件中定义

       vars:
         - var1: value1
         - var2: value2
    

    4.在独立的变量YAML文件中定义

       - hosts: all
         vars_files:
           - vars.yml
    

    5.在 /etc/ansible/hosts 中定义,或者说是主机清单文件中定义

    主机(普通)变量:主机组中主机单独定义,优先级高于公共变量
    组(公共)变量:针对主机组中所有主机定义统一变量

    主机变量

    在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用

    范例:

    [websrvs]
    www1.magedu.com http_port=80 maxRequestsPerChild=808
    www2.magedu.com http_port=8080 maxRequestsPerChild=909
    
    组(公共)变量

    在inventory 主机清单文件中赋予给指定组内所有主机上的在playbook中可用的变量,如果和主机变是同名,优先级低于主机变量

    范例:

    [websrvs]
    www1.magedu.com
    www2.magedu.com
    
    [websrvs:vars]
    ntp_server=ntp.magedu.com
    nfs_server=nfs.magedu.com
    

    6.在role中定义

    template

    模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法

    template功能:可以根据和参考模块文件,动态生成相类似的配置文件
    template文件必须存放于templates目录下,且命名为 .j2 结尾
    yaml/yml 文件需和templates目录平级,目录结构如下示例:
    ./
    ├── temnginx.yml
    └── templates
    └── nginx.conf.j2

    范例:利用template 同步nginx配置文件

    #准备templates/nginx.conf.j2文件
    vim temnginx.yml
    ---
    - hosts: websrvs
      remote_user: root
    
      tasks:
        - name: template config to remote hosts
          template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
    
     ansible-playbook temnginx.yml
    
    template中使用流程控制 for 和 if

    template中也可以使用流程控制 for 循环和 if 条件判断,实现动态生成文件功能

    范例:for的使用

    #temlnginx2.yml
    ---
    - hosts: websrvs
      remote_user: root
      vars:
        nginx_vhosts:
          - 81
          - 82
          - 83
      tasks:
        - name: template config
          template: src=nginx.conf.j2 dest=/data/nginx.conf
    
    #templates/nginx.conf2.j2
    {% for vhost in  nginx_vhosts %}
    server {
       listen {{ vhost }}
    }
    {% endfor %}
    
    ansible-playbook -C  templnginx2.yml  --limit 10.0.0.8
    
    #生成的结果:
    server {
       listen 81   
    }
    server {
       listen 82   
    }
    server {
       listen 83   
    }
    

    范例:if的使用

    #templnginx5.yml
    - hosts: websrvs
      remote_user: root
      vars:
        nginx_vhosts:
          - web1:
            listen: 8080
            root: "/var/www/nginx/web1/"
          - web2:
            listen: 8080
            server_name: "web2.magedu.com"
            root: "/var/www/nginx/web2/"
          - web3:
            listen: 8080
            server_name: "web3.magedu.com"
            root: "/var/www/nginx/web3/"
      tasks:
        - name: template config to 
          template: src=nginx.conf5.j2 dest=/data/nginx5.conf
    
    #templates/nginx.conf5.j2
    {% for vhost in  nginx_vhosts %}
    server {
       listen {{ vhost.listen }}
       {% if vhost.server_name is defined %}
    server_name {{ vhost.server_name }}
       {% endif %}
    root  {{ vhost.root }}
    }
    {% endfor %}
    
    #生成的结果
    server {
       listen 8080
       root  /var/www/nginx/web1/
    }
    server {
       listen 8080
       server_name web2.magedu.com
       root  /var/www/nginx/web2/
    }
    server {
       listen 8080
       server_name web3.magedu.com
       root  /var/www/nginx/web3/
    }
    

    playbook使用 when

    when语句,可以实现条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过在task后添加when子句即可使用条件测试,jinja2的语法格式

    范例:

    ---
    - hosts: websrvs
      remote_user: root
      tasks:
        - name: "shutdown RedHat flavored systems"
          command: /sbin/shutdown -h now
          when: ansible_os_family == "RedHat"
    

    范例:

    ---
    - hosts: websrvs
      remote_user: root
      tasks: 
        - name: install conf file to centos7
          template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
          when: ansible_distribution_major_version == "7"
        - name: install conf file to centos6
          template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
          when: ansible_distribution_major_version == "6"
    

    playbook 使用迭代 with_items

    迭代:当有需要重复性执行的任务时,可以使用迭代机制
    对迭代项的引用,固定变量名为”item
    要在task中使用with_items给定要迭代的元素列表

    列表元素格式:

    • 字符串
    • 字典

    范例:

    ---
    - hosts: websrvs
      remote_user: root
    
      tasks:
        - name: add several users
          user: name={{ item }} state=present groups=wheel
          with_items:
            - testuser1
            - testuser2
    #上面语句的功能等同于下面的语句
        - name: add user testuser1
          user: name=testuser1 state=present groups=wheel
        - name: add user testuser2
          user: name=testuser2 state=present groups=wheel
    

    示例:字典

    ---
    - hosts: websrvs
      remote_user: root
    
      tasks:
        - name: add some groups
          group: name={{ item }} state=present
          with_items:
            - nginx
            - mysql
            - apache
        - name: add some users
          user: name={{ item.name }} group={{ item.group }} state=present
          with_items:
            - { name: 'nginx', group: 'nginx' }
            - { name: 'mysql', group: 'mysql' }
            - { name: 'apache', group: 'apache' }
    

    role

    角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。

    roles:多个角色的集合, 可以将多个的role,分别放至roles目录下的独立子目录中
    roles/
    mysql/
    httpd/
    nginx/
    redis/

    roles目录结构:
    playbook.yml
    roles/
    project/
    tasks/
    files/
    vars/
    templates/
    handlers/
    default/
    meta/

    Roles各目录作用
    roles/project/ :项目名称,有以下子目录

    • files/ :存放由copy或script模块等调用的文件

    • templates/:template模块查找所需要模板文件的目录

    • tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

    • handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

    • vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

    • meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含

    • default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

    针对大型项目使用Roles进行编排
    范例:roles的目录结构

    nginx-role.yml 
    roles/
    └── nginx 
         ├── files
         │    └── main.yml 
         ├── tasks
         │    ├── groupadd.yml 
         │    ├── install.yml 
         │    ├── main.yml 
         │    ├── restart.yml 
         │    └── useradd.yml 
         └── vars 
              └── main.yml 
    

    playbook调用角色

    调用角色方法1:

    ---
    - hosts: websrvs
      remote_user: root
      roles:
        - mysql
        - memcached
        - nginx   
    

    调用角色方法2:

    键role用于指定角色名称,后续的k/v用于传递变量给角色

    ---
    - hosts: all
      remote_user: root
      roles:
        - mysql
        - { role: nginx, username: nginx }
    

    调用角色方法3:

    还可基于条件测试实现角色调用

    ---
    - hosts: all
      remote_user: root
      roles:
        - { role: nginx, username: nginx, when: ansible_distribution_major_version == ‘7’  }
    

    roles 中 tags 使用

    #nginx-role.yml
    ---
    - hosts: websrvs
      remote_user: root
      roles:
        - { role: nginx ,tags: [ 'nginx', 'web' ] ,when: ansible_distribution_major_version == "6“ }
        - { role: httpd ,tags: [ 'httpd', 'web' ]  }
        - { role: mysql ,tags: [ 'mysql', 'db' ] }
        - { role: mariadb ,tags: [ 'mariadb', 'db' ] }
    
    ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
    
  • 相关阅读:
    js 获取两个日期相差的天数--自定义方法
    C# Dictionary类型转json方法之一
    C# Obsolete(已弃用方法属性)
    css 样式计算器
    edge 浏览器自动识别电话号码解问题解决方法
    js 中止程序继续进行(break continue return throw)
    js根据等号(=)前名称获取参数值
    JS 时间格式为/Date(1332919782070)/ 转化为正常的格式
    input 内容发生改变时触发事件
    自我介绍for软件工程课程
  • 原文地址:https://www.cnblogs.com/shengmading/p/14425792.html
Copyright © 2020-2023  润新知