(四)ansible----playbook模板template,角色roles---编排httpd,nginx,memached,mysql

十一. playbook模板template

介绍

只能在playbook中使用

  1. template文本文件,嵌套有脚本(使用模板编程语言编写)可以嵌套Jinja2语言

  2. jinja2语言
    官方网站:
    http://jinja.pocoo.org/
    https://jinja.palletsprojects.com/en/2.11.x/
    使用字面量,有下面形式

字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]   可以能改
元组:(item1, item2, ...)  不能更改
字典:{key1:value1, key2:value2, ...}

布尔型:true/false
算术运算:+, -, *, /, //, %, **
比较操作:==, !=, >, >=, <, <=
逻辑运算:and,or,not
流表达式:ForIfWhen

template使用

template功能:根据模块文件动态生成对应的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下:

 ./
 ├── temnginx.yml
 └── templates
     └── nginx.conf.j2

template示例
示例:利用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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Playbook中template变更替换
修改文件nginx.conf.j2 下面行为

mkdir templates


vim templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus**2 }};


vim temnginx2.yml
---
- hosts: websrvs
 remote_user: root
  
 tasks:
 - name: install nginx
   yum: name=nginx
 - name: template config to remote hosts
   template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 
 - name: start service
   service: name=nginx state=started enabled=yes
       
ansible-playbook temnginx2.yml

Playbook中template算术运算

示例:

 vim nginx.conf.j2
 worker_processes {{ ansible_processor_vcpus**2 }};
 worker_processes {{ ansible_processor_vcpus+2 }}; 

例如:

vim templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus**3 }};

[root@ansible ansible]#cat templnginx.yml
---
- hosts: websrvs
 remote_user: root
 tasks:
    - name: install nginx
     yum: name=nginx
    - name: template config to remote hosts
     template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
     notify: restart nginx
    - name: start service
      service: name=nginx state=started enabled=yes
 handlers:
    - name: restart nginx
      service: name=nginx state=restarted

ansible-playbook templnginx.yml --limit 10.0.0.8

1. when

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

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

也就是判断当前任务是否满足条件,满足执行
when条件判断

---
- hosts: websrvs
 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"

示例:

---
- 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"

在这里插入图片描述

2. 迭代:with_items

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

注意:with_items是-name下面的内容 是有意格式要对齐

列表格式
字符串
字典
示例:

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

卸载 mariadb

---
- hosts: appsrvs:!10.0.0.8
 remote_user: root
 tasks:
    - name: stop service
     shell: /etc/init.d/mysqld stop
    - name: delete files and dir
     file: path={{ item }} state=absent
     with_items:
        - /usr/local/mysql
        - /usr/local/mariadb-10.2.27-linux-x86_64
        - /etc/init.d/mysqld
        - /etc/profile.d/mysql.sh
        - /etc/my.cnf
        - /data/mysql
    - name: delete user
     user: name=mysql state=absent remove=yes
---
- hosts: testsrv
 remote_user: root

tasks
  - name: Create rsyncd config
    copy: src={{ item }} dest=/etc/{{ item }}
    with_items:
     - rsyncd.secrets
     - rsyncd.conf
- hosts: websrvs
 remote_user: root
 
 tasks:
 - name: copy file
   copy: src={{ item }} dest=/tmp/{{ item }}
   with_items:
    - file1
    - file2
    - file3
 - name: yum install httpd
   yum: name={{ item }} state=present
   with_items:
    - apr
    - apr-util
    - httpd
- hosts:websrvs
 remote_user: root
 tasks
 - name: install some packages
 yum: name={{ item }} state=present
 with_items:
 - nginx
 - memcached
 - php-fpm

迭代嵌套子变量

---
- 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' }
cat with_item2.yml
---
- hosts: websrvs
 remote_user: root
 tasks:
    - name: add some groups
     group: name={{ item }} state=present
     with_items:
        - g1
        - g2
        - g3
    - name: add some users
     user: name={{ item.name }} group={{ item.group }} home={{ item.home }} 
create_home=yes state=present
     with_items:
        - { name: 'user1', group: 'g1', home: '/data/user1' }
        - { name: 'user2', group: 'g2', home: '/data/user2' }
        - { name: 'user3', group: 'g3', home: '/data/user3' }

3. template中的for 和 if 循环

类似于shell
vhost循环体变量,nginx_vhosts数组

#开始for循环
{% for vhost in nginx_vhosts %}   
server {
listen {{ vhost.listen | default('80 default_server') }};

#开始if循环  (判断是否存在)
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }};


