42-Ansible-Inventory

发布于:2025-08-31 ⋅ 阅读:(21) ⋅ 点赞:(0)

Ansible基本概述
什么是Ansible?
	Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
手动运维时代(原始社会)
在之前,我们学习了如何安装nginx。但是我们使用的是yum安装的方式,在以前,运维需要规范,需要统一配置管理,我们只能使用源码安装方式,便于我们去管理,源码安装,如果是单台还好,一会也就装完了,如果此时,生产环境压力骤增,需要扩展100台web节点(源码安装100台nginx)我们该如何操作?
#1.安装依赖
yum install pcre-devel openssl-devel -y

#2.进入安装目录
cd /usr/local/tools

#3.创建nginx用户
useradd nginx -M -s /sbin/nologin

#4.解压
tar xf nginx-1.6.3.tar.gz

#5.进入nginx程序目录
cd nginx-1.6.3

#6.生成
./configure --prefix=/usr/local/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module

#7.编译
make

#8.安装
make install

#9.做软链接
ln -s /usr/local/nginx-1.6.3/ /usr/local/nginx

以上步骤还只是安装,那还要部署代码呢?修改配置文件?优化?启动?那还工作个毛线啊,一天啥也不用干了,就装nginx吧。

自动化运维时代
只需要一条命令,搞定100台集群

在这里插入图片描述

自动化运维工具的优势

在这里插入图片描述

Ansible的功能及优点
1.远程执行
批量执行远程命令,可以对多台主机进行远程操作

2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停

3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理

4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。

5.二次开发
因为语法是Python,所以便于运维进行二次开发。

6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署

7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache和启动服务

在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd

在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx
Ansible的架构
1、连接插件connection plugins用于连接主机 用来连接被管理端
2、核心模块core modules连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块custom modules根据自己的需求编写具体的模块
4、插件plugins完成模块功能的补充
5、剧本playbookansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单inventor定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块

在这里插入图片描述

Ansible的执行流程
1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。
安装Ansible
主机名	  wanIP	       lanIP	  角色
m01	    10.0.0.61	172.16.1.61	Ansible控制端
web01	10.0.0.7	172.16.1.7	Ansible被控端
web02	10.0.0.8	172.16.1.8	Ansible被控端

1.需要配置epel仓库
2.安装Ansible  #注意:ansible只安装不启动
[root@m01 ~]#yum install -y ansible

Ansible参数:
-i			#主机清单文件路径,默认是在/etc/ansible/hosts  使用-i指定主机清单的位置
-m			#使用的模块名称,默认使用command模块
-a			#使用的模块参数,模块的具体动作

#3.查看Ansible版本及模块路径
[root@m01 ~]# ansible --version
ansible 2.7.1
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]


[root@m01 ~]#cat /etc/ansible/hosts 
10.0.0.7 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'

[root@m01 ~]#ansible 10.0.0.7 -m ping	#ping不通需要关闭Ansible指纹检查
10.0.0.7 | FAILED! => {
    "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
}

修改主机配置文件:跳过指纹检测
[root@m01 ~]#grep -n "host_key_checking" /etc/ansible/ansible.cfg 
71:host_key_checking = False
Ansible配置文件生效顺序
1. $ANSIBLE_CONCFIG
2. ./ansible.cfg
3. ~/.ansible.cfg
4. /etc/ansible/ansible.cfg
Ansible inventory主机清单

/etc/ansible/hosts 是Ansible默认主机清单文件,用于定义被管理主机的认证信息,例如:ssh登录用户名、密码以及key相关信息。inventory文件中填写需要被管理的主机与主机组信息。还可以自定义inventory主机清单的位置,使用-i指定文件位置即可。

方法一:基于ssh
[root@m01 ~]#cat /etc/ansible/hosts 
10.0.0.7 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'
#测试是否管理客户端 使用:ping模块
[root@m01 ~]#ansible 10.0.0.7 -m ping
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

方法二:使用主机方式,使用别名方式管理客户端
[root@m01 ~]#cat /etc/ansible/hosts 
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'

[root@m01 ~]#ansible web02 -m ping
web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@m01 ~]#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

方法三:使用区间的方式管理客户端
[root@m01 ~]#vim /etc/ansible/hosts 
10.0.0.[7:8] ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass='1'
#表示客户端包含 :10.0.0.7和10.0.0.8 

[root@m01 ~]#ansible 10.0.0.8 -m ping
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

方法四:设置小组方式:[小组名称]
[root@m01 ~]#cat /etc/ansible/hosts 
[webs]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_pass='1'
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'
[root@m01 ~]#
[root@m01 ~]#ansible webs -m ping
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

