ansible

运维工具介绍

Ansible

Ansible优点:
  Agentless       (去中心化)
  Stupied Simple (上手简单,学习曲线平滑)
  SSH by default (安全,无需安装客户端)
  YAML no code,定制剧本 (语法简单,维护方便)

自动工具衍生过程:
    早期(很复杂,使用复杂,安装复杂,配置复杂):chef cfengine(C语言) func
    中期(向轻量型发展):puppet (ruby)
    近代(轻量工具): saltstack ansible (Python)

Ansible使用场景:

ls cd pwd top touch cp mv rm mkdir ln useradd userdel use* group* passwd* cat head tail tac
more less set ifconfig scp rsync
(1)文件传输:
        mv cp scp rsync
(2)命令执行:
      剩下的其它命令

安装http服务:
安装
配置
启动服务(本机的服务启动) tasks
让服务对用户提供服务(路由器配置,iptables)

Ansible企业实际应用场景分析:
(1)Dev开发环境
    使用者:程序员
    功能:程序员开发软件测试BUG的环境
    管理者:千万不能是运维,一定是要程序员自已
(2)测试环境
    使用者:qa测试工程师
    功能:测试经过Dev环境测试通过的软件的功能
    管理者:运维
    备注:测试环境往往有多套(测试环境满足测试功能即可,不宜过多)
    (1)测试同学希望测试环境有多套
    公司的产品多产品线并发,即多个版本,意味着多个版本同步测试
    (2)通常情况下,测试环境有多少套和产品线数量保持一样
(3)发布环境(代码发布机,有些公司堡垒机(安全屏障))
    使用者:运维
    功能:发布代码至生产环境
    管理者:运维(有经验的)
    发布机:往往需要有2台(主备)
(4)生产环境
  使用者:运维,只能是运维(极少数情况下会开放权限给核心开发人员,
     极少数公司将该环境权限完全开放给开发人员并让开发人员维护)
    功能:对用户提供公司产品的服务
    管理者:只能是运维
    生产环境服务器数量:一般比较多,且应用非常重要。
           往往需要自动工具协助部署配置应用。机器数量具体和公司业务规模相关。
(5)灰度环境(生产环境的一部分)
    使用者:运维
    功能:在全量发布代码前将代码的功能面向少量精准用户发布的环境
    案例:
    大家手头100台服务器,先发布其中的10台服务器,这10台服务器就是灰度服务器
    管理者:只能是运维
    为什么灰度环境:往往该版本功能变更较大,为保险起见特意先让一部分用户优化
      体验该功能,待这部分用户使用没有重大问题的时候,再全量发布至所有服务器。

基于key认证:
     ssh-keygen    然后一直回车 生成成功
     ssh-cpio-id root@172.18.12.11(目标主机)   回车输入密码
     然后使用ssh 172.18.12.11 验证,不需要输入密码即成功

Ansible安装

yum install ansible -y
ansible –verison ##查看安装的版本号

Ansible 1.9和2.0的区别:
(1) 最大区别是2.0的API调用方式发生变化,1.9原有的api调用方式在2.0不再支持
(2) 2.0增加了重要的功能: ansible-console
(3) Ansible 2.0的模块数量增加很多,500+个模块数量

Ansible命令集

/usr/bin/ansible   # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
/usr/bin/ansible-doc  # Ansible 模块功能查看工具
/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块 的官网平台,基于网络的
/usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具
/usr/bin/ansible-pull # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)
/usr/bin/ansible-vault # Ansible 文件加密工具
/usr/bin/ansible-console  # Ansible基于Linux Consoble界面可与用户交互的命令执行工具

Ansible高级自定义插件目录(需要python基础)

/usr/share/ansible_plugins
action  ((可能使用较多))
callback (可能使用较多)
connection
filter
lookup
vars

调用ping模块检测172.16.0.68是否存活
          ansible 172.16.0.68 -m ping
返回信息如下:
172.16.0.68 | success >> {
    “changed”: false, 
    “ping”: “pong”
}
   也可以这样使用: ansible “172.16.0.6” -m ping

– Ansible模块查看
       ansible-doc -l

– Ansible command创建文件
      ansible 172.16.0.6
-m command -a “touch /tmp/stanley.md”
      有特殊符号的需使用shell 模块 :  -m  shell

