天天看点

Ansible 的角色定义及调用

ansible 角色定义及调用

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

概述:

本章是上篇ansible的后续,将主要介绍ansible中角色的定义和调用,内容如下:

  • handlers:由特定条件触发的Tasks;
  • tags:给指定的任务定义一个调用标识;
  • Variables的类型、定义及调用方法;
  • Templates模板的介绍及使用;
  • 条件测试when语句的使用;
  • 循环:迭代,需要重复执行的任务;

     ·基于字符串列表给出元素

     ·基于字典列表给元素

  • 角色目录的定义方法
  • 在playbook中调用角色的方法;
  • 示例:

          定义nginx角色并调用;

          定义memcached角色并调用;

          定义mysql角色并调用; 

★调用及定义方式
Ansible 的角色定义及调用
注意:
  • 在实际生产中,有些服务不能重启(如:nginx),但是ansible又不支持reload,这时就要调用shell模块执行reload操作
  • 如果跨版本的话要加条件判断,或者二者兼容的命令(如6和7都支持service命令)
Ansible 的角色定义及调用

演示:

  1.定义一个playbook使其监听在8080端口,操作如下:

# 复制控制端主机的httpd服务的配置文件,修改其监听端口为8080,作为远程主机httpd服务的配置文件
[root@centos7 ~]# cp /etc/httpd/conf/httpd.conf ./
[root@centos7 ~]# vim httpd.conf
Listen 8080

# 定义playbook
[root@centos7 ~]# vim web.yaml
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install httpd packpage  # 首先安装httpd程序包
    yum: name=httpd 
  - name: install conf file       # 然后把本机httpd的配置文件复制给远程主机
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd service     # 启动服务
    service: name=httpd state=started      

  2.检测语法,测试运行,发现因为远程主机上的httpd服务已经安装并正在运行,所以,只是配置文件可以被修改,其他两项任务并没有被触发,还是监听在80端口,如下:

# 语法检查
[root@centos7 ~]# ansible-playbook --syntax-check web.yaml

playbook: web.yaml
[root@centos7 ~]# ansible-playbook -C web.yaml

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install httpd packpage] **************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install conf file] *******************************************************
changed: [10.1.252.156]   # 只有安装配置文件项的任务可以被执行改变
changed: [10.1.252.161]

TASK [start httpd service] *****************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=4    changed=1    unreachable=0    failed=0   
10.1.252.161               : ok=4    changed=1    unreachable=0    failed=0      

  3.现在我们要定义触发器,去监控配置文件,一旦配置文件发生了修改,就要触发执行handlers定义的任务,如下:

Ansible 的角色定义及调用

 4.现在,再去执行此任务,可以发现,当配置文件发生修改后,会通知触发器,然后执行触发器的任务,如下:

[root@centos7 ~]# ansible-playbook --syntax-check web.yaml

playbook: web.yaml
[root@centos7 ~]# ansible-playbook -C web.yaml

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install httpd packpage] **************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install conf file] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

TASK [start httpd service] *****************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

RUNNING HANDLER [restart httpd service] ****************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=5    changed=2    unreachable=0    failed=0   
10.1.252.161               : ok=5    changed=2    unreachable=0    failed=0      

 5.如果我们再执行一次playbook,因为配置文件没有被触发,所以并没有引起触发器执行任务。

[root@centos7 ~]# ansible-playbook -C web.yaml

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install httpd packpage] **************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install conf file] *******************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [start httpd service] *****************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=4    changed=0    unreachable=0    failed=0   
10.1.252.161               : ok=4    changed=0    unreachable=0    failed=0      

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

☉定义方法

Ansible 的角色定义及调用
  • 多个任务可以使用同一个标签;
  • 也可以在一次ansible-playbook执行时调用多个标签(用逗号分隔)

   上面的演示中,我们只是修改了配置文件,只想运行修改配置文件的任务,但是其他的两项任务因为没有发生改变,所有白白的执行了一次,针对这种情况,我们就可以,给指定的任务定义一个标识,然后只执行次标识就可以,如下:

