Ansible基于python语言实现,由Paramiko和PyYAML两个关键模块构建。具有独特的设计理念:
1)安装部署简单
2)管理主机便捷,支持多主机并行管理
3)避免在被管理主机上安装客户端代理,打开额外端口,采用无代理方式,只是利用了现有的ssh后台进
4)支持非root用户管理操作,支持sudo
Ansible维护模式通常由控制机和被管机组成。控制机是用来安装ansible工具软件,执行维护指令的机器,是ansible维护的核心。被管机是运行业务服务的机器,由控制机通过ssh来进行管理。
Ansible是一个模型驱动的配置管理器,支持多节点发布、远程任务执行。默认使用ssh进行连接。
Ansible管理系统由控制主机和一组被管节点组成。控制主机直接通过ssh控制被管节点,被管节点通过Ansible的资源清单(inventory)来进行分组管理。
Ansible是基于模块工作的,本身没有批量以的能力。真正有能力的是Ansible运行的模块,Ansible只是提供了框架。
核心引擎:Ansible
核心模块(core modules):这些都是Ansible自带的模块,Ansible模块资源分发到远程节点使其执行特性任务或者匹配一个特定的状态。Ansible遵循“batteries included”哲学,所以你可以有各种各样任务的核心模块。
自定义模块(custom modules):如果核心模块不足以完成某种功能,可以添加自定义模块。
插件(plugins):完成模块功能的补充,借助插件完成记录日志、邮件等功能。
剧本(playbook):定义Ansible任务的配置文件,可以将多个任务定义在一个剧本中,由Ansible自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理。
连接插件(connectior plugins):Ansible基于连接插件连接到各个主机,负责和被控节点实现通信。虽然Ansible是使用的ssh连接到各个被管节点,但是也支持其他方法,所以需要有链接插件。
主机清单(host inventory):定义Ansible管理的主机策略,默认是在Ansible的hosts配置文件中定义被管节点,同时也支持自定义动态主机清单和指定配置文件的位置。
Ansible系统由控制主机对被管节点的操作可以分为两类,即ad-hoc和playbook:
ad-hoc模式使用单个模块,支持批量执行单条命令。
playbook模式是ansible的主要管理方式,通过多个task集合完成一类功能,可以把playbook理解为通过组合多条ad-hoc操作的配置文件。
ansible执行过程流程如下:
- [root@k8s-master ~]# yum install -y ansible
- Loaded plugins: fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- * base: mirrors.ustc.edu.cn
- * extras: mirrors.ustc.edu.cn
- * updates: mirrors.ustc.edu.cn
- base | 3.6 kB 00:00:00
- docker-ce-stable | 3.5 kB 00:00:00
- epel | 4.7 kB 00:00:00
- extras | 2.9 kB 00:00:00
- kubernetes | 1.4 kB 00:00:00
- updates | 2.9 kB 00:00:00
- (1/2): epel/x86_64/updateinfo | 1.0 MB 00:00:01
- (2/2): epel/x86_64/primary_db | 7.0 MB 00:00:11
- Resolving Dependencies
- .......
- Running transaction
- Installing : python2-httplib2-0.18.1-3.el7.noarch 1/7
- Installing : python-babel-0.9.6-8.el7.noarch 2/7
- Installing : python2-jmespath-0.9.4-2.el7.noarch 3/7
- Installing : python-paramiko-2.1.1-9.el7.noarch 4/7
- Installing : python-markupsafe-0.11-10.el7.x86_64 5/7
- Installing : python-jinja2-2.7.2-4.el7.noarch 6/7
- Installing : ansible-2.9.27-1.el7.noarch 7/7
- Verifying : python-markupsafe-0.11-10.el7.x86_64 1/7
- Verifying : ansible-2.9.27-1.el7.noarch 2/7
- Verifying : python-paramiko-2.1.1-9.el7.noarch 3/7
- Verifying : python2-jmespath-0.9.4-2.el7.noarch 4/7
- Verifying : python-babel-0.9.6-8.el7.noarch 5/7
- Verifying : python2-httplib2-0.18.1-3.el7.noarch 6/7
- Verifying : python-jinja2-2.7.2-4.el7.noarch 7/7
-
- Installed:
- ansible.noarch 0:2.9.27-1.el7
-
- Dependency Installed:
- python-babel.noarch 0:0.9.6-8.el7 python-jinja2.noarch 0:2.7.2-4.el7 python-markupsafe.x86_64 0:0.11-10.el7 python-paramiko.noarch 0:2.1.1-9.el7 python2-httplib2.noarch 0:0.18.1-3.el7 python2-jmespath.noarch 0:0.9.4-2.el7
-
- Complete!
我们先tree下看看有哪些文件
- [root@k8s-master ~]# tree /etc/ansible/
- /etc/ansible/
- ├── ansible.cfg
- ├── hosts
- └── roles
ansible.cfg:文件,ansible配置文件
hosts:文件,存放主机信息
roles:目录,存放roles信息
其中还有两个我们后面会用到的
host_vars:目录,存放主机变量
group_vars:目录,存放主机组变量
ansible.cfg主要配置分类:
- [defaults]:通用配置项
- [inventory]:与主机清单相关的配置项
- [privilege_escalation]:特权升级相关的配置项
- [paramiko_connection]:使用paramiko连接的相关配置项,Paramiko在RHEL6以及更早的版本中默认使用的ssh连接方式
- [ssh_connection]:使用OpenSSH连接的相关配置项,OpenSSH是Ansible在RHEL6之后默认使用的ssh连接方式
- [persistent_connection]:持久连接的配置项
- [accelerate]:加速模式配置项
- [selinux]:selinux相关的配置项
- [colors]:ansible命令输出的颜色相关的配置项
- [diff]:定义是否在运行时打印diff(变更前与变更后的差异)
具体配置示例:
- [defaults]
- inventory = /etc/ansible/hosts # ansible inventory文件路径
- library = /usr/share/my_modules/ # ansible模块文件路径
- module_utils = /usr/share/my_module_utils/ #模块文件存放目录
- remote_tmp = ~/.ansible/tmp # ansible远程主机脚本临时存放目录
- local_tmp = ~/.ansible/tmp # ansible管理节点脚本临时存放目录
- forks = 5 # ansible执行并发数
- poll_interval = 15 # ansible异步任务查询间隔
- sudo_user = root # ansible sudo用户
- ask_sudo_pass = True # 运行ansible是否提示输入sudo密码
- ask_pass = True # 运行ansible是否提示输入密码
- transport = smart # ansible远程传输模式,需要优化执行速度的时候可以修改这个参数
- remote_port = 22 # 远程主机SSH端口
- module_lang = C # ansible模块运行默认语言环境
- gathering = smart # facts信息收集开关定义
- timeout = 10 # ansible SSH连接超时时间
- remote_user = root # ansible远程认证用户
- roles_path = /etc/ansible/roles # ansible role存放路径
- log_path = /var/log/ansible.log # ansible日志记录文件
- executable = /bin/sh # ansible命令执行shell
- module_name = command # ansible默认执行模块
- module_set_locale = False # 设置本地环境变量,默认false
- host_key_checking = False # ansible第一次连接客户端是是否要检查ssh密钥
- hash_behaviour = replace # ansible主机变量重复处理方式
- fact_caching = memory # 定义ansible facts缓存方式
- private_role_vars = yes # 默认情况下,角色中的变量将在全局变量范围中可见, 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 yes
-
- vault_password_file # 指定vault密码文件路径,默认无
- ansible_managed = Ansible managed # 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中
- display_skipped_hosts = True # 开启显示跳过的主机
- error_on_undefined_vars = False # 开启错误,或者没有定义的变量
- #action_plugins # ansible action插件路径,默认无
- #cache_plugins # ansible cache插件路径,默认无
- #callback_plugins # ansible callback插件路径,默认无
- #connection_plugins # ansible connection插件路径,默认无
- #lookup_plugins # ansible lookup插件路径,默认无
- #inventory_plugins # ansible inventory插件路径,默认无
- #vars_plugins # ansible vars插件路径,默认无
- #filter_plugins # ansible filter插件路径,默认无
- #terminal_plugins # ansible terminal插件路径,默认无
- #strategy_plugins # ansible strategy插件路径,默认无
- #fact_caching_connection # 定义ansible facts缓存路径,默认无
-
- ## 特权升级相关的配置项
- [privilege_escalation]
- become = True # 是否开启become模式
- become_method = sudo # 定义become方式
- become_user = root # 定义become方式
- become_ask_pass = False # 是否定义become提示密码
-
- ## accelerate缓存加速
- [accelerate]
- accelerate_port = 5099 # 加速连接端口5099
- accelerate_timeout = 30 # 命令执行超过时间,单位为s
- accelerate_connect_timeout = 5.0 # 上一个活动连接的时间,单位为min
- accelerate_daemon_timeout = 30 # 允许多个私钥被加载到daemon
- accelerate_multi_key = yes # 任何客户端想要连接daemon都要开启这个选项
- #1.生成密钥
- [root@ansible01 ~]# ssh-keygen -t rsa
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.ssh/id_rsa):
- /root/.ssh/id_rsa already exists.
- Overwrite (y/n)? y
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- Your identification has been saved in /root/.ssh/id_rsa.
- Your public key has been saved in /root/.ssh/id_rsa.pub.
- The key fingerprint is:
- SHA256:GtEwqzua31adtJZoLAy3ycMVdDhu8ddUj/HMenpsx/0 root@ansible01
- The key's randomart image is:
- +---[RSA 2048]----+
- | o.... ...|
- | ==. .*.|
- | o..= o. =|
- | ....+ o . .. |
- | .*.*S+ = . .|
- | .Oo= * =.|
- | o .= . . B|
- | o o. oo|
- | o.... E|
- +----[SHA256]-----+
- #2.将公钥copy到被控主机上
- [root@ansible01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@11.0.1.19
- /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
- /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
- /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
- root@11.0.1.19's password:
-
- Number of key(s) added: 1
-
- Now try logging into the machine, with: "ssh 'root@11.0.1.19'"
- and check to make sure that only the key(s) you wanted were added.
-
- [root@ansible01 ~]# ansible 11.0.1.19 -m ping
- 11.0.1.19 | SUCCESS => {
- "ansible_facts": {
- "discovered_interpreter_python": "/usr/bin/python"
- },
- "changed": false,
- "ping": "pong"
- }
下一章会对组件进行说明。