末学者笔记--ansible 批量化自动部署工具

ansible

.概念

1.模块:

yaml      #用来编写yaml脚本的语言

paramiko  #模拟ssh协议连接linux客户端

jinja2   #模板语言

 

2. 作用及原理

作用:

首先ansible是一个批量的自动化部署工具

工作原理:

ansible通过hosts文件和免秘钥(配置文件用户名密码端口号)来实现批量管理主机

 

3.组成:

 

 

 

AnsibleAnsible的核心程序

Host Lnventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载

PlaybooksYAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core ModulesAnsible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Connection Plugins:连接插件,AnsibleHost通信使用

 

幂等性】:一种操作重复多次结果相同

 

二.基本操作:

1.下载

——yum install epel-release (拓展源,可能需要这个才可安装)

——yum install ansible -y

——ansible --version   #查看版本信息

——rpm -qc ansible   #查看配置文件

    /etc/ansible/ansible.cfg

    /etc/ansible/hosts

 

2.ansible配置客户端(无密码登录)

第一种方法:

1)server: ssh-keygen

2)scp id_rsa.pub root@192.168.5.23:/root/.ssh/authorized_keys

 

第二种方法(推荐使用)

——vim /etc/ansible/hosts

#在末行添加#

testhosts

192.168.5.23 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123

192.168.5.25 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123

 

分别表示用户,端口,密码。

 

3.hoc命令:

ansible-doc -l #查看支持的模块

ansible-doc -s MODEL_NAME #查看模块用法

 

ansible <host-pattern> [options]

可用选项

-f forks:启动并发线程数(默认为5

-m model_name:要使用的模块

-a args:特有的参数

-s:以sudo的方式运行操作

-i:指定被管理节点的主机列表

 

note】:线程是最小的调度单位,进程是最小的管理单元,一个进程里面至少1个线程,一个线程或者多个线程可以在一个进程里面

 

4.关闭命令警告

——vim /etc/ansible/ansible.cfg

#。。。。。#

host_key_checks = False   #关闭主机密钥检查的警告

command_warnings = False   #这个是调用“command”接一个参数为ansible已有的模块指令时会出现一个警告

(如:ansible testhosts -m command -a “yum install tree”  会出现警告)

deprecation_warnings = False   #这个是在“playbooks”中调用command模块(模块调用的参数为ansible模块[同上一个警告])时出现警告

 

5.常用命令:

——ansible testhosts#定义的主机组或者指定一个ip,因为我只有一个组,所以可以用all代替 -m#调用模块) setup #查看客户端信息

【copy】:

——ansible testhosts -m copy -a#调用参数) 'src#源文件路径=/root/git_test/code.txt dest#目标路径=/root/test/'   #copy文件到cient端

查看是否已经真的传送过去了:——# ansible all -m shell -a "ls /root/test | grep code.txt"

 

user】:

——ansible testhosts -m user -a "name=test state=present" #创建test用户

——ansible testhosts -m user -a "name=test state=absent" #删除test用户

 

【yum】:

——ansible testhosts -m yum -a name=tree state=latestor pesent #yum安装

 

service】:

——ansible testhosts -m service -a ‘name=httpd state=stopped enabled=no‘ #停止httpd服务并且关闭开机自启

 

【script】:

——ansible testhosts -m script -a ‘/tmp/test.sh‘ #运行脚本

 

【command】:

——ansible testhosts -m command -a 'date' #调用命令“command”参数日期查询

 

【shell】:

——ansible testhosts -m shell -a head /etc/passwd | grep root   #调用shell模块,后接一个可支持正则的命令,与command很像,但shell支持正则

 

cron模块:管理定时任务

 

例:在远程节点每隔5分钟往、/tmp/ken.txt输入111

 

——# ansible all -m cron -a "minute=*/5  job='echo 111>/tmp/ken.txt'  state=present"

192.168.5.23 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "None",

        "None"

    ]

}

192.168.5.25 | SUCCESS => {

    "changed": true,

    "envs": [],

    "jobs": [

        "None",

        "None"

    ]

}

查看是否设置成功——# ansible all  -a "crontab -l"

可删除任务:# ansible all  -a "crontab -r"

 

.playbooks:

 

1. 选项:

  • tasks   #任务
  • variables   #变量
  • templates   #模板
  • handlers   #触发器
  • roles   #角色

 

2.yaml介绍

 

yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xmlc语言,pythonperl以及电子邮件格式RFC2822等,ClarkEvans2001年在首次发表了这种语言。

 

【优点】:

  yaml的可读性好

  yaml和脚本语言的交互性好

  yaml使用实现语言的数据类型

  yaml有一个一致的信息模型

  yaml易于实现

  yaml可以基于流程来处理

  yaml表达能力强,扩展性好

 

3.注意:

1)缩进

  yaml 的缩进要求比较严格一定不能使用tab

 

      注意:编写yaml文件,就忘掉shelltab吧。

 