# defined 存在,则执行,不存在不执行
#结束if循环 
{% endif %}
{% if vhost.root is defined %}
root {{ vhost.root }};
{% endif %}

#结束for循环
{% endfor %}

列表的内容可以是一个变量
在这里插入图片描述
在这里插入图片描述

也可以是一个字典—
在这里插入图片描述

在这里插入图片描述

#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
  

vim 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   
}
vim temlnginx3.yml
---
- hosts: websrvs
 remote_user: root
 #嵌套
 vars:
   nginx_vhosts:
      - listen: 8080
 tasks:
    - name: config file
     template: src=nginx.conf3.j2 dest=/data/nginx3.conf


vim templates/nginx.conf3.j2
{% for vhost in nginx_vhosts %}   
server {
 listen {{ vhost.listen }}
}
{% endfor %}

#嵌套

ansible-playbook   templnginx3.yml  --limit 10.0.0.8
#生成的结果
server {
 listen 8080  
 }
vimtemplnginx4.yml
---
- hosts: websrvs
 remote_user: root
 vars:
   nginx_vhosts:
     - listen: 8080
       server_name: "web1.magedu.com"
       root: "/var/www/nginx/web1/"
     - listen: 8081
       server_name: "web2.magedu.com"
       root: "/var/www/nginx/web2/"
     - {listen: 8082, server_name: "web3.magedu.com", root: 
"/var/www/nginx/web3/"}
 tasks:
   - name: template config 
     template: src=nginx.conf4.j2 dest=/data/nginx4.conf
      
   
vim templates/nginx.conf4.j2
{% for vhost in nginx_vhosts %}
server {
   listen {{ vhost.listen }}
   server_name {{ vhost.server_name }}
   root {{ vhost.root }}  
}{% endfor %}




ansible-playbook templnginx4.yml --limit 10.0.0.8
#生成结果:
server {
   listen 8080
   server_name web1.magedu.com
   root /var/www/nginx/web1/  
}
server {
   listen 8081
   server_name web2.magedu.com
   root /var/www/nginx/web2/  
}
server {
   listen 8082
   server_name web3.magedu.com
   root /var/www/nginx/web3/  
}

用 if条件判断,决定是否生成相关的配置信息

vim 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
          
     defined 存在,则执行,不存在不执行
          
vim 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/
}

4. 节点过多导致的超时----serial

默认情况下,Ansible将尝试并行管理playbook中所有的机器。对于滚动更新用例,可以使用serial关键字定义Ansible一次应管理多少主机,还可以将serial关键字指定为百分比,表示每次并行执行的主机数占总数的比例

vim test_serial.yml
---
- hosts: all
 serial: 2 #每次只同时处理2个主机
 gather_facts: False
 tasks:
   - name: task one
 comand: hostname
   - name: task two
     command: hostname
- name: test serail
  hosts: all
  serial: "20%"   #每次只同时处理20%的主机

十二. roles角色

roles
能够根据层次型结构自动装载变量文件tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

复杂场景:建议使用roles,代码复用度高(相当于shell中的函数)

变更指定主机或主机组
如命名不规范维护和传承成本大
某些功能需多个Playbook,通过includes即可实现

Roles
角色(roles):角色集合

roles/
	mysql/
	httpd/
	nginx/
	memcached/

目录编排在这里插入图片描述

roles目录结构

每个角色,以特定的层级目录结构进行组织
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文件

创建role

创建role的步骤
(1) 创建以roles命名的目录
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
(4) 在playbook文件中,调用各角色

一个简单的例子
实现nginx搭建
在这里插入图片描述

  1. 建目录:
mkdir roles/{nginx,mysql}/{tasks,files,} -pv
  1. 创建任务文件
cd tasks
touch user.yml install.yml config.yml service.yml

写文件

[root@centos7tasks]#cat user.yml
- name: create user
  user: name=nginx shell=/sbin/nologin system=yes create=no

将配置文件拷到file目录下并且修改端口

[root@centos7tasks]#cat config.yml
- name: config
 	#这里的src可以自动找到roles/file/nginx.conf
 	#所以不必在../file/config.yml文件中指定绝对路径
  copy: src=nginx.conf dest=/etc/nginx/nginx.conf

