(一)、认识Ansible
(二)、Ansible安装、配置及使用
1、实验环境的创建
1.4、设置虚拟机的上网功能
2、 在server1上安装ansible
3、熟悉ansible配置文件使用
1、创建新的用户 在普通用户下进行实验
2、创建指定的超级用户身份文件目录
3、开启root身份认证文件
4、使用copy模块远程执行命令
5、将文件复制到/mnt目录下
6、删除文件远程
(一)、认识Ansible
1、Ansible 是什么?
Ansible 是一个能实现批量部署的自动化运维工具,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率。
常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续继承、零宕机平滑升级。
常见的部署工具有Chef、Puppet、Ansible、SaltStack、Fabric
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
2、为什么选择ansible?Ansible详解及inventory文件配置
Ansible完全基于Python开发,而DevOps在国内已然是一种 趋势,Python已逐步普及,运维人员自己开发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。
Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需。
在Ansible去中心化概念下,一个简单的复制操作即可完成管理配置中心的迁移。
Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用,更新时,只需在操作机上进行一次更新即可,这点非常诱人。
配置简单、功能强大、扩展性强,通过Playbooks来定制强大的配置、状态管理。
3、Ansible 是如何工作的?
上图对应的模块功能如下:
补充:
(1)Ansible使用者来源于多种维度,分为以下几种方式:Ansible详解及inventory文件配置
CMDB存储和管理着企业IT架构中的各项配置信息,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成操作者所希望达成的目标。
基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API调用的方式运行,Ansible提供了丰富的API语言接口:PHP、Python等。
直接使用Ad-Hoc临时集调用Ansible工具集来完成任务执行。
通过执行Playbooks中预先编排好的任务集按序完成任务执行。
(2)Ansible工具集(ansible命令是Ansible的核心工具,总指挥)
INVENTORY:命令执行的目标对象配置文件
API:供第三方程序调用的应用程序编程接口
MODULES:丰富的内置模块
PLUGINS:内置和自定义的插件6、Ansible命令的使用场景
(3)作用对象
Ansible的作用对象,不仅仅是Linux和非Linux操作系统的主机,同样也可以作用于各类公有云/私有云,商业和非商业设备的网络
4、Ansible通信机制
Ansible主推的卖点是其无需任何Daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的SSH安全连接。
无客户端,只需安装SSH、Python即可。
基于OpenSSH通信,底层基于SSH协议(Windows基于PowerShell)。
支持密码和SSH认证,建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加Ansible使用的复杂度。
5、Ansible应用场景
应用部署
Ansible内置网络、应用、系统、第三方平台扩展等完善的功能模块,协助运维快速完成应用的安装、卸载、升级、启停、配置等部署类工作,即使对跨平台或知名的商业硬件也同样支持。
配置管理
Ansible内置File、Template,结合Jinja、Lineinfile等内置模块,同时无缝结合GitHub、GitLab、Git、SVN、Jenkin等主流版本控制和CI持续集成工具,助力配置管理自动化。
任务流编排
有效保证Tasks任务流按即定规则和顺序完成事先制定的目标和计划,同时Roles编排方式又能在一定程度上从书写习惯和代码层编排上保证整体项目可架构性和规范性,协助控制项目维护成本不致过高。
适用于网络管理员、系统运维、应用运维、桌面运维、DevOps、基础架构运维等多领域运维行业,上手快,效率高。
7、ansible生成的主要文件
- /etc/ansible
- /etc/ansible/ansible.cfg #配置文件
- /etc/ansible/hosts #主机库(host inventory)管理被监控的主机
- /usr/bin/ansible #主程序
- /usr/bin/ansible-doc #文档
- /usr/bin/ansible-playbook #剧本
1、实验环境的创建
1.4、设置虚拟机的上网功能
2、 在server1上安装ansible
3、熟悉ansible配置文件使用
4、 参数及ansible命令的使用
1、实验环境的创建 :
虚拟机名称 | ip | 版本 | 角色 |
---|---|---|---|
server1 | 172.25.6.1 | 7.5 | ansible |
server2 | 172.25.6.2 | 7.5 | 远程主机hosts |
server3 | 172.25.6.3 | 7.5 | 远程主机hosts |
1.2、创建虚拟机内存和cpu的要求
1.3、安装bash方便补齐命令
[root@server1 ~]# yum install bash-* -y ##方便补齐命令
1.4、设置虚拟机的上网功能
让虚拟机上网
在server1、server2、server3上
[root@server1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0GATEWAY=172.25.6.250
DNS1=114.114.114.114systemctl restart network ##重启网络
真机上:
[root@foundation6 kiosk]# iptables -t nat -I POSTROUTING -s 172.25.6.0/24 -j MASQUERADE ##让虚拟机上网在虚拟机上进行测试看网络是否可以ping
[root@server1 ~]# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=50 time=54.7 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=50 time=55.5 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=50 time=55.2 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=4 ttl=50 time=56.7 ms
^C
2、 在server1上安装ansible
步骤一:配置EPEL源
1.1、配置yum源
在阿里云上查看镜像所在的位置
1.2、配主机相关的信息
配置阿里云的yum源文件
- [root@server1 yum.repos.d]# vim epel.repo
- [epel]
- name=epel
- baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ ##阿里云上ansible安装包存放的路径
- gpgcheck=0
2.[root@server1 yum.repos.d]# yum clean all ##清除yum源的缓存信息
3.[root@server1 yum.repos.d]# yum repolist ##yum源列表
步骤二:安装ansible
1、在server1虚拟机上安装ansible
[root@server1 ~]# yum install ansible -y ##安装ansible软件
[root@server1 ~]# rpm -qa ansible ##查看ansible的安装包信息
ansible-2.9.3-1.el7.noarch
[root@server1 ~]#
[root@server1 ~]# rpm -qc ansible ##查看ansible的配置文件信息
/etc/ansible/ansible.cfg
/etc/ansible/hosts
3、熟悉ansible配置文件使用
检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
/etc/ansible.cfg检查etc目录的配置文件。
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名。默认的inventory file为/etc/ansible/hosts。
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明。
2、模板样式:
[webservers]
www1.com:2222
www2.com
[dbservers]
db1.com
db2.com
db3.com
2.2、如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机,例如:
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com
2.3、主机变量: 可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:
[webservers]
www1.com http_port=80 maxRequestsPerChild=808
www2.com http_port=8080 maxRequestsPerChild=909
2.4、组变量
[webservers] #组
www1.com
www2.com
[webservers:vars] #组变量
ntp_server=ntp.com
nfs_server=nfs.com
1、添加远端主机
1.1、将server2和server3添加到Ansible管理的主机中:
[root@server1 ~]# vim /etc/ansible/hosts
写入:
server2
server3
1.2、测试:
1.2.1、列出远程主机的列表
[root@server1 ~]# cd /etc/ansible/
[root@server1 ansible]# ls
ansible.cfg hosts roles(角色为空默认会取角色)[root@server1 ~]# ansible all --list ##默认会放在一个组中匹配所有的主机
hosts (2):
server2
server3
1.2.2、没有被定义的主机放在默认组中
[root@server1 ~]# ansible ungrouped --list-hosts ##没有定义会放在一个默认组中
hosts (2):
server2
server3
[root@server1 ~]#
[root@server1 ~]#server2
[test] ##在server3上添加[test]
server3
[root@server1 ~]# ansible ungrouped --list-hosts
hosts (1):
server2 ##因为server2没有被定义
[root@server1 ~]#
[test]
server2
[prod]
server3
[root@server1 ~]# ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do ##全部的已经分好组所以没有发现
hosts (0):
[root@server1 ~]# ansible server2 --list-hosts
hosts (1):
server2
[root@server1 ~]# ansible server3 --list-hosts
hosts (1):
server3
[root@server1 ~]#
2、定义好inventory后可以调用ping模块来检测网络是否可达
2.1、检查网络是否通顺
[root@server1 ~]# ansible all -m ping ##ping所有主机
发生报错:
ansible test -m ping -k #-k指使用密码登陆,命令行会提示输入SSH密码
(连接网络失败!!!!)
3、ping 远程主机失败的解决方法
方法一:
3.1、解决的方法首先登录验证
[root@server1 ~]# ssh server2 ##登录验证
3.2、测试:
方法二:
3.3、设置免密
-m |
---|
[root@server1 ~]# ssh-keygen ##生成免密
[root@server1 ~]# ssh-copy-id server2 ##将密钥传给server2
[root@server1 ~]# ssh-copy-id server3
3.4、测试:
ansible的命令示例
以bruce用户执行ping的存活检测
# ansible all -m ping -u bruce以 bruce sudo 至root执行ping存活检测
# ansible all -m ping -u bruce -b
以 bruce sudo 至batman用户执行ping存活检测
# ansible all -m ping -u bruce -b --become-user batman
3.5、以超户的身份进行访问
[root@server1 ~]# ansible all -m ping -u root
4、 创建普通用户,执行分发任务
linux机器都禁止使用root远程登陆,更安全的做法是用普通用户登陆,分发任务
。
4.1、在server2、server3上创建普通用户
在ansible主机上和两台hosts主机上创建普通用户devops,用于ansible任务分发与执行。保证ansible与hosts主机上devops用户id相同
在server2、server3上创建用户在server2上:
[root@server2 ~]# useradd ansible ##创建用户
useradd ansible
[root@server2 ~]# passwd ansible ##修改用户的密码
Changing password for user ansible.
New password:
passwd: all authentication tokens updated successfully.
[root@server2 ~]#
在server3上:
[root@server3 ~]# useradd ansible
[root@server3 ~]# passwd ansible
4.2、以ansible的身份登录
[root@server1 ~]# ansible all -m ping -u ansible ## 登录失败因为没有免密认证
4.3、做免密
[root@server1 ~]# ssh-copy-id ansible@server2 ##免密转给server2的ansible用户
[root@server1 ~]# ssh-copy-id ansible@server3 ##转给server3的ansible用户
4.4、测试
验证免密登录
[root@server1 ~]# ansible all -m ping -u ansible
[root@server1 ~]# ansible all -a "hostname" ##查看主机名
[root@server1 ~]# ansible all -a "df -h" ## 查看磁盘信息
如果每次ping的时候都会警告 解决方法如下
消除掉警告
[root@server1 ~]# vim /etc/ansible/ansible.cfg
command_warnings=False
4.5、测试 :
远程用户在tmp目录下创建testfile文件
[root@server1 ~]# ansible all -a "ls -l /tmp/testfile2" -u ansible ##远程用户在tmp目录下创建testfile文件
server2 | CHANGED | rc=0 >>
-rw-rw-r-- 1 ansible ansible 0 mar 6 11:51 /tmp/testfile2
server3 | CHANGED | rc=0 >>
-rw-rw-r-- 1 ansible ansible 0 mar 6 11:51 /tmp/testfile2
5、在两台hosts主机上对普通用户devops下方权力
5.1、在/mnt目录下创建文件需要sudo密码
[root@server1 ~]# ansible all -a "ls -dl /mnt/testfile" -u ansible -b ##需要sudo的密码
server3 | FAILED | rc=-1 >>
Missing sudo password
server2 | FAILED | rc=-1 >>
Missing sudo password
5.2、设置sudo的权限
在server2上:
[root@server2 ~]# visudo
ansible ALL=(ALL) ALL
server3同server2
5.3、测试:
在真机上进行测试:
[root@server1 ~]# ansible all -a "touch /mnt/testfile" -u ansible -b -K ##K表示输入sudo的密码
BECOME password:
server2 | CHANGED | rc=0 >>
server3 | CHANGED | rc=0 >>
在server2、server3上进行免密登录
在visudo
ansible ALL=(ALL) NOPASSWD: ALL
5.3.1、在真机上进行测试
[root@server1 ~]# ansible all -a "touch /mnt/testfile" -u ansible -b
server3 | CHANGED | rc=0 >>
server2 | CHANGED | rc=0 >>
6、Ansible命令的使用场景
1、查看列表的命令
-m | 要执行的模块,默认为command |
---|---|
-a | 模块的参数 |
-u | ssh连接的用户名,默认用root,ansible.cfg中可以配置 |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-s | sudo运行 |
-U | sudo到哪个用户,默认为root |
-b,–become | 变成hosts主机中的哪个用户身份,拥有其权限 |
-K | 提示输入sudo密码,当不是NOPASSWD模式时使用 |
-C | 只是测试一下会改变什么内容,不会真正去执行 |
-c | 连接类型(default=smart) |
-f | fork多少进程并发处理,默认为5个 |
-i | 指定hosts文件路径,默认default=/etc/ansible/hosts |
-I | 指定pattern,对已匹配的主机中再过滤一次 |
–list-host | 只打印有哪些主机会执行这个命令,不会实际执行 |
-M | 要执行的模块路径,默认为/usr/share/ansible |
-o | 压缩输出,摘要输出 |
–private-key | 私钥路径 |
-T | ssh连接超时时间,默认是10秒 |
-t | 日志输出到该目录,日志文件名以主机命名 |
-v |
显示详细日志 |
2、相关命令的描述和使用方法
匹配所有主机,all或*功能相同
ansible all -m pingansible “*“ -m ping
ansible 172.25.6.* -m ping
对多台主机或多个组同时分开处理即可
ansible"web1:web2" -m ping在webserver组但不在database组的主机,用感叹号表示
absible "webserver:!database" -m ping
在webserver组和database组中同时存在的主机,用&符号表示
ansible "webserver:&database" -m ping
模糊匹配:
*.example.com
www*.com.database
2.1、-a 命令参数,使用command模块远程执行命令
2.2、*号的使用方法
[root@server1 ~]# ansible server* --list-hosts
2.3、-m 要执行的参数,使用copy模块远程执行命令
[root@server1 ~]# ansible test:prod --list-hosts
hosts (2):
server2[ansible@server1 ~]$ ansible test -a "ls -l /tmp"
server3
[root@server1 ~]# ansible 'test:!prod' --list-hosts ##只查看test中的数据
hosts (1):
server2
- 定义Inventory(主机列表)
- Inventory可以直接为地址如:172.25.6.2
- 端口号步不是默认的22端口时 可以明确表示为: server2:2222
2.定义主机和组
- 中括号表示一个组,也可以表示一个范围
[webserver]
www[1:10].example.com
db-[a:f].example
3.定义主机变量
- 在palyook中使用时对应主机进行个性化的定制
[webserver]
web1 http_port=8080 maxRequestsPChaild=1024
4.在inventory 主文件年中存在的变量并不是最佳的方式 还可以保存在独立的文件中
- 这些独立的文件格式为YAML
- 当变量边多时,文件定义变量更方便的进行管理和组织
5.变量的检索位置
- Inventory中vars的定义的区域
- Playbook中vars目录下的文件
- Riles同级目录的文件
- Rolrs同级目录下的group_vars和hosts_vars目录中的文件
- 大家设置变量时应尽量沿用同一种方式,以便维护人员管理
1、创建inventory文件
[root@server1 ~]# vim inventory
[pord]
server3
~
[root@server1 ansible]# ansible all -i inventory -m ping ##查看是否能连通
1.2、测试 :
(连接成功!!)
2、定义组的套嵌以及变量
[root@server1 ~]# vim /etc/ansible/hosts
...
[test]
server2
[prod]
server3
[webserver:children] ##创建一个组把test和prod加近来
test
prod
...
2.2、测试 :
[root@server1 ~]# ansible webserver --list-hosts
hosts (2):
server2
server3
1、创建新的用户 在普通用户下进行实验
2、创建指定的超级用户身份文件目录
3、开启root身份认证文件
4、使用copy模块远程执行命令
5、将文件复制到/mnt目录下
6、删除文件远程
copy模块:复制本地文件至远程主机上
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录。
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
mode 文件或目录复制到远程主机后,所拥有的权限
shell模块:让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等
4、 创建普通用户,执行分发任务
linux机器都禁止使用root远程登陆,更安全的做法是用普通用户登陆,分发任务。
(1)在ansible主机上和两台hosts主机上创建普通用户devops,用于ansible任务分发与执行。
保证ansible与hosts主机上devops用户id相同
1、创建新的用户 在普通用户下进行实验
[root@server1 ansible]# useradd ansible
[root@server1 ansible]#
[root@server1 ansible]# su - ansible
1.2、给新创建的用户生成秒密
[ansible@server1 ~]$ ssh-keygen ##生成免密
[ansible@server1 ~]$ ssh-copy-id server3 ##将密钥转给其他节点
[ansible@server1 ~]$ ssh-copy-id server2
1.3、测试:
[ansible@server1 ~]$ ansible all -m ping
2、创建指定的超级用户身份文件目录
[ansible@server1 ~]$ mkdir demo
[ansible@server1 ~]$
[ansible@server1 ~]$ cd demo/
[ansible@server1 demo]$
[ansible@server1 demo]$ cp /etc/an
anacrontab ansible/
[ansible@server1 demo]$ cp /etc/ansible/ansible.cfg .
[ansible@server1 demo]$
2.2、测试:
没有给予超级用户得很放
查看失败!!!
[ansible@server1 ~]$ ansible websever --list-hosts
[WARNING]: Could not match supplied host pattern, ignoring: websever
[WARNING]: No hosts matched, nothing to do
2.3、默认是以ansible普通用户的身份进行的
3、开启root身份认证文件(以root身份运行) 普通与胡可以有权限进行远程的查看、
[ansible@server1 demo]$ vim ansible.cfg
[defaults]
inventory =~/hosts
command_warnings = False
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
3.2、、创建Inventory自定义
[ansible@server1 demo]$ vim inventory
[ansible@server1 demo]$
[ansible@server1 demo]$ cat inventory
[test]
server2
[prod]
server3
[ansible@server1 demo]$
4、使用copy模块远程执行命令
[ansible@server1 ~]$ ansible test -m copy -a "src=hosts dest=/tmp" ##进行远程复制
4.2、测试:
查看/tmp下的文件信息
[ansible@server1 ~]$ ansible test -a "ls -l /tmp"
4.3、查看以test的身份查看/tmp/hosts下的配置信息
[ansible@server1 ~]$ ansible test -a "cat /tmp/hosts"
server2 | CHANGED | rc=0 >>
[test]
server2
[prod]
server3]
5、将文件复制到/mnt目录下
[ansible@server1 ~]$ ansible test -m copy -a "src=hosts dest=/mnt"
[ansible@server1 ~]$ ansible test -m command -a "rm -f /mnt/hosts"
server2 | CHANGED | rc=0 >>