一同养成写作习惯!这是我参与「日新计划 4 月更文应战」的第1天,点击检查活动详情。

假设做过运维或许网站开发的朋友,必定接触过服务布置,那么一般的服务布置流程是什么呢?找一台Linux机器,装置好运转环境所需求的软件,然后把服务布置上去。一台机器能够这么做,假设是集群呢?每一台都要这么做。假设咱们办理了几百台机器,突然有一天公司要求在一切机器上都装置某一款软件,那么手动明显是不行的,这个时分就有必要要凭借主动化脚原本完结这项使命了。

主动化履行的方法有许多种,最原始的便是shell脚本,可是明显它不能满足咱们的需求。常见主动化装备办理工具有许多种,slatstack和ansible是比较流行的两种,并且它们都是用python开发的,可是相对来讲ansible的优势愈加明显,首要是因为它拥有许多的模块和插件,并且你在GitHub和gitee上也能够找到许多他人写好的编列剧本,根本拿过来就能够运用了。

ansible超详细讲解,值得收藏

Ansible简介

尽管我认为当你看这篇文章的时分,或许对ansible有了至少一丁丁了解,可是简略的介绍还是要说一下的。Ansible是一个开源装备办理工具,能够运用它来主动化使命,布置应用程序完成IT根底架构。Ansible能够用来主动化日常使命,比方,服务器的初始化装备、安全基线装备、更新和打补丁体系,装置软件包等。

Ansible装置

  • Centos
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum install -y ansible
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible
  • pip装置
pip install ansible

pip这种方法是最便利的,究竟咱们一般都装置了Python,可是或许会有一个问题,装置完今后,咱们找不到装备文件,运用ansible –version检查发现config file是none,导致咱们没法正常运用,这是为什么呢?因为ansible加载装备文件的途径是有次序的。

ansible.cfg文件加载次序

ansible.cfg文件作为装备文件,ansible会在多个途径下进行读取,读取的次序如下:

  • ANSIBLE_CONFIG:环境变量
  • ansible.cfg:当时履行目录下
  • .ansible.cfg:~/.ansible.cfg
  • /etc/ansible/ansible.cfg

所以引荐运用方法是创立一个工程目录,将一切的装备文件都放置在此目录下,这样更便利移植。在ansible.cfg中有如下内容:

[defaults]
inventory = ./hosts
host_key_checking = False

所以咱们运用pip装置后,在主机上经过find指令查找到ansible.cfg,默许会装置到python目录下,将其复制到当时履行目录即可。

装备文件有三个:

  1. ansible.cfg –ansible的装备文件,一般咱们都运用默许装备,只需求改增加一个host_key_checking=False,不运用指纹验证。指纹验证便是当咱们在一台Linux机器上ssh登录另一台Linux时,第一次衔接会让咱们输入Yes/No
  2. hosts –主机文件清单
  3. roles –一个装备人物的文件夹,默许里面是空的

装备Ansible主机清单

清单装备中文文档

主机清单通常用来界说要办理的主机信息,包括IP、用户、暗码以及SSH key装备。能够分组装备,组与组之间能够装备包括联系,使咱们能够按组分配操作主机。装备文件的途径为:/etc/ansible/hosts

基于暗码的方法衔接

vim /etc/ansible/hosts

# 方法一
[web]
192.168.133.111 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.133.112 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.133.123 ansible_ssh_user=root ansible_ssh_pass=123456
# 方法二
[web]
192.168.133.111
192.168.133.112
192.168.133.123
[web:vars]
ansible_ssh_user=root ansible_ssh_pass=123456
# 方法三
[web]
192.168.133.111
192.168.133.112
192.168.133.123
# 在/etc/ansible目录下创立目录group_vars,然后再创立文件web.yml,以组名命名的yml文件
vim /etc/ansible/group_vars/web.yml
# 内容如下
ansible_ssh_user: root
ansible_ssh_pass: 123456

测验指令

ansible web -a 'ls /'

ansible超详细讲解,值得收藏

基于SSH key方法衔接

以下指令均在ansible主机履行,无需到被办理机器操作

# 生成ssh key,一路回车,默许生成在/root/.ssh目录下id_rsa和id_rsa.pub
ssh-keygen

# 将公钥复制到方针主机
ssh-copy-id root@192.168.143.132

# 履行以上句子,并输入暗码,会在方针主机生成一个文件/root/.ssh/authorized_keys
# 之后再衔接方针主机就不需求暗码了