Ansible 的角色定义及调用
[root@centos7 ~]# ansible-playbook -C -t instconf --list-tags web.yaml

playbook: web.yaml

  play #1 (websrvs): websrvs	TAGS: []
      TASK TAGS: [instconf]   # 定义的标签

# 这里再次修改一下配置文件中的端口,测试运行可以发现,我们指定运行的标签后,只运行了配置文件
# 的任务和触发的handler任务,其余的2个任务,没有被执行
[root@centos7 ~]# ansible-playbook -C -t instconf web.yaml

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install conf file] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

RUNNING HANDLER [reload httpd service] *****************************************
skipping: [10.1.252.156]
skipping: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=2    changed=1    unreachable=0    failed=0   
10.1.252.161               : ok=2    changed=1    unreachable=0    failed=0      

Variables:变量

★类型:

☉内建:

  • facts 可直接调用
☉自定义:
Ansible 的角色定义及调用
★变量调用: 
  • ` var_name `   

 定义一个playbook可以任意安装程序包,

方法一:

  1)命令行传递;如下:

Ansible 的角色定义及调用

  2)然后在执行ansible-playbook是直接传递给定义的变量要安装的程序包即可,如下:

Ansible 的角色定义及调用

方法二:

 1)在playbook中定义变量值;

Ansible 的角色定义及调用

 2)执行命令,此时就不用在命令行传递变量了,因为在vars中已经定义好了;

Ansible 的角色定义及调用

   如果此时在命令行给定了变量值,以命令行给定的为准,也就是说,命令行中传递的变量值的优先级要比vars中给定的高。

方法三:

在hosts Inventory中为每个主机定义专用变量值;

向不同的主机传递不同的变量 

  1)定义变量调用:

Ansible 的角色定义及调用

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

Ansible 的角色定义及调用

 3)执行后可以发现两个主机各自安装各自定义的变量程序包,从而实现向不同的主机传递不同的变量

[root@centos7 ~]# ansible-playbook -C pkg.yaml

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install a package] *******************************************************
ok: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=2    changed=0    unreachable=0    failed=0   
10.1.252.161               : ok=2    changed=1    unreachable=0    failed=0      

在不同的主机传递相同的变量,除了在playbook中定义vars之外,还可以在hosts Inventory中定义组,向组内的所有主机传递相同的变量 ;

  1)变量调用的定义同上,在/etc/ansible/hosts中自定义的变量组如下:

Ansible 的角色定义及调用

  2)执行后发现两台主机都安装相同的程序包,如下:

[root@centos7 ~]# ansible-playbook -C pkg.yaml

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install a package] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=2    changed=1    unreachable=0    failed=0   
10.1.252.161               : ok=2    changed=1    unreachable=0    failed=0      

Templates:模板

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

★作用:
  • 为某一个服务提供配置文件时,配置文件对于不同的主机,需要提供的配置也不尽相同,具体到底是什么,要依赖于此主机上的属性才能生成,这时,使用模板是最为有效的;

★jinjia2语法:

☉字面量:

  • 字符串:使用单引号或双引号; 
  • 数字:整数、浮点数;
  • 列表:[item1, item2, ...]
  • 元组:(item1, item2, ...)
  • 字典:{key1:value1, key2:value2, ...}
  • 布尔型:true/false
☉算术运算:
  • +, -, *, /, //, %, **
☉比较操作:
  • ==, !=, >, <, >=, <=
☉逻辑运算:
  • and, or, not 
★执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
Ansible 的角色定义及调用

  1.定义nginx的一个playbook,使其能够基于模板复制配置文件

  1)首先复制nginx的配置文件修改其worker_process为一个变量值,然后复制配置文件到远程主机

[root@centos7 ~]# cp /etc/nginx/nginx.conf ./nignx.conf.j2

# 修改其变量值如下:
[root@centos7 ~]# vim nginx.conf 
 worker_processes {{ ansible_processor_vcpus }};      

------------------------------------------------------------------------------  

   此时如果我们使用copy模块直接复制到远程主机的话,发现其配置文件还是变量的字符串,并没有被解析成cpu的核心数。这是因为,是把文件直接当做文本流copy过去的;要想使变量能够被解析,就要使用template模块,它能够理解模板文件中的脚本,并生成结果数据流。