Ansible命令详解:
Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, –args=MODULE_ARGS
                        module arguments  # 指定Ansible调用的模块
  –ask-become-pass     ask for privilege escalation password # Ansible su切换用户的时候使用该参数输入密码
  -k, –ask-pass        ask for SSH password  # 以密码认证
  –ask-su-pass         ask for su password (deprecated, use become) # su的时候使用该 参数
  -K, –ask-sudo-pass   ask for sudo password (deprecated, use become) # sudo的时候
  –ask-vault-pass      ask for vault password # ansible-valut 加密文件
  -B SECONDS, –background=SECONDS  # 后台等待X秒
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -b, –become          run operations with become (nopasswd implied)
  –become-method=BECOME_METHOD
                        privilege escalation method to use (default=sudo),
                        valid choices: [ sudo | su | pbrun | pfexec | runas ]
  –become-user=BECOME_USER
                        run operations as this user (default=None)  # su到哪个用户
  -C, –check           don’t make any changes; instead, try to predict some
                        of the changes that may occur  # 不执行命令只做命令执行检查
  -c CONNECTION, –connection=CONNECTION
                        connection type to use (default=smart)
  -e EXTRA_VARS, –extra-vars=EXTRA_VARS  # 调用外部变量
                        set additional variables as key=value or YAML/JSON
  -f FORKS, –forks=FORKS  # Ansible一次命令执行并发的线程数
                        specify number of parallel processes to use
                        (default=5)
  -h, –help            show this help message and exit
  -i INVENTORY, –inventory-file=INVENTORY  # Ansible调用的Hosts文件,默认/etc/ansible/hosts
                        specify inventory host file
                        (default=/etc/ansible/hosts)
  -l SUBSET, –limit=SUBSET  # 限定主机列表中的某台机器执行
                        further limit selected hosts to an additional pattern
  –list-hosts          outputs a list of matching hosts; does not execute
                        anything else  ## 列出主机列表中的主机
  -m MODULE_NAME, –module-name=MODULE_NAME  # Ansible 调用的执行模块
                        module name to execute (default=command)
  -M MODULE_PATH, –module-path=MODULE_PATH
                        specify path(s) to module library (default=None)
  -o, –one-line        condense output
  -P POLL_INTERVAL, –poll=POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  –private-key=PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  -S, –su              run operations with su (deprecated, use become) #使用su和become结合使用
  -R SU_USER, –su-user=SU_USER  # su的话切换至哪个用户
                        run operations with su as this user (default=root)
                        (deprecated, use become)
  -s, –sudo            run operations with sudo (nopasswd) (deprecated, use
                        become)  # 执行sudo命令
  -U SUDO_USER, –sudo-user=SUDO_USER  # sudo 
                        desired sudo user (default=root) (deprecated, use
                        become)
  -T TIMEOUT, –timeout=TIMEOUT  # 执行命令的超时时间
                        override the SSH timeout in seconds (default=10)
  -t TREE, –tree=TREE  log output to this directory
  -u REMOTE_USER, –user=REMOTE_USER
                        connect as this user (default=root)
  –vault-password-file=VAULT_PASSWORD_FILE  ## ansible-vault加密的密码文件
                        vault password file
  -v, –verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)  # 显示详细信息 -vvvv
  –version             show program’s version number and exit ## 显示版本号

Ansiblie命令执行过程 (-vvvv)

  1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如command
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的
       对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件
  4. 给文件+x执行
  5. 执行并返回结果
  6. 删除临时py文件,sleep 0退出

    Ansible核心组件:
    ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件;
    INVENTORY:Ansible管理主机的清单;/etc/ansible/hosts
    MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义; (ansible-doc -l获取Ansible的所有模块列表)
    PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用。
    API:供第三方程序调用的应用程序编程接口;
    ANSIBLE:该部分图中表示的不明显,组合INVENTORY、API、MODULES、PLUGINS的绿框大家可以理解为是ansible命令工具,其为核心执行工具;

    Ansible命令执行来源:
    (1) USER,普通用户,即SA (SYSTEM ADMINISTRATOR)。
    (2) CMDB API 调用
    (3) PUBLIC/PRIVATE CLOUD API调用
    (4)USER-> Ansible Playbook -> Ansibile
    Ansible-playbook(剧本):
    a> 将已有编排好的任务集写入Ansible-Playbook
    b> 通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行。

    Ansible 和 Ansible-playbook的使用场景:
    Ansible 主要用于临时命令使用场景
    Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划。

    Ansible主要操作对象: 
    HOSTS(主要学习)
    NETWORKING

    Ansible组件调用关系:(大家自己总结)