ad-hoc指令

ad-hoc是暂时指令,就像咱们履行的shell指令相同,履行完即结束,ad-hoc形式的指令格局如下:

ansible web -m command -a 'df -h'

指令解说:

  • ansible:指令
  • web:主机名/IP/分组
  • -m:指定模块(默许是command,所以能够把-m command这个去掉)
  • command:模块名称
  • -a:模块参数
  • ‘df -h’:参数值

履行指令回来的结果颜色代表的含义:

绿色:被办理端没有被修正

黄色:被办理端发生改变

红色:履行呈现故障

常用模块介绍

ansible官方存在许多的模块,咱们运用ansible首要运用的也是因为它有许多的模块和插件,虽然模块许多,可是咱们常用的模块就那么几种,下面介绍以下常用模块:

ansible超详细讲解,值得收藏

yum指令

ansible超具体解说,值得保藏

示例:

# 装置最新版的Apache
ansible web -m yum -a "name=httpd state=latest"
# congepel仓库装置罪过的Apache
ansible web -m yum -a "name=httpd state=latest enablerepo=epel"
# 删除Apache软件包
ansible web -m yum -a "name=httpd state=absent"

copy指令

ansible超详细讲解,值得收藏

示例:

# 复制apache装备文件到方针机器
ansible web -m copy -a "src=httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"
# 复制apache装备文件到方针机器,并备份方针文件
ansible web -m copy -a "src=httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"
# 在长途主机创立一个文件并写入内容
ansible web -m copy -a "content=HelloWorld dest=/home/index.html"

get_url指令

ansible超详细讲解,值得收藏

# 下载文件到本地
ansible web -m get_url -a "url=http://xx.xx.xx/ssss.txt dest=/home/xx.txt mode=655"

file指令

# 创立文件
ansible web -m file -a "path=/home/aaa.txt state=touch"
# 创立目录
ansible web -m file -a "path=/home/test state=directory"
# 递归修正目录权限
ansible web -m file -a "path=/home owner=nginx group=nginx mode=766 recurse=yes"

git指令

ansible超详细讲解,值得收藏

以上是部分常用模块的解说与示例,因为ansible的模块和参数许多,咱们就不做具体解说了。可是这儿要说一个十分十分重要的一点,以上全都是废话,任何一个模块,ansible都为咱们供给了十分具体的解说文档,例如检查cron模块的用法,查询指令如下:

ansible-doc cron

ansible超详细讲解,值得收藏

不仅有参数解说,还有履行示例:

ansible超详细讲解,值得收藏

假设想查询都有哪些模块,ansible-doc -l > ansible.doc,当然了,履行示例是依照ansible-playbook的方法显现的,可是咱们略微改一下就能够用ad-doc的方法履行了

报错处理

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: oldboy

这个问题一般是没有在ansible.cfg内指定主机清单文件导致的,装备正确的inventory途径即可,还能够经过在ansible指令后边加-i来指定。

playbook

Playbookad-hoc 相比,是一种彻底不同的运用ansible的方法,相似于saltstack的state状况文件。ad-hoc无法耐久运用,playbook能够耐久运用。playbook是由一个或多个play组成的列表,play的首要功能在于将事前归并为一组的主机装扮成事前经过ansible中的task界说好的人物。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即能够让它们联合起来按事前编列的机制完结某一使命。

Playbook是经过yml语法进行编列的,运用起来十分简略,咱们只需求知道一些根本的关键字就能够完成了。

  • hosts:
  • tasks:
  • vars:
  • templates:
  • handlers:
  • tags:

下面给一个简略的比方:

# httpd.yaml
- hosts: web  
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present      
    - name: configure httpd server    
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf      
    - name: configure httpd server    
      copy: src=index.html dest=/var/www/html/index.html      
    - name: service httpd server    
      service: name=httpd state=started enabled=yes

这是一个装置Apache、装备、发动的流程,咱们看一下其中的关键字。

  • hosts:需求履行的主机、组、IP
  • tasks:履行的使命
  • name:使命描绘
  • yum/copy/service:履行模块(上面咱们介绍过的)

这便是最根底的Playbook的结构,也是一个Playbook所必备的结构,当然还有更多高级的操作,咱们下面经过更多的示例来给大家解说。

搭建nginx服务