------------------------------------------------------------------------------

  2)因为template不能在命令行使用,只能用于playbook,所以这里我们定义一个playbook 为test.yaml

Ansible 的角色定义及调用

执行定义的playbook,并在远程主机查看,可以发现nginx.conf文件的worker_processes分别为各自的cpu核心数

[root@centos7 ~]# ansible-playbook test.yaml 

PLAY [websrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [generate conf file] ******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=2    changed=1    unreachable=0    failed=0   
10.1.252.161               : ok=2    changed=1    unreachable=0    failed=0      
[root@centos7 ~]# !999
ansible websrvs -m setup |grep vcpus
        "ansible_processor_vcpus": 2, 
        "ansible_processor_vcpus": 1,      

 2.现在我们在控制端主机定义一个完整的nginx playbook的模板,包括:安装程序包,复制配置文件,启动服务,定义tags,并完成通知触发器完成服务重载,如下:

 1)首先在/etc/ansible的配置文件中定义组清单

[root@centos7 ~]# vim /etc/ansible/hosts
[ngxsrvs]
 10.1.252.156
 10.1.252.161      

 2)复制nginx的配置文件修改其worker_process为一个变量值

[root@centos7 ~]# cp /etc/nginx/nginx.conf ./nignx.conf.j2
[root@centos7 ~]# vim nginx.conf.j2 
 worker_processes {{ ansible_processor_vcpus }};      

 3)定义nginx的playbook,如下:

[root@centos7 ~]# vim nginx.yaml
- 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      

  4)检测playbook语法,测试运行,成功完成如下:

[root@centos7 ~]# ansible-playbook --syntax-check nginx.yaml 

playbook: nginx.yaml
[root@centos7 ~]# ansible-playbook -C  nginx.yaml 

PLAY [ngxsrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install nginx package] ***************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install conf file] *******************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

TASK [start nginx service] *****************************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

RUNNING HANDLER [reload nginx service] *****************************************
skipping: [10.1.252.156]
skipping: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=4    changed=2    unreachable=0    failed=0   
10.1.252.161               : ok=4    changed=2    unreachable=0    failed=0      

总结,

ansible配置nginx模板

Ansible 的角色定义及调用

条件测试:

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

  1.我们在启动nginx时,由于系统不同,执行的命令也不同,这时我们就可以使用when语句,直接调用fetch变量,来进行条件判断,如下:

Ansible 的角色定义及调用

 测试运行play-book,如下:

[root@centos7 ~]# ansible-playbook -C nginx2.yaml 

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.205]
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [install nginx package] ***************************************************
ok: [10.1.252.156]
changed: [10.1.252.205]
ok: [10.1.252.161]

TASK [start nginx service On CentOS6] ******************************************
skipping: [10.1.252.161]
skipping: [10.1.252.156]
skipping: [10.1.252.205]

TASK [start nginx service On CentOS7] ******************************************
skipping: [10.1.252.205]
skipping: [10.1.252.156]
skipping: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=2    changed=0    unreachable=0    failed=0   
10.1.252.161               : ok=2    changed=0    unreachable=0    failed=0   
10.1.252.205               : ok=2    changed=1    unreachable=0    failed=0      
★循环:迭代,需要重复执行的任务;
  • 对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;
☉元素:
  • 字符串列表,字典

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

  基于列表的方式,循环迭代安装多个程序包,如下:

Ansible 的角色定义及调用

  测试运行,可以发现明确给出了要安装的程序包

Ansible 的角色定义及调用

 2.基于字典列表给元素示例:

 1)每个远程主机创建三个组,三个用户,使每个用户位于三个不同的组,如下:

Ansible 的角色定义及调用

 执行playbook,成功完成创建,如下:

[root@centos7 ~]# ansible-playbook  users.yaml 

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.205]
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [create groups] ***********************************************************
changed: [10.1.252.205] => (item=groupx1)
changed: [10.1.252.156] => (item=groupx1)
changed: [10.1.252.161] => (item=groupx1)
changed: [10.1.252.205] => (item=groupx2)
changed: [10.1.252.156] => (item=groupx2)
changed: [10.1.252.205] => (item=groupx3)
changed: [10.1.252.161] => (item=groupx2)
changed: [10.1.252.156] => (item=groupx3)
changed: [10.1.252.161] => (item=groupx3)

TASK [create users] ************************************************************
changed: [10.1.252.205] => (item={u'group': u'groupx1', u'name': u'userx1'})
changed: [10.1.252.156] => (item={u'group': u'groupx1', u'name': u'userx1'})
changed: [10.1.252.161] => (item={u'group': u'groupx1', u'name': u'userx1'})
changed: [10.1.252.205] => (item={u'group': u'groupx2', u'name': u'userx2'})
changed: [10.1.252.156] => (item={u'group': u'groupx2', u'name': u'userx2'})
changed: [10.1.252.205] => (item={u'group': u'groupx3', u'name': u'userx3'})
changed: [10.1.252.161] => (item={u'group': u'groupx2', u'name': u'userx2'})
changed: [10.1.252.156] => (item={u'group': u'groupx3', u'name': u'userx3'})
changed: [10.1.252.161] => (item={u'group': u'groupx3', u'name': u'userx3'})

PLAY RECAP *********************************************************************
10.1.252.156               : ok=3    changed=2    unreachable=0    failed=0   
10.1.252.161               : ok=3    changed=2    unreachable=0    failed=0   
10.1.252.205               : ok=3    changed=2    unreachable=0    failed=0      

角色:roles

    ---以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files(依赖的文件)等;

★角色目录的定义:

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中调用角色的方法:
Ansible 的角色定义及调用

演示: 

创建角色,并在playbook中调用角色

   在/etc/ansible/roles(路径不唯一)中定义role_name以及各role_name中的模块文件如下:

[root@centos7 roles]# mkdir ./{nginx,memcached,httpd,mysql}/{files,templates,vars,handlers,meta,default,tasks} -pv
[root@centos7 roles]# ls
httpd  memcached  mysql  nginx
[root@centos7 roles]# tree
.
├── httpd
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── memcached
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── mysql
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
└── nginx
    ├── default
    ├── files
    ├── handlers
    ├── meta
    ├── tasks
    ├── templates
    └── vars      

定义nginx角色,并调用:

   1.现在我们首先定义nginx角色的任务目录,其中会调用到一些其他的模块,它会自动到对应的模块中获取文件内容,如下:

[root@centos7 roles]# vim nginx/tasks/main.yml 
- name: copy nginx package to remote host   # 调用files模块
  copy: src=nginx-1.10.0-1.el7.ngx.x86_64.rpm  dest=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm 
  tags: cppkg
- name: install nginx package
  yum: name=/tmp/nginx-1.10.0-1.el7.ngx.x86_64.rpm  state=present
- name: install conf file nginx.conf          # 调用templates模块
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  tags: ngxconf
  notify: reload nginx service                # 调用handlers模块
- name: install conf file default.conf
  template: src=default.conf.j2 dest=/etc/nginx/conf.d/default.conf
  tags: ngxconf       # 定义tags标识
  notify: reload nginx service
- name: start nginx service
  service: name=nginx state=started enabled=true      

  2.定义在nignx/tasks中要调用模块的目录,如下:

  1)handlers

Ansible 的角色定义及调用

  2)准备templates的模板文件,并修改其进程数为系统变量,监听端口为自定义变量如下:

[root@centos7 roles]# cp /etc/nginx/nginx.conf nginx/templates/nginx.conf.j2
[root@centos7 roles]# vim nginx/templates/nginx.conf.j2
 worker_processes  {{ ansible_processor_vcpus }};

[root@centos7 roles]# cp /etc/nginx/conf.d/default.conf  nginx/templates/default.conf.j2
[root@centos7 roles]# vim nginx/templates/default.conf.j2
     listen       {{ ngxport }};  # 自定义变量      

 3)准备files文件

