ansible-02
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible-02相关的知识,希望对你有一定的参考价值。
回顾:运维工具,ansible
运维工具:
OS Provision(系统操作统一化):
实体机管理:pxe, cobbler虚拟机管理:
Configuration配置管理工具: puppet(最流行), saltstack, chef, cfengine, ...
Command and Control命令批量操作工具:fabric, func
Deployment(程序发布或部署):基于灰度模型,摘除相关主机,上线服务
不能直接把服务器直接down掉,因为当前主机的服务还有其他主机进行连接
ansible: agentless工具,基于ssh
不需要在远程主机上安装ansible客户端,但是需要进行ssh连接,需要相应的帐号与密码
也可以使用sudo连接,但是对于权限的指派一定要到位,否则会产生各种问题
ansible命令的用法:
ansible:命令直接执行ansible-playbook:提前定义好流程,使用剧本
常用模块:command, shell, cron, copy, file, ping, yum, service, user, setup, hostname, group, script
playbook基本组件:
hosts:应用的远程主机
remote_user:登录用户名
tasks:任务列表
handlers:触发执行
variables:变量
templates:模版
roles:角色
ansible的使用-02
1.常用模块
1.1 group模块
添加或删除组
name=
state=:present(添加),absent(删除)
system=:1或true为添加系统组
gid=
ansible all -m group -a "name=test state=present system=1 gid=600"
ansible all -m group -a "name=test2 state=present gid=1010"
1.2 script模块:
运行本地的脚本在远程主机上。依赖于某个文件才能运行,需要指定某个脚本文件的路径(本地的脚本文件),它会自动复制到远程主机上运行
-a "/PATH/TO/SCRIPT_FILE"
类似于command或shell。这个路径是本机文件路径。
1.3 template模块:
基于模板方式生成一个文件复制到远程主机
src=:源地址
dest=:目标地址
owner=:属主
group=:属组
mode=:权限0644
2. playbook的其它组件
2.1 变量:
变量的定义:
ansible facts:系统变量可以直接调用ansible-playbook -e "var=value":自己定义变量,传递变量host variable: host iventory:定义主机变量,在hosts文件中添加group variable:组变量定义方式。定义的变量对于组内所有主机生效[groupname:vars]var=valueroles
变量调用:{{ variable }}
在playbook中定义变量的方法:
vars:
- var1: value1
- var2: value2
2.2 模板:templates
模板文件是一种文本文件,嵌套有脚本(使用模板编程语言编写)
python中的嵌入式编程语言是Jinja2
jinjia2的语法:
字面量:
字符串:使用单引号或双引号;数字:整数,浮点数;列表:[item1, item2, ...],值可变数据类型元组:(item1, item2, ...),值不可变字典:{key1:value1, key2:value2, ...}布尔型:true/false
算术运算:+, -, *(乘), /(除), //(整除), %(取余), **(次方)比较操作:==(等值比较), !=(不等值比较), >, >=, <, <=逻辑运算:and, or, not
示例:
在nginx配置文件中修改配置文件nginx.conf.j2:
worker_processes {{ ansible_processor_vcpus }};
#或者worker_processes {{ ansible_processor_vcpus-1 }}; #使用减法运算
lsiten {{ http_port }}; #设置监听端口,也可以使用我们自定义的变量(在hosts文件中对每一个分别设置)
在/etc/ansible下添加playbook文件如下:
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: install conf file
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: instconf
- name: start nginx service
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
ansible-playbook nginx.conf.yaml
模板配置文件 :nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
listen {{ http_port }};
2.3 条件测试
判断系统版本,系统类型,根据这些不同做出不同的应对
ansible all -m setup | grep ansible_os_family #查看系统家族,CentOS显示RedHat
条件测试:
when语句:在task中使用,jinja2的语法格式
tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version == "7" #如果是CentOS7的时候
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6" #如果是CentOS6时
scp [email protected].18.100.69:/etc/nginx/nginx.conf files/nginx.conf.c6.j2 #把远程主机(CentOS6)上的文件拉取到本地
2.4 循环
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为”item“
而后,要在task中使用with_items给定要迭代的元素列表;
列表方法:
1.字符串
2.字典:每一个元素是一个字典
列表方法1:字符串
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
- hosts: all
remote_user: root
tasks:
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm
ansible-playbook item.yaml #如果没有定义好yum源,出现问题就会终止
列表方法2:字典
- hosts: all
remote_user: root
tasks:
- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- group13
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: ‘user11‘, group: ‘group11‘ } #键值与键值之间用“:”隔开
- { name: ‘user12‘, group: ‘group12‘ }
- { name: ‘user13‘, group: ‘group13‘ }
ansible-playbook useradd.yaml
2.5 角色(roles):
如何实现yaml定义的模块重用?
服务器角色并不单一
如果能够把配置的每个配置段独立化,模块化
角色调用,直接调用服务器主机的公共模块,谁用谁调,直接方便
好处:跟远程主机分离,调用方便
角色集合:其实就是一个目录,角色名就是目录名
roles/
httpd/
nginx/
memcached/
角色的格式:
每个角色,以特定的层级目录结构进行组织:
mysql/
files/ :存放由copy(复制的文件)或script(脚本文件)模块等调用的文件;
templates/:template模块查找所需要模板文件的目录;
tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;(基本组件,必须有)
handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
default/:设定默认变量时使用此目录中的main.yml文件;
mkdir -pv roles/{httpd,nginx,mysql}/{files,templates,tasks,handlers,vars,meta,default}
在playbook调用角色方法1:
一个主机上可以调用多个角色
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx
在playbook调用角色方法2:传递变量给角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx }
键role用于指定角色名称;后续的k/v用于传递变量给角色;
例:
mkdir /etc/ansible/roles/nginx
cp /root/working/files/nginx.conf.j2 templates/ #复制准备好的配置文件/templates文件夹中
#在roles/nginx/tasks/main.yaml中配置
- name: install nginx packages
yum: name=nginx state=present
- name: install conf file
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: start nginx
service: name=nginx state=started enabled=true
#创建执行文件nginx.yaml
- hosts: all
remote_user: root
roles:
- nginx
ansible-playbook --check nginx.yaml
ansible-playbook nginx.yaml
定义一个触发器:
#创建roles/nginx/handlers/main.yaml
- name: restart nginx
service: name=nginx state=restarted
#在tasks/main.yaml中重新定义
- name: install nginx packagesyum: name=nginx state=presenttags:install- name: install conf filetemplate: src=nginx.conf.j2 dest=/etc/nginx/nginx.confnotify: restart nginx #定义通知机制,当模版发生改变时就通知handlers模块,重启服务tags:conf- name: start nginxservice: name=nginx state=started enabled=truetags:nginxst
ansible-playbook -t install,conf nginx.yaml
使用变量:
1.直接定义
#编辑user.yaml
- hosts: all
romote_user: root
vars:
- username: testuser1
- groupname: testgroup1
tasks:
- name: creat group
group: name={{ groupname }} state=present
- name: creat user
user: name={{ username }} state=present
从命令行传递参数,直接把下面定义的变量覆盖掉,例:
ansible-playbook -e "groupname=mygrp1" -e "username=myuser1" myuser.yaml
2.在角色中定义变量
#在要传给远程主机的nginx配置文件中修改
user {{ username }};
#在roles/nginx/vars/main.yaml
- username: daemon #一定要确保定义的用户在远程主机上存在(前面不需要再添加横线“-”)
ansible-playbook --check nginx.yaml
ansible-playbook nginx.yaml
ansibel-playbook -e "username=adm" --check nginx.yaml
ansibel-playbook -t conf -e "username=adm" nginx.yaml #直接修改
3.在playbook调用角色方法:传递变量给角色
- hosts: all
remote_user: root
roles:
- { role: nginx, username: nginx }
ansible-playbook运行过后可以看到,运行nginx的用户为nginx
注意:1.键role用于指定角色名称;后续的k/v用于传递变量给角色;
2.还可以基于条件测试实现角色调用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == ‘7‘ " }
只有当系统主版本号为“7”的时候,才会运行nginx角色
这里可以定义n个角色
- hosts: all
remote_user: root
roles:
- { role: nginx, username: nginx, when: "ansible_distribution_major_version == ‘7‘ " }
例:
mkdir -pv /etc/ansible/roles/memcached/tasks
vim tasks/main.yaml
#下面是main.yaml的内容
- name: install package
yum: name=memcached state=present
- name: start memcached
service: name=memcached state=started enabled=true
vim mem.yaml
#下面是mem.yaml的内容
- hosts: all
remote_user: root
roles:
- { role: nginx, when: ansible_distribution_major_version == ‘7‘ }
- { role: memcached, when: ansible_hostname == ‘memcached‘ }
- ansible-playbook mem.yaml
例:如何设置memcached所使用的空间是系统闲置空间的1/4?
把/etc/sysconfig/memcached中的“CACHESIZE="64" ”改为1/4
mkdir roles/memcached/templates
scp [email protected].18.100.69:/etcsysconfig/memcached ./roles/memcached/templates #从远程主机上下载配置文件
ansible all -m setup
vim ./roles/memcached/templates/memcached
#将CACHESIZE="64"改为
CACHESIZE="{{ ansible_memtotal_mb //4 }}"
mv ./roles/memcached/templates/memcached{,.j2} #改后缀名j2
vim ./roles/memcached/tasks/main.yaml
#以下是main.yaml中的内容
- name: install package
yum: name=memcached state=present
- name: install conf file
templates: src=/etc/ansible/roles/templates/memcached.j2 dest=/etc/sysconfig/memcached
notify: restart memcached
tags: memconf
- name: start memcached
service: name=memcached state=started enabled=true
mkdir memcached/handlers
vim ./handlers/main.yaml
#main.yaml
- name: restart memcached
service: name=memcached state=restarted
ansible-playbook /etc/ansible/roles/mem.yaml
- 或者ansible-playbook -t memconf /etc/ansible/roles/mem.yaml
实战项目:
使用ansible一键搞定:
主/备模式高可用keepalived+nginx(proxy)
两台主机:httpd+php
一台主机:mysql-server或mariadb-server;
建议sudo的时候把sudo用户加到管理员组里面,给与与root用户相同的权限
http://www.ansible.com.cn
以上是关于ansible-02的主要内容,如果未能解决你的问题,请参考以下文章