- hosts: web
  vars:   
    hello: Ansible    
  tasks:  
    # 装备软件源   
    - name: Configure Yum Repo    
      yum_repository:      
        name: nginx     
        description: nginx repo     
        baseurl: http://nginx.org/packages/centos/7/$basearch/     
        gpgcheck: yes     
        enabled: yes  
    # 装置nginx     
    - name: Install Nginx    
      yum: name=ningx state=present    
    # 替换装备文件   
    - name: Configure Nginx    
      copy:      
        src: nginx.conf     
        dest: /etc/nginx/conf/nginx.conf      
    # 修正首页   
    - name: Change Home    
      copy:      
        content: "Hello {{hello}}"     
        dest: /var/www/html/index.html      
    # 发动nginx   
    - name: Start Nginx    
      service:     
        name: nginx     
        state: started

上面这个比方在模块运用时,我用了两种比方

yum: name=nginx state=present

copy:
  src: nginx.conf  
  dest: /etc/nginx/conf/nginx.conf

这两种方法都是能够的,只是写法不同,期望不要有人被误导,别的在这儿比方中咱们还引进了下一个知识点-变量

Ansible中的变量

为什么要运用变量?

首要咱们要清晰为什么运用变量?变量这个词在编程当中常常用到,咱们一向强调在编程中不要运用魔法数字,尽量运用宏或许变量代替,魔法数字一方面意义不够清晰,别的一方面在修正的时分,要涉及到许多当地,会呈现疏忽。那么在ansible中运用变量的意义也是相同的,清晰意义、便利修正

怎样界说变量和运用变量?

  • 在playbook文件中的hosts下运用vars进行界说
  1. 在playbook文件中直接界说变量
- hosts: web
  vars:  
    web_pack: httpd-2.4.6  
    ftp_pack: vsftpd  
    # - web_pack: httpd-2.4.6 与上面等同   
  tasks:  
    - name: Install {{pack_name}}   
      yum:    
        name:     
          - "{{web_pack}}"     
          - "{{ftp_pack}}"    
          state: present
  1. 额外界说一个变量文件

假设是在多个文件中运用同样的变量,能够界说一个变量文件,在playbook中运用vars_files中引进即可

# vars.yml
web_pack: httpd-2.4.6
ftp_pack: vsftpd
- hosts: web
  vars_files:  
    - ./vars.yml
  • 在主机清单文件中进行界说
  1. 在主机清单文件中界说
# hosts
[web]
192.168.143.122
[web:vars]
pack_name=httpd
# playbook中运用,能够直接运用,假设当时文件中搜索不到,就去主机清单中搜搜
- hosts: web 
  tasks:  
    - name: install {{pack_name}}   
      yum: name={{pack_name}} state=present
  1. 独自界说group_vars和host_vars目录

group_vars是为组界说的变量目录,其下文件名为组名,例如group_vars/web,host_vars是为主机界说的变量目录,其下文件名为IP,例如host_vars/192.168.143.122。

留意:默许状况下,group_vars目录中文件名与hosts清单中的组名保持一致,因而在运用的时分,只对本组有用,其他组不能运用,可是体系还供给了一个特别的组-all,在group_vars新建一个all文件,一切组都能够运用

# web文件
pack_name: httpd
  • 履行playbook时运用-e参数指定变量
ansible-playbook httpd.yml -e "pack_name=httpd" -e "hosts=web"

hosts变量经过-e传递是比较常见的,咱们能够区别测验环境和出产环境,当然你也能够界说不同的文件来区别

ansible 变量的优先级

上面咱们介绍了多种变量的界说方法,那么假设在多个当地界说了相同的变量,优先会运用哪个呢?这就涉及到变量优先级的问题了。

  • 经过履行指令传递的变量
  • 在playbook中引进vars_files中的变量
  • 在playbook中界说的vars变量
  • 在host_vars中界说的变量
  • 在group_vars中组名文件中界说的变量
  • 在group_vars中all文件中界说的变量

ansible resister注册变量

在咱们运用ansible-playbook的时分,它的输出是固定的格局的,假设咱们发动了httpd服务今后,想要看一下这个服务的状况,咱们不能登录到方针主机去检查,那么ansible有什么方法能够检查吗?

- hosts: web
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present      
    - name: service httpd server    
      service: name=httpd state=started enabled=yes      
    - name: check httpd state    
      shell: ps aux|grep httpd    
      register: httpd_status      
    - name: output httpd_status variable    
      debug:     
        msg: "{{httpd_status}}"

ansible超详细讲解,值得收藏

上面是输出了一切的内容,假设需求输出部分内容,只要用变量.特点就行了,特点便是msg下的字典