定义man.yml文件(为了制定tasks目录中文件执行的顺序

[root@centos7tasks]#cat main.yml
- include: user.yml
- include: install.yml
- include: config.yml
- includeL: service.yml

在这里插入图片描述

最后在与roles文件夹统计的目录中创建一个调用nginx角色的yml文件

[root@centos7playbook]#cat nginx_role.yml
- hosts: webservice
  remote_user: root

  roles:
  #在这里也可以指定多个角色
    - role: nginx

最后检查 ansible-playbook -C nginx_role.yml
执行ansible-playbook nginx_role.yml

也可以在nginx目录下建立一个handlers目录存放handlers触发器信息,比如restarted服务
然后在其中建立一个main.yml文件

[root@centos7 handlers]#cat main.yml
- name: restart service 
  service: name=nginx state=restarted

并且tasks目录中的的config.yml
有notify的信息

[root@centos7nginx]#cat  tasks/config.yml 
- name: config
  copy: src=nginx.conf dest=/etc/nginx/nginx.conf
  notify: restart service 

检查,执行
在这里插入图片描述
针对大型项目使用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:
传递变量给角色

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

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

调用角色方法3:还可基于条件测试实现角色调用



 roles:
 - { role: nginx, when: ansible_distribution_major_version ==7}
 - { role: httpd, username: httpd, when: ansible_distribution_major_version ==6}

roles playbook tags使用
roles playbook tags使用

 ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
// nginx-role.yml
---
- hosts: testweb
 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 }

memcached缓存服务
端口11211
在这里插入图片描述

内存大小在这里插入图片描述
cp /etc/sysconfig/memcached templtes/memcached.j2
修改内存大小
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在playbook中 写一个调用角色的memcached_role.yml文件
在这里插入图片描述
最后检查-C
执行

实战案例

1:实现 httpd 角色

#创建角色相关的目录
mkdir -pv /data/ansible/roles/httpd/{tasks,handlers,files}
  
#创建角色相关的文件
cd /data/ansible/roles/httpd/


#main.yml 是task的入口文件
vim tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml


vim tasks/group.yml
- name: create apache group
  group: name=apache system=yes gid=80
  
  
vim tasks/user.yml
- name: create apache user
  user: name=apache system=yes shell=/sbin/nologin  home=/var/www/ uid=80
  group=apache

vim tasks/install.yml
- name: install httpd package
  yum: name=httpd
 
vim tasks/config.yml
- name: config file
  copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
  notify: restart

vim tasks/index.yml
- name: index.html
  copy: src=index.html dest=/var/www/html/


vim tasks/service.yml
- name: start service
  service: name=httpd state=started enabled=yes


vim handlers/main.yml
- name: restart
  service: name=httpd state=restarted
  
#在files目录下准备两个文件
ls files/
httpd.conf index.html

tree /data/ansible/roles/httpd/
/data/ansible/roles/httpd/
├── files
│   ├── httpd.conf
│   └── index.html
├── handlers
│   └── main.yml
└── tasks
   ├── config.yml
   ├── group.yml
   ├── index.yml
   ├── install.yml
   ├── main.yml
   ├── service.yml
   └── user.yml

#在playbook中调用角色
vim /data/ansible/role_httpd.yml
---
- hosts: websrvs
 remote_user: root
 roles:
    - httpd
    
    
#运行playbook
ansible-playbook /data/ansible/role_httpd.yml

2. 实现 nginx 角色

mkdir -pv /data/ansible/roles/nginx/{tasks,handlers,templates,vars}

#创建task文件
cd /data/ansible/roles/nginx/
vim tasks/main.yml 
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml

vim tasks/install.yml 
- name: install
  yum: name=nginx 
 
vim tasks/config.yml 
- name: config file for centos7
  template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
  when: ansible_distribution_major_version=="7"
  notify: restart
- name: config file for centos8
  template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
  when: ansible_distribution_major_version=="8"
  notify: restart
 
vim tasks/index.yml 
- name: index.html
  copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
  
vim tasks/service.yml 
- name: start service
  service: name=nginx state=started enabled=yes


   #创建handler文件
cat handlers/main.yml 
- name: restart
  service: name=nginx state=restarted


#创建两个template文件
cat templates/nginx7.conf.j2
user {{user}};
worker_processes {{ansible_processor_vcpus+3}};   #修改此行
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;


cat templates/nginx8.conf.j2
user nginx;
worker_processes {{ansible_processor_vcpus**3}};  #修改此行
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;


#创建变量文件
vim vars/main.yml 
user: daemon


#目录结构如下
tree /data/ansible/roles/nginx/
/data/ansible/roles/nginx/
├── handlers
│   └── main.yml
├── tasks
│   ├── config.yml
│   ├── file.yml
│   ├── install.yml
│   ├── main.yml
│   └── service.yml
├── templates
│   ├── nginx7.conf.j2
│   └── nginx8.conf.j2
└── vars
   └── main.yml

#在playbook中调用角色
vim /data/ansible/role_nginx.yml 
---
- hosts: websrvs 
  roles:
    - role: nginx
    
  #运行playbook