Ansible 实战演练

ansible 172.16.0.6* -m command -a ‘ls /tmp’

– Ansible group 定义:
[groupname]  定义Inventory 组,后面可跟ip ,也可跟hostname

[mageduweb]
172.16.0.68
172.16.0.69

Ansible 配置文件(绝大多数配置保持默认就好)
(1)[defaults]

inventory      = /etc/ansible/hosts  # 主机列表配置文件

library        = /usr/share/my_modules/ # 库文件存放目录 

remote_tmp     = $HOME/.ansible/tmp  # 生成的临时py命令文件存放在远程主机的目录

local_tmp      = $HOME/.ansible/tmp # 本机的临时命令执行目录

forks          = 5   # 默认并发数

poll_interval  = 15   # 默认的线程池

sudo_user      = root  # 默认sudo 用户

ask_sudo_pass = True

ask_pass      = True

transport      = smart

remote_port    = 22

module_lang    = C

module_set_locale = False

host_key_checking = False  ### 检查对应服务器的host_key

(2)[privilege_escalation]
(3)[paramiko_connection]
(4)[ssh_connection]
(5)[accelerate]
(6)[selinux]
(7)[colors]

Ansible模块:
– command模块:使用ansible自带模块执行命令  如果要用 > < | & ‘ ‘ 使用shell模块 core
ansible mageduweb -m command -a ‘ls /tmp’
ansible mageduweb -m command -a ‘cat /tmp/stanley.md | grep echo’  ##执行失败,即使不返回失败结果也不会正常生效

– creates
        a filename or (since 2.0) glob pattern, when it already exists, this
        step will not be run.
        [Default: None]

– shell 模块: 调用bash执行命令 类似 cat /tmp/stanley.md | awk -F’|’ ‘{print $1,$2}’ &> /tmp/stanley.txt 这些复杂命令,即使使用shell也会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器(执行Ansible命令的机器往往称为:Master机或者中控机或者堡垒机)。
ansible mageduweb -m shell -a ‘echo magedu | passwd –-stdin stanley’

– copy: 复制本地文件至远程服务器,并且能够改属性等
ansible mageduweb -m copy -a ‘src=/root/125.sh dest=/root/p.sh owner=stanley backup=no mode=600’

cron:定时执行任务的模块

* * * *
分 时 日 月 周 

// 增加一条crontab
ansible mageduweb -m cron -a ‘minute=”
/5″ job=”/usr/sbin/ntpdate 172.16.0.1 &> /dev/null” name=”SynctimeStanley”‘

// 删除名为SynctimeStanley的crontab任务
ansible mageduweb -m cron -a ‘state=absent name=”SynctimeStanley”‘

– fetch模块: 从远程服务器拉取文件至本机,
只能fetch文件,不能fetch目录,如果拉目录,先tar/zip 再拉到本机即可
     ansible mageduweb -m fetch -a ‘src=/root/p.sh dest=/root/ppp.sh’
                                      远程主机目录      本地主机目录

– file模块: 设置文件属性
ansible mageduweb -m file -a ‘path=/root/p.sh mode=755’  # 设置文件属性,
ansible mageduweb -m file -a ‘src=/root/p.sh dest=/tmp/pp.sh mode=644
                              state=touch’ # 复制文件并且设置文件属性

create a directory if it doesn’t exist        #建立目录
– file: path=/etc/some_directory state=directory mode=0755
 

ansible 172.18.12.12 -m hostname -a ‘name={{ hostname }}{{ http_port }}’
                          #定义主机名,自己的变量优先于组变量

– pip 模块: Python的包管理工具
ansible mageduweb -m pip -a ‘name=pip2’

– ping 模块: 检测主机存活

– yum模块: 安装软件
ansible mageduweb -m yum -a ‘name=httpd state=latest’  //安装httpd包
ansible mageduweb -m shell -a ‘ss -tnl | grep 80 ‘
ansible mageduweb -m command -a ‘ss -tnl ‘
ansible mageduweb -m command -a ‘systemctl start httpd.service’
ansible mageduweb -m command -a ‘systemctl stop httpd.service’

– service模块:
ansible mageduweb -m service -a ‘name=httpd state=started’
ansible mageduweb -m service -a ‘name=httpd state=stopped’

– user模块:

ansible mageduweb -m user -a ‘name=magedu home=/tmp/magedu/ shell=/bin/bash uid=2000 comment=”test user” group=root’

Ansible系列命令

ansible           ansible-doc       ansible-playbook  ansible-vault     
ansible-console   ansible-galaxy    ansible-pull 

– ansible-galaxy
用法:
ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [–help] [options] …

去 https://galaxy.ansible.com/ 上传或下载优秀的Playbook(roles)

* 列出所有已安装的galaxy
ansible-galaxy list

* 安装galaxy
ansible-galaxy install geerlingguy.redis

* 删除galaxy
ansible-galaxy remove geerlingguy.redis

– ansible-playbook用法 

Usage: ansible-playbook playbook.yml

– ansible-valut用法
Usage: ansible-vault [create|decrypt|edit|encrypt|rekey|view] [–help] [options] vaultfile.ym

ansible-vault encrypt hello.yml  # 加密
ansible-vault decrypt hello.yml  # 解密
ansible-vault view hello.yml  # 查看

– ansible-console用法 
root@mageduweb (2)[f:10] $ service name=httpd state=stopped

root@mageduweb (2)[f:10] $
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$

设置并发数: forks n  例如: forks 10
切换组: cd groupname  例如: cd mageduweb
列出当前组主机列表: list
列出所有的内置模块: ?

执行状态:
绿色: 执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败

ansible all -m ping -u bruce -b –become-user batman

Ansible-playbook 剧本

– hosts: mageduweb
  remote_user: root
  
  tasks:
    – name: add group nginx
      user: name=nginx state=present

    – name: add user nginx
      user: name=nginx state=present group=nginx

    – name: Install Nginx
      yum: name=nginx state=present

    – name: Start Nginx
      service: name=nginx state=started enabled=yes

* 安装http脚本实现:

!/bin/bash

安装Apache

yum install –quiet -y httpd httpd-devel   # command: yum install –quiet -y httpd httpd-devel

复制配置文件

cp /path/to/config/httpd.conf /etc/httpd/conf/httpd.conf -f
cp/path/to/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf -f

启动Apache,并设置开机启动

service httpd start
chkconfig httpd on

* 安装httpd ansible-playbook实现


– hosts: all
  tasks:
   – name: “安装Apache”
     command: yum install –quiet -y httpd httpd-devel
   – name: “复制配置文件”
     command: cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
     command: cp /tmp/httpd-vhosts.conf /etc/httpd/conf/httpd-vhosts.conf
   – name: “启动Apache,并设置开机启动”
     command: service httpd start
     command: chkconfig httpd on

* Playbook 核心组件
      Hosts       #执行的远程主机列表
      Tasks       #任务集
      Varniables  #内置变量或自定义变量在playbook中调用
      Templates   #模板,可替换模板文件中的变量及可实现一些简单逻辑的文件。
      Handlers    #和nogity结合使用,为条件触发操作,满足条件方才执行否则不执行

* tags 标签
  指定某条任务执行
  ansible-playbook –tags=user useradd.yml 

– hosts: mageduweb
  remote_user: root
  
  tasks:
    – name: add group nginx
      tags: user
      user: name=nginx state=present

    – name: add user nginx
      user: name=nginx state=present group=nginx

    – name: Install Nginx
      yum: name=nginx state=present

    – name: Start Nginx
      service: name=nginx state=started enabled=yes

* handlers 和 notify 结合使用触发条件,让playbook在满足一定触发条件时才去执行某条task

– hosts: mageduweb
  remote_user: root
  
  tasks:
    – name: add group nginx
      tags: user
      user: name=nginx state=present

    – name: add user nginx
      user: name=nginx state=present group=nginx

    – name: Install Nginx
      yum: name=nginx state=present

    – name: config 
      copy: src=/root/config.txt dest=/etc/nginx/config.txt
      notify:
        – Restart Nginx
        – Check Nginx Process

  handlers:
    – name: Restart Nginx
      service: name=nginx state=restarted enabled=yes
    – name: Check Nginx Process
      shell: ss -tnl | grep 80