ansible facts变量的意义

ansible超详细讲解,值得收藏

这是咱们装置Apache的打印,能够看到分为几个进程:PLAY、TASK、PLAY RECAP,在TASK的第一个打印咱们看到是Gathering Facts,可是咱们并没有增加这个使命,这是ansible主动为咱们增加的,这个使命是做什么用的呢?咱们在履行的进程中发现这一块履行时间还比较长。这个使命的首要作用是获取方针主机的信息,咱们看一下都能获取哪些信息,能够经过以下句子打印:ansible web -m setup

ansible超详细讲解,值得收藏

包括CUP、内存、硬盘、网络、主机名、绑定信息、体系版别信息等等,十分多的信息,这些信息都能够在playbook中当做变量运用。

- hosts: web
  tasks:   
    - name: Query Host Info    
      debug:     
        msg: IP address is {{ansible_default_ipv4.address}} in hosts {{ansible_distribution}}

ansible超详细讲解,值得收藏

那么这个能够在什么状况下运用呢?例如依据方针主机的CPU数,装备nginx并发进程数量,当然假设不运用,咱们也能够封闭它。

- hosts: web
  gather_facts: no   
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present      
    - name: service httpd server    
      service: name=httpd state=started enabled=yes

ansible超详细讲解,值得收藏

下面看一个比方:装置memcache

# memcache.yml
- hosts: web  
  tasks:   
    - name: install memcached server    
      yum: name=memcached state=present      
    - name: configure memcached server    
      template: src=./memcached.j2 dest=/etc/sysconfig/memcached      
    - name: service memcached server    
      service: name=memcached state=started enabled=yes      
    - name: check memcached server    
      shell: ps aux|grep memcached    
      register: check_mem      
    - name: debug memcached variables    
      debug:     
        msg: "{{check_mem.stdout_lines}}"
# memcached.j2,经过facts获取的方针主机内存总量
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ansible_memtotal_mb // 2}}"
OPTIONS=""

这儿咱们用到了一个新的模块:template,这个相当于Django的模板语法,支撑Jinjia2烘托引擎和语法。以上完成了playbook的大部分操作,可是那只是常规操作,还有一些愈加灵活的问题需求处理,例如:

咱们只想要履行一个playbook中的某个使命?

检测nginx状况,假设正常就发动或重启,不正常就疏忽,履行其他使命

假设nginx的装备文件没有改变,咱们就不履行发动或重启指令

以上这些状况都需求进行逻辑判别,ansible强壮的当地也正是这儿,下面咱们看一下task的使命操控流程

Task使命操控

使命操控包括以下逻辑关键字:

  1. 条件判别 when
  2. 循环句子 with_items
  3. 触发器 handlers
  4. 标签 tags
  5. 包括 include
  6. 疏忽错误 ignore_error
  7. 错误处理 change

条件判别

假设咱们装置Apache,在centos上装置的是httpd,在Ubuntu上装置的是httpd2,因而咱们需求判别主机信息,装置不同的软件。

- hosts: web
  tasks:   
    - name: Install CentOS Httpd    
      yum: name=httpd state=present    
      when: ( ansible_distribution == "CentOS" )      
    - name: Install Ubuntu Httpd    
      yum: name=httpd2 state=present    
      when: ( ansible_distribution == "Ubuntu" )

给task加上when条件,在履行的时分,就会先判别条件是否满足,假设满足则履行使命,不满足就不履行此使命。咱们再看一个比方:假设Apache服务不正常就重启,不然越过。

- hosts: web
  tasks:   
    - name: check httpd server    
      command: systemctl is-active httpd    
      register: check_httpd      
    - name: httpd restart    
      service: name=httpd state=restarted    
      when: check_httpd.rc == 0

循环指令 with_items

发动多个服务,例如nginx、httpd

- hosts: web
  tasks:   
    - name: Service Start    
      service: name={{item}} state=restarted    
      with_items:     
        - nginx     
        - httpd

复制多个装备文件

- hosts: web
  tasks:   
    - name: Copy Configure File    
      copy:      
        src: {{item.src}}     
        dest: {{item.dest}}     
        mode: {{item.mode}}    
      with_items:     
        - { src: './nginx.conf', dest: '/etc/nginx/conf/nginx.conf' }     
        - { src: './httpd.conf', dest: '/etc/httpd/conf/httpd.conf' }

触发器 handlers

当某个使命发生改变时,触发另一个使命的履行,例如假设httpd的装备文件发生了改变,就履行重启使命