[root@centos7 roles]# cp /root/nginx/nginx-1.10.0-1.el7.ngx.x86_64.rpm nginx/files/
[root@centos7 roles]# ls nginx/files/
nginx-1.10.0-1.el7.ngx.x86_64.rpm      

 4)因为我们在templates中用到了自定义变量,所以,在/etc/ansible/roles/nginx/vars中定义变量,如下:

 [root@centos7 roles]# vim nginx/vars/main.yml
  1 ngxport: "8088"      

 定义的文件概览

[root@centos7 roles]# pwd
/etc/ansible/roles
[root@centos7 roles]# tree
.
├── httpd
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── memcached
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── mysql
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
└── nginx
    ├── default
    ├── files
    │   └── nginx-1.10.0-1.el7.ngx.x86_64.rpm
    ├── handlers
    │   └── main.yml
    ├── meta
    ├── tasks
    │   └── main.yml
    ├── templates
    │   ├── default.conf.j2
    │   └── nginx.conf.j2
    └── vars
        └── main.yml      

 3.如上,我们要调用的各模块都已经准备好了,现在我们要去调用nginx角色

  1)首先定义play-book,指明远程主机,和要调用的角色

[root@centos7 ansible]# pwd
/etc/ansible
[root@centos7 ansible]# ls
ansible.cfg  ansible.cfg.bak  hosts  hosts.bak  roles
[root@centos7 ansible]# vim roles.yaml
 - hosts: ngxsrvs
  remote_user: root
  roles:    # 这里要写调用的角色roles
  - nginx      

 2)编辑/etc/ansible/ansible.cfg,修改其调用roles的路径

Ansible 的角色定义及调用

 4.检测语法,测试运行

[root@centos7 roles]# ansible-playbook --syntax-check /etc/ansible/nginx.yaml 

playbook: /etc/ansible/nginx.yaml

# 首先把程序包复制过去(因为如果远程主机没有程序包的话,测试执行后面的任务会报错)
[root@centos7 roles]# ansible-playbook -t cppkg  /etc/ansible/nginx.yaml 

PLAY [ngxsrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : copy nginx package to remote host] *******************************
changed: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=2    changed=1    unreachable=0    failed=0   
10.1.252.161               : ok=2    changed=1    unreachable=0    failed=0   

# 测试执行,
[root@centos7 roles]# ansible-playbook -C  /etc/ansible/nginx.yaml 

PLAY [ngxsrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : copy nginx package to remote host] *******************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : install nginx package] *******************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : install conf file nginx.conf] ************************************
changed: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : install conf file default.conf] **********************************
changed: [10.1.252.156]
changed: [10.1.252.161]

TASK [nginx : start nginx service] *********************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

RUNNING HANDLER [nginx : reload nginx service] *********************************
changed: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=7    changed=4    unreachable=0    failed=0   
10.1.252.161               : ok=7    changed=3    unreachable=0    failed=0      

 5.测试运行没有问题,然后真正的运行,在远程主机上查看,可以发现已经监听在8088端口;

[root@centos7 ~]# ss -tnl
State       Recv-Q Send-Q                                      Local Address:Port                                                     Peer Address:Port              
LISTEN      0      128                                                     *:22                                                                  *:*                  
LISTEN      0      128                                             127.0.0.1:631                                                                 *:*                  
LISTEN      0      128                                                     *:8088                                                                *:*                  
LISTEN      0      100                                             127.0.0.1:25                                                                  *:*                  
LISTEN      0      128                                             127.0.0.1:6010                                                                *:*                  
LISTEN      0      128                                                    :::22                                                                 :::*                  
LISTEN      0      128                                                   ::1:631                                                                :::*                  
LISTEN      0      100                                                   ::1:25                                                                 :::*                  
LISTEN      0      128                                                   ::1:6010      

  6.假如我们现在不想监听在8088端口,而是想监听在80端口,这时除了可以修改vars中的变量ngxport外,还可以在playbook中调用角色时,直接向角色传递变量(以字典的方式传递),如下:

Ansible 的角色定义及调用

  因为,这里我只是修改了一下配置文件,所以只需要执行配置文件的标签ngxconf跑下配置文件即可,执行之后可以发现,远程主机监听的端口为80端口,说明直接在调用角色是传递变量要比在vars中定义的变量的优先级要高,如下:

[root@centos7 ansible]# ansible-playbook --check --list-tags nginx.yaml  # 列出标签

playbook: nginx.yaml

  play #1 (ngxsrvs): ngxsrvs	TAGS: []
      TASK TAGS: [cppkg, ngxconf]

[root@centos7 ansible]# ansible-playbook -C -t ngxconf nginx.yaml 

PLAY [ngxsrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : install conf file nginx.conf] ************************************
ok: [10.1.252.156]
ok: [10.1.252.161]

TASK [nginx : install conf file default.conf] **********************************
changed: [10.1.252.156]    # 只运行配置文件default.conf
changed: [10.1.252.161]

RUNNING HANDLER [nginx : reload nginx service] *********************************
changed: [10.1.252.156]    # 因为配置文件发生了改变,notify通知触发脚本
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=4    changed=2    unreachable=0    failed=0   
10.1.252.161               : ok=4    changed=2    unreachable=0    failed=0      

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

   如上,就是整个定义nginx角色并调用的整个过程,如果我们以后要在多台主机上安装运行nginx,只需要把/etc/ansible/roles/nginx目录拷贝过去然后定义主机,运行ansible-playbook就可以了,大大减轻了我们的工作量!

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

 注意:

  • ansible默认一次只可以调用5个主机,如果我们系统主机的性能比较好,可以根据实际情况适当的调大一些,-f forks 也可以定义一批处理几个主机;
Ansible 的角色定义及调用

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

2.定义memcached角色,并调用:

  1.首先定义memcached角色的任务目录,

[root@centos7 ansible]# vim roles/memcached/tasks/main.yml
  
  1 - name: install memcached
  2   yum: name=memcached state=latest
  3 - name: install conf file
  4   template: src=memcached.j2 dest=/etc/sysconfig/memcached
  5   tags: mcconf
  6   notify: reload memcached
  7 - name: start memcached
  8   service: name=memcached state=started      

  2.我们这里要定义memcached的可用缓存空间为系统可用空间的四分之一,所以要调用template模块文件,定义如下:

[root@centos7 ansible]# cp /etc/sysconfig/memcached roles/memcached/templates/memcached.j2
[root@centos7 ansible]# vim roles/memcached/templates/memcached.j2
  1 PORT="11211"
  2 USER="memcached"
  3 MAXCONN="1024"
  4 CACHESIZE="{{ ansible_memtotal_mb // 4 }}"
  5 OPTIONS=""      

 3.定义notify通知的触发器handler模块文件

[root@centos7 ansible]# vim roles/memcached/handlers/main.yml

  1 - name: reload memcached
  2   service: name=memcached state=restarted      

 4.如上,memcached的角色就已经定义好了,现在我们在之前定义好的roles.yaml的剧本中添加上memecached角色,就可以直接调用了,如下:

[root@centos7 ansible]# vim roles.yaml

  1 - hosts: ngxsrvs
  2   remote_user: root
  3   roles:
  4   - { role: nginx, ngxport: 80 }
  5   - { role: memcached,tags: mechd }      

 5.列出tags,检查语法,运行如下:

[root@centos7 ansible]# ansible-playbook --syntax-check roles.yaml  # 检测语法

playbook: roles.yaml

[root@centos7 ansible]# ansible-playbook -C --list-tags roles.yaml  # 列出tags

playbook: roles.yaml

  play #1 (ngxsrvs): ngxsrvs	TAGS: []
      TASK TAGS: [cppkg, mcconf, mechd, ngx, ngxconf]

[root@centos7 ansible]# ansible-playbook -C -t mechd roles.yaml   # 运行如下

PLAY [ngxsrvs] *****************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.161]
ok: [10.1.252.156]

TASK [memcached : install memcached] *******************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

TASK [memcached : install conf file] *******************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

