ansible

一、ansible简介

ansible是一个自动化批量部署工具,底层是用python写的(paramiko,jinjia2(模板语言),yaml)

核心组件:

    Ansible:ansible的核心程序

    Playbooks:yaml格式文件,多个任务定义在一个文件中,使用时可以统一调用,‘剧本’用来调用哪些主机需要调用哪些模块来完成的功能。

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

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

    Custom Modules:支持任意语言,自定义模块,完成Core Modules无法完成的功能。

    Connection Plagins:连接作用,连接插件,Ansible和Host通信使用。

工作原理:

    ansible加载hosts文件,通过免密钥或配置文件参数来批量管理主机。

优点:

  ansible不需要安装客户端或agent(代理)

  支持API和自定义模块

  通过playbooks定制强大的配置,状态管理

   配置简单,功能强大

  提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台

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

ansible配置客户端(两种方法):

  第一种:ssh免密登录

  第二种:vim /etc/ansible/hosts在最低端写入要管理的主机

    如:192.168.42.12 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root

二、ansible常用模块

①ping模块

[root@localhost ~]# ansible testhost -m ping
192.168.42.10 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.42.9 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.42.8 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
测试主机连通性

②command模块

这个模块可以直接在远程主机上执行命令,并将结果返回本主机。

ansible testhost -m command -a 'ls -ltr'

③shell模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。

ansible testhost -m shell -a 'rpm -qa | grep "http"'

④copy模块

这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。(src是源文件,dest是目标文件,可以改名)

ansible testhost -m copy -a 'src=/root/1 dest=/tmp'
#给定内容生成文件,并制定权限
ansible web -m copy -a 'content="I am keer " dest=/data/name mode=666' #connect可以直接指定文件的值(替换src)
#查看上条命令的执行结果
ansible testhost -m shell -a 'ls -l /tmp/'
#覆盖,原文件备份
ansible testhost -m copy -a 'content="I am keerya " backup=yes dest=/tmp/name mode=666'

⑤file模块

该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。

⑥yum模块

name=要安装的包名   state有三种模式(present下载   latest下载最新版本   absent卸载)

ansible testhost -m yum -a 'name=httpd state=present'

⑦service模块

该模块用于服务程序的管理。

name=服务名称  state有started,stopped,restarted,reloaded四种模式,enabled开机自启。

ansible testhost -m service -a 'name=ntpd state=started enabled=true'

⑧user模块

该模块主要是用来管理用户账号。

#创建一个uid为11111的keer用户
ansible testhost -m user -a 'name=keer uid=11111'
#删除用户
ansible testhost -m user -a 'name=keer state=absent'

⑨scrip模块

该模块用于将本机的脚本在被管理端的机器上运行。直接指定脚本的路径即可

在服务端写一个脚本/tmp/test.sh

ansible testhost -m script -a '/tmp/test.sh'

⑩setup

查看用户信息

  facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
  facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

ansible testhost -m setup
ansible testhost -m setup -a 'filter="*mem*"'

三、playbooks

一个任务叫做一个play,多个play组成的组合叫playbooks

①基础

- hosts: testhost
  remote_user: root
  tasks:
  - name: cteate user name
    user: name=jam1

②变量

- hosts: testhost        #冒号后面必须有空格
  remote_user: root
  vars:
  - packages: jam2       #等价于packages=jam2
  tasks:                        #tasks的s不能少
  - name: cteate user name     #名字随便起,最好是任务的注释
    user: name={{ packages }}    #与变量呼应
  - name: delete
    user: name=jam1 state=absent

③迭代

什么情况下可以用到迭代?

安装软件包;创建用户,组;删除用户,软件包等

- hosts: testhost   #-和:后面必须都有空格
  remote_user: root    #用root用户执行
  vars:
  - packages: jam2
  tasks:
  - name: cteate user name
    user: name={{ packages }}
  - name: delete
    user: name=jam1 state=absent
  - name: yum install many
    user: name={{ item }} state=present     #迭代固定格式
    with_items:   #固定
    - jam0
    - jam1
    - jam2
    - jam3

④触发器

只要执行文件就重启ntpd,类似于只要修改配置文件就重启服务

- hosts: testhost
  remote_user: root
  vars:
  - packages: jam2
  tasks:
  - name: cteate user name
    user: name={{ packages }}
  - name: delete
    user: name=jam1 state=absent
  - name: yum install many
    user: name={{ item }} state=present
    with_items:
    - jam0
    - jam1
    - jam2
    - jam3
    notify:      #触发器,固定
    - restart ntp    #随便起
  handlers:       #要与tasks对齐
  - name:  restart ntp      #名字要与触发器名字一样
    service: name=ntpd state=restarted

⑤模板

第一步:在root下创建templates目录

第二步:将目标文件复制到templates目录下并改名为以j2为后缀的文件

第三步:在yaml或yml文件里调用templates模块

第四步:把要拷贝的文件里的参数变为变量

第五步:在/etc/ansible/hosts文件里添加变量

四、roles

什么情况下用到roles

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

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

  把每一个play封装到角色里面,调用时只需要添加角色就好了,提高复用率。

[root@localhost ~]# mkdir playbooks/roles/{webserver,dbserver}/{tasks,templates,vars,handlers,files} -pv

  [root@localhost ~]# tree playbooks

playbooks
└── roles
├── dbserver
│   ├── files
│   ├── handlers
│   ├── tasks
│   ├── templates
│   └── vars
└── webserver
├── files
├── handlers
├── tasks
├── templates
└── vars

 

tasks

1.切换目录到/root/playbooks/roles/webserver/tasks

2编辑文件.vim main.yaml(文件名是固定的

3.切换到/root/playbooks,与roles同级编辑文件vim site.yaml(文件名也是固定的

4.执行ansible-playbook site.yaml

修改files


[root@localhost webserver]# cp /etc/httpd/conf/httpd.conf files/ #在webserver下复制etc/httpd/conf/httpd.conf到files目录下
[root@localhost tasks]# cd roles/webserver/tasks #修改后再写任务时就不用写绝对路径了,直接写文件名

[root@localhost tasks]# vim main.yaml #将你要执行的任务写入文件中
[root@localhost playbooks]# ansible-playbook site.yaml

vars,handlers

1.编辑vars(注意packages前面没有-

2.编辑handlers

3.编辑tasks

4.ansible-playbook执行

templates

[root@localhost webserver]# cp files/httpd.conf templates/
[root@localhost webserver]# vim templates/httpd.conf   #修改变量{{ port }}

编辑完成后在/etc/ansible/hosts添加变量

原文地址:https://www.cnblogs.com/daisyyang/p/10806203.html