- hosts: web
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present      
    - name: configure httpd server    
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf    
      notify: # 条用名称为Restart Httpd Server的handlers,能够写多个     
        - Restart Httpd Server       
    - name: service httpd server    
      service: name=httpd state=started enabled=yes     
  handlers:   
    - name: Restart Httpd Server    
      service: name=httpd state=restarted

handlers履行的时分需求留意,虽然是在某个使命被触发的,可是它有必要等到一切的task履行完结后,才会履行handlers里面被触发过的指令,假设在履行前,有另一个task履行失利了,那么被触发的handlers也不会履行。

tags标签

对使命指定标签后,咱们在运用ansible-playbook履行的时分就能够指定标签来履行使命,不需求履行一切的使命,标签的设置有三种状况:1. 一个使命设置一个标签 2.一个使命设置多个标签 3. 多个使命设置一个标签

- hosts: web
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present    
      tags: install      
    - name: configure httpd server    
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf    
      notify: # 条用名称为Restart Httpd Server的handlers,能够写多个     
        - Restart Httpd Server    
      tags: configure      
    - name: service httpd server    
      service: name=httpd state=started enabled=yes    
      tags: start     
  handlers:   
    - name: Restart Httpd Server    
      service: name=httpd state=restarted

履行指定tags的指令:ansible-playbook httpd.yml -t “configure”

越过指定tags的指令:ansible-playbook httpd.yml –skip-tags “install”

include包括

咱们能够把使命独自写在一个yaml文件中,然后在其他需求用到的使命中经过include_tasks: xxx.yml引进,举例如下:

# a.yml
- name: restart httpd service  
  service: name=httpd state=restarted
# b.yml
- hosts: web  
  tasks:   
    - name: configure httpd server    
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf      
    - name: restat httpd    
      include_tasks: ./a.yml

当然咱们也能够把两个完整的playbook合并起来

# a.yml
- hosts: web  
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present
# b.yml
- hosts: web  
  tasks:   
    - name: configure httpd server    
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
# total.yml
- import_playbook: ./a.yml
- import_playbook: ./b.yml

在履行total.yml的时分,实践上便是先履行a.yml,然后再履行b.yml,里面的内容实践并不是真实的合并

疏忽错误ignore_errors

咱们知道,在履行playbook的时分,假设其中某个使命失利了,它下面的使命就不会再履行了,可是有时分咱们并不需求一切使命都成功,某些使命是能够失利的,那么这个时分就需求进行容错,便是在这个使命失利的时分,不影响它后边的使命履行。

- hosts: web
  tasks:   
    - name: check httpd status    
      command: ps aux|grep httpd    
      register: httpd_status    
      ignore_errors: yes # 假设查询句子履行失利,继续向下履行重启使命      
    - name: restart httpd    
      service: name=httpd state=restarted

错误处理

  • force_handlers: yes 强制调用handlers只要handlers被触发过,无论是否有使命失利,均调用handlers
- hosts: web
  force_handlers: yes  
  tasks:  
    - name: install httpd   
      yum: name=httpd state=present     
    - name: install fuck   
      yum: name=fuck state=present  
  handlers:  
    - name: restart httpd   
      service: name=httpd state=restarted
  • change_when

当使命履行的时分,假设被控主机端发生了改变,change就会改变,可是某些指令,比方一些shell指令,只是查询信息,并没有做什么修正,可是一向会显现change状况,这个时分咱们就能够强制把change状况关掉。

- hosts: web
  tasks:  
    - name: test task   
    shell: ps aux   
    change_when: false

再看一个比方,假设咱们修正装备文件成功了,就履行重启指令,不然不履行重启

- hosts: web
  tasks:  
    - name: install nginx server   
      yum: name=nginx state=present     
    - name: configure nginx   
      copy: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf    
    # 履行nginx检查装备文件指令  
    - name: check nginx configure   
      command: /usr/sbin/nginx -t   
      register: check_nginx   
      changed_when: ( check_nginx.stdout.find('successful') )     
    - name: service nginx server   
      service: name=nginx state=restarted

Jinja模板

jinja模板是相似Django的模板,假设做过Django的同学应该是比较了解的,咱们运用jinja来装备一下nginx的负载均衡。

- hosts: web
  vars:  
    - http_port: 80  
    - server_name: web.com   
  tasks:  
    - name: instal nginx server   
      yum: name=nginx state=present     
    - name: configure nginx   
      template: src=./nginx.conf dest=/etc/nginx/conf/nginx.conf     
    - name: start nginx   
      service: name=nginx state=started enabled=yes

