也可以是一个字典—
#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/
}
默认情况下,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
能够根据层次型结构自动装载变量文件
、tasks以及handlers等
。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器
放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
复杂场景:建议使用roles,代码复用度高(相当于shell中的函数)
变更指定主机或主机组
如命名不规范维护和传承成本大
某些功能需多个Playbook,通过includes即可实现
Roles
角色(roles):角色集合
roles/
mysql/
httpd/
nginx/
memcached/
目录编排:
每个角色,以特定的层级目录结构进行组织
roles目录结构:
playbook.yml
roles/
project/
tasks/
files/
vars/
templates/
handlers/
default/ 不常用
meta/ 不常用
/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的步骤
(1) 创建以roles命名的目录
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
(4) 在playbook文件中,调用各角色
一个简单的例子
实现nginx搭建
- 建目录:
mkdir roles/{nginx,mysql}/{tasks,files,} -pv
- 创建任务文件
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
调用角色方法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
执行
=======================================================================
#创建角色相关的目录
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
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
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
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
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。
面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
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
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-StIRCD81-1712544635201)]
[外链图片转存中…(img-gFRdrs3L-1712544635201)]
[外链图片转存中…(img-54ANLlJN-1712544635202)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。
面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!
[外链图片转存中…(img-tjlmk41g-1712544635202)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!