#设置多个小组:
[root@m01 ~]#vim /etc/ansible/hosts 
[webs]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_pass='1'
web02 ansible_ssh_host=10.0.0.8 ansible_ssh_pass='1'

[dbs]
10.0.0.51 ansible_ssh_pass=1


[root@m01 ~]#ansible dbs -m ping
10.0.0.51 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

#查看组内成员列表
[root@m01 ~]#ansible webs -m ping --list-hosts
  hosts (2):
    web01
    web02

Ansible基于免秘钥方式管理客户端
1.生成秘钥对
[root@m01 ~]#ssh-keygen
2.拷贝到客户端
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.8
3.配置主机清单
[root@m01 ~]#cat /etc/ansible/hosts 
10.0.0.7
10.0.0.8
测试:
[root@m01 ~]#ansible 10.0.0.7 -m ping
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@m01 ~]#ansible 10.0.0.8 -m ping
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

使用all表示所有客户端:
[root@m01 ~]#ansible all -m ping
10.0.0.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.0.0.7 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

#设置小组:
[root@m01 ~]#vim /etc/ansible/hosts 
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[root@m01 ~]#ansible webs -m ping
web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

#设置包含多个组:
[root@m01 ~]#vim /etc/ansible/hosts 
[webs]
web01 ansible_ssh_host=10.0.0.7

[dbs]
web02 ansible_ssh_host=10.0.0.8

[lnmp:children]
webs
dbs

[root@m01 ~]#ansible webs -m ping
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[root@m01 ~]#ansible dbs -m ping
web02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

小结
inventory 主机清单
基于ssh
1)基于用户名+端口+密码
2)基于免秘钥

vim /etc/ansible/hosts
10.0.0.7							#指定单台主机
web01 ansible_ssh_host=10.0.0.7		#使用别名
[webs]								#指定小组
10.0.0.7
10.0.0.8

[dbs]								#指定多个组
10.0.0.51
10.0.0.31

[lnmp:children]
webs
dbs
Ansible-Adhoc
什么是ad-hoc?
ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存。

ad-hoc模式的使用场景
比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等··
ad-hoc常用模块
command				#执行shell命令(不支持管道等特殊字符)
shell				#执行shell命令
scripts				#执行shell脚本
yum_repository		#配置yum仓库
yum					#安装软件
copy				#变更配置文件
file				#建立目录或者文件
service				#启动与停止服务
mount				#挂载设备
cron				#定时任务
get_url				#下载软件
firewalld			#防火墙
selinux				#selinux
第一个模块:command模块 不支持管道,不建议使用
第二个模块:shell 在不知道使用什么模块的时候使用shell模块
第三个模块:scripts 执行脚本时候
第四个模块:yum:
yum:
	name:nfs-utils 软件的名称
	state:动作
		present:安装
		absent:卸载
		latest:最新版本
安装nfs-utils
1.开启10.0.0.31
2.配置Ansible-host
[root@m01 ~]#cat /etc/ansible/hosts 
nfs ansible_ssh_host=10.0.0.31
3.设置免秘钥
[root@m01 ~]#ssh-keygen
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.31

[root@m01 ~]#ansible nfs -m yum -a 'name=nfs-utils state=present'
nfs | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "1:nfs-utils-1.3.0-0.68.el7.2.x86_64 providing nfs-utils is already installed"
    ]
}

卸载nfs-utils
[root@m01 ~]#ansible nfs -m yum -a 'name=nfs-utils state=absent'

配置nfs-utils

启动nfs-utils

#查看Ansible帮助文档:
[root@m01 ~]#ansible-doc yum
/EXA


创建文件file模块:
[root@m01 ~]#cat /etc/ansible/hosts 
nfs ansible_ssh_host=10.0.0.31
[webs]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

[root@m01 ~]#ansible webs -m file -a 'path=/root/ansible.txt state=touch'
[root@m01 ~]#ansible webs -m file -a 'path=/root/ansible state=directory'
[root@m01 ~]#ansible webs -m file -a 'path=/root/oldboy state=directory mode=055 owner=root group=root'

Ansible playbook
playbook即剧本,兵书之意,playbook是由以下部分组成的	
play:定义的是主机的角色。(主角还是配角,找哪个明星)
task:定义的是具体执行的任务(角色的台词和动作)
playbook:由一个或者多个play(角色)组成,一个play(角色)可以包含多个task(台词动作)