要使Jinja语法生效,有必要运用template模块处理,这个模块和copy相似,可是它支撑Jinja语法烘托

# nginx.conf
 upstream {{server_name}} { 
   {% for i in range(2) %} 
     server 192.168.143.12{{i}}:{{http_port}}; 
     server 192.168.143.12{{i}}:{{http_port}};
   {% endfor %}
 }
 server { 
   listen {{http_port}}; 
   server_name {{server_name}} 
   location / {  
     proxy_pass http://web.com;  
     include proxy_params; 
   }
 }

在装备文件中就能够运用playbook中界说的变量,咱们在装备MySQL主从复制集群的时分,对于my.cnf文件,master主机和slave主机的装备是不同的,这样就能够依据主机名,运用Jinja中的if语法进行条件烘托

[mysqld]
{% if ansible_fqdn == "mysql_master" %} 
	log-bin=mysql-bin 
  server-id=1
{% else %} 
  server-id=2
{% endif %}

这样就完结了装备区别,履行同样的template复制指令,在不同的机器上是不同的装备文件。PS:

ansible_fqdn: 这个是gather_facts使命获取的变量,咱们也能够运用其他变量进行判别mysql_master: 这个是需求装备主从复制的master主机hostname,需求提前设置,也是能够用ansible设置的

Ansible Roles

最终咱们要讲一下ansible中最重要的一个概念-roles,假设前面的你都搞清楚了,那么roles是十分简略的。总的来说roles便是把咱们前面讲过的东西进行了一个排版,它规则了严格的目录格局,咱们有必要依照目录结构和文件名进行创立,不然它的文件体系就加载不到。目录格局如下:

ansible超详细讲解,值得收藏

  • mysql.yml:playbook文件
  • mysql:roles目录,也是人物名
  • files:寄存文件、压缩包、装置包等
  • handlers:触发使命放在这儿
  • tasks:具体使命
  • templates:寄存经过template烘托的模板文件
  • vars:界说变量
  • meta:使命依赖联系

那些main.yml也是有必要的,姓名有必要是这样,目录名称也有必要相同,可是不是每个目录都是有必要的,下面咱们把httpd的那个比方用roles写一下:

- hosts: web
  tasks:   
    - name: install httpd server    
      yum: name=httpd state=present    
      tags: install      
    - name: configure httpd server    
      template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf    
      notify: # 条用名称为Restart Httpd Server的handlers,能够写多个     
        - Restart Httpd Server    
      tags: configure      
    - name: service httpd server    
      service: name=httpd state=started enabled=yes    
      tags: start     
  handlers:   
    - name: Restart Httpd Server    
    service: name=httpd state=restarted

就把上面这一段改成roles的格局,目录结构如下:

ansible超详细讲解,值得收藏

# httpd/handlers/main.yml
- name: Restart Httpd Server  
  service: name=httpd state=restarted
# httpd/tasks/config.xml
- name: configure httpd server  
  template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf  
  notify: # 条用名称为Restart Httpd Server的handlers,能够写多个   
    - Restart Httpd Server  
  tags: configure
# httpd/tasks/install.yml
- name: install httpd server 
  yum: name=httpd state=present  
  tags: install
# httpd/tasks/start.yml
- name: service httpd server  
  service: name=httpd state=started enabled=yes  
  tags: start
# httpd/tasks/main.yml
- include_tasks: install.yml
- include_tasks: config.yml
- include_tasks: start.yml
# httpd1.yml
- hosts: web  
  roles:   
    - role: nginx  
    # - nginx 与上面是等价的,可是上面的能够增加tags

最终再与httpd1.yml同级目录下履行ansible-playbook httpd1.yml即可(我这儿实践是httpd2.yml,不要在意这些细节)

ansible超详细讲解,值得收藏

Galaxy

最终咱们再介绍一个官方网站:galaxy.ansible.com

这是一个相似GitHub和docker相同的网站,我的网太烂了,打不开,它上面是他人写好的roles,比方你想要装置Nginx,那么在上面搜索nginx,然后会供给一个下载指令:ansible-galaxy install geerlingguy.nginx,履行今后,会把它下载到/root/.ansible/roles这个目录下。

到这儿,ansible的解说咱们就写完了,ansible是用python开发的,所以咱们常常会把它和python结合起来运用,后边咱们会把python操作ansible写一下。