备注:文章事例部分代码会出现不对齐的情况,使用时,请注意格式对齐!!
第一章:Ansible 基本知识
1.1 ansible简介
Ansible是一种自动化运维工具,它是基于Python开发,可实现对系统进行批量配置、应用程序批量部署、命令批量执行等功能。它是基于模块化工作,真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,它是基于ssh来和远程主机进行通讯的。ansible目前已经已经被红帽官方收购。
Ansible具有以下特点:
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python实现二次开发轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- Ansible是轻量级工具软件,无需在客户端安装client/agents,更新时,只需在操作主机上进行一次更新即可;
- Ansible提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台,支持二次开发提供个性化功能服务。
1.2 ansible架构
1、Ansible:Ansible核心程序。
2、HostInventory:定义记录由Ansible管理的主机信息,包括端口、密码、ip等。
3、Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成特定功能。
4、CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
5、CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
6、ConnectionPlugins:连接插件,Ansible和Host通信使用,管理端支持local 、ssh、paramiko三种方式连接被管理端。1.3 ansible任务执行模式
ansible执行自动化任务,分为两种执行模式:
1、ad-hoc:单个模块(点对点模式),使用单个模块,支持批量执行单条命令,就相当于bash中的一句shell,这种模式称之为ad-hoc
2、playbook:是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件,当然多个任务在事物逻辑上是要有上下联系的。通过多个任务可以完成一个总体的目标,这就是playbook。1.4 ansible的执行流程
Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。过程如下:
1、在执行时加载操作机上的配置文件,默认为/etc/ansible/ansible.cfg;
2、查找对应的主机配置文件,默认为/etc/ansible/hosts(可使用-i参数指定特定的hosts文件),找到要执行的主机或者组;
3、加载自己对应的模块文件,如 command;
4、通过ansible将模块或命令生成对应的临时py文件(python脚本),默认临时文件路径为操作用户家目录下的.ansible/tmp,并将该py文件传输至远程服务器;
5、客户端机器对用户家目录下的.ansible/tmp/XXX/XXX.py文件添加 +x 执行权限执行;
6、执行该py文件并返回执行结果;
7、删除临时py文件,sleep 0退出;1.5 ansible安装方式
ansible安装常用两种方式,yum安装和pip程序安装,具体如下:
使用yum安装:[root@~]# yum install epel-release -y [root@~]# yum install ansible -y
使用 pip(python的包管理模块)安装:
[root@~]# yum install python-pip -y [root@~]# pip install ansible
1.6 ansible目录结构
安装目录如下(yum安装):
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/1.7 ansible的命令
安装完ansible后,ansible一共提供了七个指令,分别是:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault 。
(1)、ansible
ansible是指令核心部分,其主要是用于执行ad-hoc命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。
(2)、ansible-doc
该指令用于查看模块信息,常用参数有两个-l 和-s ,具体如下:
例如,列出所有已安装的模块
[root@~]# ansible-doc -l
查看具体某模块的用法,这里如查看command模块
[root@~]# ansible-doc -s command
(3)、ansible-galaxy
ansible-galaxy 指令的作用是方便从https://galaxy.ansible.com/ 站点下载第三方扩展模块。
(4)、ansible-lint
ansible-lint是对playbook的语法进行检查的一个工具。用法是
[root@~]# ansible-lint playbook.yml
(5)、ansible-playbook
该指令是使用最多的指令,其通过读取playbook 文件后,执行相应文件中配置的动作,这是学习ansible的重中之重。
(6)、ansible-pull
该指令使用需要谈到ansible的另一种模式:pull 模式,这和push模式相反,其主要适用于以下场景:
A:有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间
B:要在一个没有网络连接的机器上运行Anisble,比如在启动之后安装。
(7)、ansible-vault
ansible-vault主要应用于配置文件中含有敏感信息,又不希望被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上–ask-vault-pass参数,同样需要输入密码后才能正常执行。
1.8 ansible配置文件查找顺序
ansible的配置文件查找是从多个地方找的,顺序如下:
1、检查系统环境变量ANSIBLE_CONFIG指向的路径文件(比如export ANSIBLE_CONFIG=/etc/ansible.cfg);
2、~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;
3、/etc/ansible/ansible.cfg,检查/etc/ansible目录的配置文件。
1.9 ansible配置文件详解
ansible 有许多的参数,下面列出一些常见的参数详解:
1、inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
2、library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
3、forks = 5 #并发连接数,默认为5
4、sudo_user = root #设置默认执行命令的用户
5、ask_sudo_pass =True #每次执行ansible命令是否询问ssh密码
6、remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
7、host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例(建议去掉#号注释)
8、timeout = 60 #设置SSH连接的超时时间,单位为秒
9、log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)
1.10 ansible主机清单
inventory用于定义ansible要管理的主机列表,可以定义单个主机和主机组。上面的/etc/ansible/hosts就是默认的inventory。下面展示inventory常用的定义规则:
[root@~]# cat -n /etc/ansible/hosts
#单独定义主机,带上了连接被管节点的端口
193.192.168.8.131:22
#单独定义主机,带上了单独传递给ssh的参数,分别是ssh连接时登录远程用户的密码和ssh的连接端口
192.168.8.132 ansible_ssh_pass='123456' ansible_ssh_port=22
#定义nginx主机组,该组中包含了192.168.8.131到133这3台主机,还支持字母的扩展,如"web[a-d]"
[nginx]
192.168.8.13[1:3]
#支持使用主机名及嵌套变量(需要在/etc/hosts中添加对应ip地址与主机名)
[kube-master]
master
[etcd]
etcd
[kube-node]
node
[k8s-cluster:children]
kube-master
etcd
kube-node
#定义要传递给nginx主机组的变量。若定义为"[all:vars]"或"[:vars]"则表示传递给所有主机的变量(注意主机组中定义的变量要大于全局定义的定量)
[nginx:vars]
ansible_ssh_pass='123456'
inventory文件中可以使用一些内置变量,绝大多数ansible的连接和权限变量都可以在此使用。
1、常见的有:
• ansiblesshhost: ansible使用ssh要连接的主机。
• ansiblesshport: ssh的端口。默认为22。
• ansiblesshuser: ssh登录的用户名。默认为root。
• ansiblesshpass: ssh登录远程用户时的认证密码。
• ansiblesshprivatekeyfile: ssh登录远程用户时的认证私钥。(?)
• ansibleconnection: 使用何种模式连接到远程主机。默认值为smart(智能),表示当本地ssh支持持久连接(controlpersist)时采用ssh连接,否则采用python的paramiko ssh连接。
• ansibleshelltype: 指定远程主机执行命令时的shell解析器,默认为sh(不是bash,它们是有区别的,也不是全路径)。
• ansiblepythoninterpreter: 远程主机上的python解释器路径。默认为/usr/bin/python。
• ansibleinterpreter:使用什么解释器。例如,sh、bash、awk、sed、expect、ruby等等。
2、其中有几个参数可以在配置文件ansible.cfg中指定,但指定的指令不太一样,以下是对应的配置项:
• remoteport: 对应于ansiblesshport。
• remoteuser: 对应于ansiblesshuser。
• privatekeyfile: 对应于ansiblesshprivatekeyfile。
• excutable: 对应于ansibleshelltype。但有一点不一样,excutable必须指定全路径,而后者只需指定basename。
3、当inventory中有任何一台有效主机时,ansible就默认隐式地可以使用"localhost"作为本机,但inventory中没有任何主机时是不允许使用它的,且"all"或"*"所代表的所有主机也不会包含localhost。