简单理解为:使用不同的模块完成一件事情
在Ansible中“剧本文件”是yml结尾的文件
在saltStack中“剧本文件”是以sls结尾的文件
但是语法,使用的都是yaml语法
playbook 功能比ad-hoc更全,是对ad-hoc的一种编排
playbook 能很好的控制先后执行顺序,以及依赖关系
playbook 语法展现更加直观
playbook 可以持久使用,ad-hoc 无法持久使用
YAML语法
语法 描述
缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用TAB
冒号 以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线 表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表
yum:
  name: vsftpd
  state: present

1.环境准备:
10.0.0.31
2.配置Ansible-host
[root@m01 ~]#cat /etc/ansible/hosts 
nfs ansible_ssh_host=10.0.0.31
3.设置免秘钥
[root@m01 ~]#ssh-keygen
[root@m01 ~]#ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.31
[root@m01 ~]#mkdir -p ansible
[root@m01 ansible]#cat nfs.yml 
- hosts: nfs						#操作的客户端
  tasks:							#定义tasks
  - name: Install NFS Server
    yum:							#yum模块安装nfs-utils服务
      name: nfs-utils
      state: present
  - name: Configure NFS Server		#配置nfs服务
    copy:
      content: "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)"
      dest: /etc/exports
  
  - name: Configure group www		#添加www用户、用户组
    group:
      name: www
      gid: 666
      state: present
  
  - name: Add user www
    user:
      name: www
      uid: 666
      group: www
      shell: /sbin/nologin
      create_home: false
      
  - name: Create /data				#创建必要的数据
    file:
      path: /data
      state: directory
      group: www
      owner: www
  
  - name: Start NFS					#启动nfs服务
    systemd: 
      name: nfs
      state: started
      enabled: yes


[root@m01 ansible]#ansible-playbook --syntax-check nfs.yml		#检测语法是否正确,什么都不显示表示没问题。

#执行play-book
[root@m01 ansible]#ansible-playbook nfs.yml 


yam模块:
yum:
  name: 指定包的名称(nfs-utils)
  state: 动作 [present|absent|lastest]
 
copy模块:
copy:
  src: 源文件(在Ansible服务器)
  dest: 拷贝到客户端的具体位置
  owner: 属主
  group: 属组
  content: “字符串”
案例:将61的exports文件拷贝到31的家目录 属主属组为bin 权限为600  
- name: Configure NFS Server
    copy:
      src: exports
      dest: /root/exports
      owner: bin
      group: bin
      mode: 0600
案例:将content中的字符串定向到目标位置
  - name: Configure NFS Server
    copy:
      content: "/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)"
      dest: /etc/exports

group模块:
group:
  name:		#组名称
  gid:  	#组id
  state:	#动作创建|删除[present|absent]
  
user模块:
user:
  name: 		#用户名称
  uid: 			#UID
  group: 		#属组[GID|组名称]
  shell: 		#指定解释器[/bin/bash|/sbin/nologin]
  create_home:  #是否创建家目录 false true
  
 案例:创建www用户和用户组
  - name: Configure group www
    group:
      name: www
      gid: 666
      state: present
  
  - name: Add user www
    user:
      name: www
      uid: 666
      group: www
      shell: /sbin/nologin
      create_home: false

flie模块:
file:
  path:创建的位置
  state:touch 创建文件 directory 创建目录 absent 删除文件或目录
  group: 属组
  owner: 属主
  mode: 权限
  recurse: 递归授权
  
  案例:
  [root@m01 ansible]#cat test.yml 
- hosts: web01
  tasks:
    - name: test
      file:
        path: /root/test
        state: directory
        owner: www
        group: www
        recurse: yes
 
    - name: file
      file: 
        path: /root/test/test.txt
        state: touch
  
systemd模块:
systemd:
  name: nfs			#服务名称
  state: started	#启动 停止 重加载[started|stoped|reloaded]
  enabled: yes		#是否开机自启 [yes|no]
  
案例:
  - name: Start NFS
    systemd:
      name: nfs
      state: started
      enabled: yes
mount模块:
mount:
  path: /mnt				#挂载到本地的位置
  src: 172.16.1.31:/data	#挂载的路径
  fstype: nfs				#挂载类型
  state: present			#挂载并写入fstab
  
  

crontab模块:
cron:	
  name: "ntpdate"		#描述信息
  minute: "*/5"			#每隔5分钟
  job: "ntpdate ntp1.aliyun.com &> /dev/null"	#具体执行的命令
  state: present		#动作,创建present  删除absent
  

unarchive模块:
	unarchive:
        src: /root/hehe.tar.gz		#压缩包的位置
        dest: /root/				#解压的目的位置
        remote_src: yes				#压缩包文件是否在客户端。加了此参数 hehe.tar.gz 在目标服务器,如果不加此参数默认在Ansible服务器上查找hehe.tar.gz


        
        

网站公告

今日签到

点亮在社区的每一天
去签到