ansible-playbook /data/ansible/role_nginx.yml

3. 实现 memcached 角色

mkdir -pv /data/ansible/roles/memcached/{tasks,templates}
cd /data/ansible/roles/memcached
vim tasks/main.yml 
- include: install.yml
- include: config.yml
- include: service.yml

vim tasks/install.yml 
- name: install
  yum: name=memcached

vim tasks/config.yml 
- name: config file
  template: src=memcached.j2  dest=/etc/sysconfig/memcached



vim tasks/service.yml 
- name: service
  service: name=memcached state=started enabled=yes
  
vim templates/memcached.j2 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ansible_memtotal_mb//4}}"
OPTIONS=""


tree /data/ansible/roles/memcached/
/data/ansible/roles/memcached/
├── tasks
│   ├── config.yml
│   ├── install.yml
│   ├── main.yml
│   └── service.yml
└── templates
   └── memcached.j2
   
vim /data/ansible/role_memcached.yml 
---
- hosts: appsrvs
  roles:
    - role: memcached
    
ansible-play /data/ansible/role_memcached.yml

4 .实现 mysql 5.6 的角色

cat /data/ansible/roles/mysql/files/my.cnf 
[mysqld]
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
log-bin
pid-file=/data/mysql/mysqld.pid
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log


[root@ansible ~]#cat /data/ansible/roles/mysql/files/secure_mysql.sh 
#!/bin/bash
/usr/local/mysql/bin/mysql_secure_installation <<EOF
y
qcq
qcq
yyyy
EOF

[root@ansible ~]#chmod +x /data/ansible/roles/mysql/files/secure_mysql.sh
[root@ansible ~]#ls /data/ansible/roles/mysql/files/
my.cnf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz secure_mysql.sh

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/main.yml
- include: install.yml
- include: group.yml
- include: user.yml
- include: unarchive.yml
- include: link.yml
- include: data.yml
- include: config.yml
- include: service.yml
- include: path.yml
- include: secure.yml


[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/install.yml 
- name: install packages                                            
 yum: name=libaio,perl-Data-Dumper,perl-Getopt-Long

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/group.yml 
- name: create mysql group
 group: name=mysql gid=306

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/user.yml 
- name: create mysql user
 user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes
create_home=no home=/data/mysql

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/unarchive.yml 
- name: copy tar to remote host and file mode 
 unarchive: src=mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz dest=/usr/local/ 
owner=root group=root

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/link.yml 
- name: mkdir /usr/local/mysql 
 file: src=/usr/local/mysql-5.6.46-linux-glibc2.12-x86_64 dest=/usr/local/mysql 
state=link

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/data.yml 
- name: data dir
  shell: chdir=/usr/local/mysql/ ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/config.yml 
- name: config my.cnf
  copy: src=my.cnf  dest=/etc/my.cnf 

[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/service.yml 
- name: service script
 shell: /bin/cp /usr/local/mysql/support-files/mysql.server 
/etc/init.d/mysqld;chkconfig --add mysqld;chkconfig mysqld on;/etc/init.d/mysqld 
start
  
[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/path.yml 
- name: PATH variable
  copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh  
  
[root@ansible ~]#cat /data/ansible/roles/mysql/tasks/secure.yml 
- name: secure script
 script: secure_mysql.sh
  
[root@ansible ~]#tree /data/ansible/roles/mysql/
/data/ansible/roles/mysql/
├── files
│   ├── my.cnf
│   ├── mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
│   └── secure_mysql.sh
└── tasks
   ├── config.yml
   ├── data.yml
   ├── group.yml
   ├── install.yml
   ├── link.yml
   ├── main.yml
   ├── path.yml
   ├── secure.yml
   ├── service.yml
   ├── unarchive.yml
   └── user.yml

[root@ansible ~]#cat /data/ansible/mysql_roles.yml
- hosts: dbsrvs
 remote_user: root
 roles:
    - {role: mysql,tags: ["mysql","db"]}
    - {role: nginx,tage: ["nginx","web"]}
    
[root@ansible ~]#ansible-playbook -t mysql /data/ansible/mysql_roles.yml

5. 实现多角色的选择

vim /data/ansible/role_httpd_nginx.yml 
---
- hosts: websrvs
 roles:
    - {role: httpd,tags: [httpd,web], when: ansible_distribution_major_version=="7" }
    - {role: nginx,tags: [nginx,web], when: ansible_distribution_major_version=="8" }


ansible-playbook -t nginx /data/ansible/role_httpd_nginx.yml

推荐资料

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值