2冒号“:”

  每个冒号后面一定要有一个空格

 

  注意:a 以冒号结尾不需要空格

     b表示文件路径的模版可以不需要空格

 

3短横线  -

      想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

 

总之

  1严格控制空格编写剧本的时候

  2剧本编写不支持tab

 

4.剧本常用命令:

  1 .对剧本语法检测:

  ansible-playbook --syntax-check  /root/ansible/httpd.yaml

 

 

 

  (2.-C模拟执行剧本:

  ansible-playbook  -C /root/ansible/httpd.yaml

 

 

 

  (3.执行剧本:

  ansible-playbook   /root/ansible/httpd.yaml

 

5.编写playbooks:

 

  ——vim test.yaml文件名后缀最好是.yaml  or  .yml,可以不是

1)(格式严格对照)

- hosts: testhosts   #处理主机组,可以是all所有服务器,-(空格)hosts:(空格)all

  remote_user: root   #使用命令的身份,(空格)(空格)remote_user:(空格)root

  vars:   #定义变量,(空格)(空格)vars

  - p: httpd.conf   #指定变量,(空格)(空格)-(空格)“变量名”:(空格)变量

  tasks:   #剧本所要干的事情;  (空格)(空格)task:

  - name: yum many packages   #使用任务名字,随意写最好能见名知意。(空格)(空格)-(空格)name(空格)自定义任务名字

    yum: name={{ item }} state=present   #调用任务模块。与上行“name”并齐,即4(空格)yum(空格)name=软件名或“{{item}}”表迭代安装多个软件

    with_items:    #迭代,与上一级对齐

    - tree   #软件,对齐上级

    - vsftpd

  - name: copy httpd.conf

    template: src#=/etc/httpd/conf/{{ p }}#调用变量)  dest#目标)=/etc/httpd/conf/{{ p }}   #开头与上一级“name”对齐

    notify:   #触发器命令,对齐上级

    - service httpd restart   触发的任务名称,一定与触发器内的名称一样,对齐上级

  handlers:   #触发器,一定要写在末尾。(空格)(空格)handlers

  - name: service httpd restart   #内部任务名称,对齐上级

   service: name=httpd state=restarted

 

【补】:其中,使用template模板时,可加入变量到源文件,如在httpd.conf中修改端口Listen  {{ port }},再修改/etc/ansible/hosts 文件,在每个服务主机后指定端口port=500 600”,实现不同主机分配不同的端口

示例1:基础

 

 

 

示例2:变量

 

 

 

示例3:迭代

 

 

 

示例4:触发器notify

 

 

示例5:模板templates

 

 

 

四.roles介绍

1.什么情况下用到roles

假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook

第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4play,上面写上安装httpdphp。这样playbook中的代码就重复了。

 

2. 操作:

1)创建roles角色目录

——mkdir -pv playbooks/roles/{dbservers,webservers}/{files,handlers,tasks,templates,vars}

 

 

2)编辑roles

——cd playbooks

——vim site.yml   #地址剧本或者记为地址脚本,固定名称,不可改变

#site.yml

- hosts: webservers

  remote_user: root

  roles:

  - webservers

  - dbservers


3实现copy模块与触发器


第一步:#将文件拷贝到files目录下
cp /etc/httpd/conf/httpd.conf  /root/playbooks/roles/webservers/files/httpd.conf.bak

 

第二步:#tasks/下建立main.yml(固定文件名)文件并在里面写入

- name: copy httpd.conf

  copy: src=httpd.conf.bak(#这里不用写绝对路径了) dest=/etc/httpd/conf/httpd.conf

  notify:

  - restart httpd

 

第三步:#handlers/建立main.yml文件并写入

- name: restart httpd

  service: name=httpd state=restarted

 

(4)模板temlate及一般指令和迭代

 

第一步:#将模板文件拷入到templates目录下并写入变量

——cp /etc/httpd/conf/httpd.conf  /root/playbooks/roles/webservers/templates/httpd.conf.bak

——vim /root/playbooks/roles/webservers/templates/httpd.conf.bak

#........#

Listen  {{ port }}   #修改为变量

......

 

第二步#修改主机组,在每个服务器后加不同的变量值,实现不同主机分配不同的端口

——vim /etc/ansible/hosts

#........#

192.168.5.23 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123 port=500

192.168.5.25 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123 port=600

 

第三步#修改tasks/main.yml:

 

- name: yum install tree

  yum: name=tree state=latest

- name: create manay user

  user: name={{ item }} state=absent

  with_items:

  - user1

  - user2

  - user3

- name: copy httpd.conf

  template: src=httpd.conf.bak dest=/etc/httpd/conf/httpd.conf

  notify:

  - restart httpd

 

3. 运行:

——ansible-playbook /root/playbooks/site.yml

 

 

#------------------------------------------------------------------------------------------------分割线-------------------------------------------------------------

posted @ 2019-05-10 19:20  *云深不知处*  阅读(473)  评论(0编辑  收藏  举报