playbook 变量使用

  • 变量来源:
      (1)ansible setup facts远程主机的所有变量都可以用
      (2)自定义变量
          a. 在/etc/ansible/hosts 定义变量,在主机组中的主机单独定义,优先级高于组中公共变量
          b. 在/etc/ansible/hosts 定义变量,针对主机组中的所有主机集中定义变量
          c. 通过命令行指定变量,优先级最高

  • 变量调用方式:
    {{ variable_name }} 通过{{  }} 调用变量,且变量和{}两头之间必须有空格
    额外介绍的是:
    在playbook中调用变量时,有时”{{ variable_name }}”需要要双引号引起来方可生效,有时候必须不能用””引起来

  • 变量定义:
    key=value
    例:
    http_port=80

templates

功能:
根据模块文件动态生成对应的配置文件

(1) templates文件必须存放于目录名为templates下,且命名为 .j2 结尾
(2)yaml/yml playbook文件需和templates目录平级,目录结构如下:
    ./
    ├── temnginx.yml
    └── templates
        └── nginx.conf.j2

* template 流语句语法

案例1:
// templates/nginx.conf.j2

{% for vhost in  nginx_vhosts %}
server {
   listen {{ vhost }}

}

{% endfor %}

// temnginx.yml

– hosts: mageduweb
  remote_user: root
  vars:
    nginx_vhosts:
      – web1
      – web2
      – web3
  #  nginx_vhosts:
  #    – listen: 8080
  

  tasks:
    – name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

* 生成的结果:

server {
   listen web1
   
}

server {
   listen web2
   
}

server {
   listen web3
   
}

案例2:

shell脚本与Jinja语法对比:
— shell脚本中写法
for i in {1..10}
do
   con
done

if [ xx ];then
    con
elif
     con
else
    con
fi

— Jinja写法:

//  templates/nginx.conf.j2

{% for vhost in  nginx_vhosts %}
server {
   listen {{ vhost.listen  }}

}

{% endfor %}

* 生成的结果

server {
   listen 8080
   
}

* playbook调用文件
//  temnginx.yml

– hosts: mageduweb
  remote_user: root
  vars:
    nginx_vhosts:
      – listen: 8080

  tasks:
    – name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

* 案例3

// temnginx.yml

– hosts: mageduweb
  remote_user: root
  vars:
    nginx_vhosts:
      – web1:
        listen: 8080
        server_name: “web1.magedu.com”
        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/”

  ## 案例1
  #  nginx_vhosts:
  #    – web1
  #    – web2
  #    – web3
  ## 案例2

  tasks:
    – name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

// templates/nginx.conf.j2

{% for vhost in  nginx_vhosts %}
server {
   listen {{ vhost.listen }}
   server_name {{ vhost.server_name }}
   root  {{ vhost.root }}
   
}

{% endfor %}

* 生成结果:

server {
   listen 8080
   server_name web1.magedu.com
   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/
   
}

* 案例4
// templates/nginx.conf.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 %}

// temnginx.yml

– hosts: mageduweb
  remote_user: root
  vars:
    nginx_vhosts:
      – web1:
        listen: 8080
        #server_name: “web1.magedu.com”
        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/”

  ## 案例1
  #  nginx_vhosts:
  #    – web1
  #    – web2
  #    – web3
  ## 案例2

  tasks:
    – name: template config to remote hosts
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

* 执行命令

ansible-playbook temnginx.yml

* 生成的结果

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/

}

ansible-playbook when条件判断

– hosts: mageduweb
  remote_user: root

  tasks:
    – name: add group nginx
      tags: user
      user: name=nginx state=present

    – name: add user nginx
      user: name=nginx state=present group=nginx

    – name: Install Nginx
      yum: name=nginx state=present

    – name: restart Nginx
      service: name=nginx state=restarted
      when: ansible_distribution_major_version == “6”

ansible-playbook with_items 列表

– hosts: mageduweb
  remote_user: root

  tasks:
  – name: create rsyncd file
    copy: src={{ item }} dest=/tmp/{{ item }}
    with_items:
      – a
      – b
      – c
      – d

  – name: yum install httpd
    yum: name={{ item }}  state=present 
    with_items:
      – apr
      – apr-util
      – httpd

* with_itmes 嵌套子变量

– hosts: mageduweb
  remote_user: root

  tasks:
  – name: add several users
    user: name={{ item.name }} state=present groups={{ item.groups }}
    with_items:
      – { name: ‘testuser1’ , groups: ‘wheel’}
      – { name: ‘testuser2’ , groups: ‘root’}

ansible-playbook 变量定义其它内容

Roles (角色)

针对大型项目使用Roles进行编排。
调用角色的.yml的文件必须和roles同级目录