TASK [memcached : start memcached] *********************************************
changed: [10.1.252.156]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.156               : ok=4    changed=0    unreachable=0    failed=0   
10.1.252.161               : ok=4    changed=0    unreachable=0    failed=0      

 6.在远程主机查看端口11211,并查看memcached缓存大小如下:

[root@centos7 ~]# ss -tnl
State       Recv-Q Send-Q                                      Local Address:Port                                                     Peer Address:Port              
LISTEN      0      128                                                     *:11211                                                               *:*                  
LISTEN      0      128                                                     *:80                                                                  *:*                  
LISTEN      0      128                                                     *:22                                                                  *:*                  
LISTEN      0      128                                             127.0.0.1:631                                                                 *:*                  
LISTEN      0      100                                             127.0.0.1:25                                                                  *:*                  
LISTEN      0      128                                             127.0.0.1:6010                                                                *:*                  
LISTEN      0      128                                                    :::11211                                                              :::*                  
LISTEN      0      128                                                    :::22                                                                 :::*                  
LISTEN      0      128                                                   ::1:631                                                                :::*                  
LISTEN      0      100                                                   ::1:25                                                                 :::*                  
LISTEN      0      128                                                   ::1:6010                                                               :::*                  

[root@centos7 ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="244"
OPTIONS=""      

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

3.定义mysql角色,并调用:

  1)定义mysql角色的任务目录,

[root@centos7 ansible]# vim roles/mysql/tasks/main.yml

  1 - name: isntall mysql-server
  2   yum: name=mysql-server state=latest
  3   when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
  4 - name: isntall mariadb-server
  5   yum: name=mariadb-server  state=latest
  6   when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
  7 - name: start mysql service
  8   service: name=mysqld state=started
  9   when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
 10 - name: start mariadb service
 11   service: name=mariadb state=started
 12   when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"      

 2)调用mysql如下:

[root@centos7 ansible]# vim mysql.yaml

  1 - hosts: dbsrvs
  2   remote_user: root
  3   roles:
  4   - mysql      

 3)运行如下:

[root@centos7 ansible]# ansible-playbook  mysql.yaml 

PLAY [dbsrvs] ******************************************************************

TASK [setup] *******************************************************************
ok: [10.1.252.205]
ok: [10.1.252.161]

TASK [mysql : isntall mysql-server] ********************************************
skipping: [10.1.252.161]
changed: [10.1.252.205]

TASK [mysql : isntall mariadb-server] ******************************************
skipping: [10.1.252.205]
ok: [10.1.252.161]

TASK [mysql : start mysql service] *********************************************
skipping: [10.1.252.161]  # when语句,不符合就跳过
changed: [10.1.252.205]

TASK [mysql : start mariadb service] *******************************************
skipping: [10.1.252.205]
changed: [10.1.252.161]

PLAY RECAP *********************************************************************
10.1.252.161               : ok=3    changed=1    unreachable=0    failed=0   
10.1.252.205               : ok=3    changed=2    unreachable=0    failed=0      

总结:

nginx角色的定义

Ansible 的角色定义及调用

memcached角色定义:

Ansible 的角色定义及调用

nginx和memcached的角色调用:

Ansible 的角色定义及调用

mysql角色定义:

Ansible 的角色定义及调用

roles目录中个角色的模块文件概览

[root@centos7 ansible]# tree roles
roles
├── httpd
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── templates
│   └── vars
├── memcached
│   ├── default
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   │   └── memcached.j2
│   └── vars
├── mysql
│   ├── default
│   ├── files
│   ├── handlers
│   ├── meta
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   └── vars
└── nginx
    ├── default
    ├── files
    │   └── nginx-1.10.0-1.el7.ngx.x86_64.rpm
    ├── handlers
    │   └── main.yml
    ├── meta
    ├── tasks
    │   └── main.yml
    ├── templates
    │   ├── default.conf.j2
    │   └── nginx.conf.j2
    └── vars
        └── main.yml

32 directories, 10 files      

 如上就是整个ansible中角色roles的定义和调用。。。

 Ansible上篇文章链接:http://1992tao.blog.51cto.com/11606804/1871264

继续阅读