roles目录结构:
playbook.yml
roles/
  project/
    tasks/
    files/
    vars/  # 不经常用
    default/ # 不经常用
    templates/
    handlers/
    meta/ # 不经常用

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

saltstack
puppet

class 面向对象,写程序一个较为高级的使用。

* 完整的roles架构

// nginx-role.yml 顶层任务调用yml文件

0- hosts: mageduweb
  remote_user: root

  roles:
    – role: nginx
~                  

cat roles/nginx/tasks/main.yml 

– include: groupadd.yml
– include: useradd.yml
– include: install.yml
– include: restart.yml
– include: filecp.yml

cat roles/nginx/tasks/install.yml 

– name: Install Nginx
  yum: name=nginx state=present

ls roles/nginx/files/
main.yml  tom.md

* roles playbook tags使用
ansible-playbook –tags=”nginx,httpd,mysql” nginx-role.yml

// nginx-role.yml

– hosts: mageduweb
  remote_user: root

  roles:
    – { role: nginx ,tags: [ ‘nginx’, ‘web’ ] }
    – { role: httpd ,tags: [ ‘httpd’, ‘web’ ]  }
    – { role: mysql ,tags: [ ‘mysql’, ‘db’ ] }
    – { role: marridb ,tags: [ ‘mysql’, ‘db’ ] }
    – { role: php }

– hosts: mageduweb
  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: marridb ,tags: [ ‘mysql’, ‘db’ ] }
    – { role: php }

其它自己研究的功能

* 委任(指定某一台机器做某一个task)
delegate_to
local_action (专指针对ansible命令执行的机器做的变更操作)
* 交互提示
prompt
* 暂停(java)
wait_for 
* Debug
debug: msg=”This always executes.”
* Include
* Template 多值合并
* Template 动态变量配置

推荐资料

http://galaxy.ansible.com
https://galaxy.ansible.com/explore#/
http://github.com/
http://ansible.com.cn/
https://github.com/ansible/ansible
https://github.com/ansible/ansible-examples

原创文章,作者:shewei,如若转载,请注明出处:http://www.178linux.com/76792

(2)
sheweishewei
上一篇 2017-05-23
下一篇 2017-05-23

相关推荐

  • 初识linux

    Linux 是什么?2014年之前我都没有听说过linux。 简单来说,Linux是一种操作系统,我们知道Windows吧,Linux也是一种操作系统。 特性: (1)字符界面(当然现在也有图形界面了) (2)一切皆文件 (3)许多小工具程序组合 Linux脱胎于Unix,Unix是由贝尔实验开发的。符合posix 标准,Unix系统上面的应用程序大部分可以…

    Linux干货 2016-06-01
  • 网络配置管理:ifcfg、iproute2和ss等相关命令介绍(不完整,需要后期完善)

    网络配置管理:ifcfg、iproute2和ss等相关命令介绍 ifcfg家族: ifconfig [interface] ifconfig interface [aftype] options | address …   -a :查看所有 接口信息 add<地址>:设置网络设备IPv6的ip地址 del<地址>…

    Linux干货 2017-01-19
  • Memcached实现Tomcat的session会话绑定

    memcached介绍:  Memcached是一个高性能的分布式内存对称缓存系统;通过缓存查询数据库结果,介绍数据库访问次数,以提高web应用的速度、提高扩展性。  Memcached特点:   协议简单   基于libevent的事件处理   内置内存存储方式  memcached不互相通信的分…

    Linux干货 2015-08-01
  • Quota和RAID

    高级文件系统管理 磁盘配额 quota 限制用户在某个分区的容量,创建数目的多少!一般实施在家目录 /home 下来限制用户的占用空间 限制某一群组所能使用的最大磁盘配额  (使用群组限制): 限制某一用户的最大磁盘配额  (使用用户限制):它仅能针对整个文件系统来进行设计,无法针对某个单一的目录来设计它的磁盘配额。 限制某一目录 &nb…

    Linux干货 2016-09-01
  • MAN手册各章节功能介绍及快捷键键位整理

       初学linux ,请教别人的时候,遇到人不耐烦回答我等菜菜的问题,都会说一句,“自己去man”,“翻过man了吗,再来问吧”,哦,my gd,这个man到底是何方超人啊,其实man就是linux自带的文档,假如你不知道ls这个命令的用法,你可以试着敲入 man  ls  ,然后来看看,会有啥结果。效果不错吧,一般…

    Linux干货 2016-10-18