ansible 入门安装及配置
ansible 简介
ansible整体软件架构图
Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排
- 管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接。
- 可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作。单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
- 管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件。
ansible 软件基本架构
远程调用管理模块,从Inventory里调用主机名字, ssh远端服务器执行命令,执行完成返回结果。
ansible特性
基于python语言实现, 模块化设计 ,调用特定的模块来完成特定任务 ,本身是核心组件,短小精悍 。
由Paramiko来实现创建ssh连接,基于ssh协议连接每一个被管理主机。
YAML格式是基于PyYAML模块来实现功能的,因为这个模块还支持模板语言,所以还需要jinjia2模板语言。
由Paramiko,PyYAML和Jinjia2三个关键模块。
no agents:部署简单,不需要在被管控主机上安装任何客户端;
no server:无服务器端,使用时直接运行命令即可;
modules in any languages:支持自定义模块,基于“模块”完成各种“任务”,支持各种可使用任意语言开发模块;
yaml,not code:使用yaml语言定制剧本playbook;
ssh by default:,使用SSH协议并基于SSH工作(基于密钥认证或在inventory文件中指定账号和密码);
strong multi-tier solution:可实现多级指挥。
ansible的任务执行流程
- 读取配置。
- 抓取全量机器&分组列表 – 可从多个静态文件、文件夹、脚本中读取机器,分组及其变关联量信息。
- 使用host-pattern过滤机器列表。
- 根据参数确定执行模块和配置–从modules目录动态读取,用户可以自行开发模块。
- Runner执行返回。
- Connection环节定义连接方式 => Action阶段机器列表(Lookup plugin Action变量/文件等资源的获取)。
- Callback plugin各阶段的钩子调用。
- 输出结束。
- Filter plugin过滤算子。
- Callback plugin各阶段的钩子调用。
实战安装ansible
master端 配置免密钥登录
1 | ssh-keygen -t dsa ## 生成密钥 |
拷贝id_dsa.pub
文件到远程主机的authorized_keys中。
1 | scp -P 52113 niu@192.168.56.13:~ |
在slave端配置
1 | mkdir .ssh |
测试本机是否可以正常执行
1 | ssh -p 52113 niu@192.168.56.13 |
开始安装ansible服务器端,需要配置epel源
1 | wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo |
开始编辑hosts文件,默认存放在/etc/ansible
目录中 vim /etc/ansible/hosts
。
1 | [test] |
由于我修改了ssh端口,并禁止了root登录,所以我们需要定义登录用户,及ssh端口号。
测试主机是否能够ping通。
1 | ansible test -m ping |
编写配置文件
ansible config文件查找路径
ANSIBLE_CONFIG (环境变量中的设置)
ansible.cfg (当前目录下的ansiblee.cfg)
~/.ansible.cfg (家目录下)
/etc/ansible/ansible.cfg (全局目录)
常用配置参数
- transport 默认参数:smart,可选参数 ssh,paramiko ,如果使用smart ansible则会自动选择。
- remote_user 设置目标计算机的登录用户。如果为空白,它将使用连接插件的默认值,通常是当前正在执行Ansible的用户。
- remote_port 在远程连接中使用的端口,空白时将使用默认的连接插件。
- forks 连接远程主机的时候最大开启进程数。
- stdout_callback 设置默认回调是使用的stdout
- jinja2_extensions jinja2的扩展参数
- library 自定义扩展模块地址
- roles_path ansible role文件的搜索路径使用:隔开。默认配置 ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
参考文档
ansible 官方文档
Ansible入门
Ansible中文权威指南
Ansible5:常用模块
ansible超详细使用指南
ansible实践
ansible-first-book
报错汇总
报错一:提示sudo命令将要被停止。
1 | [DEPRECATION WARNING]: The sudo command line option has been deprecated in favor of the "become" command line arguments. This |
1 | [root@linux-node2 ~14:12:01]#ansible -s test -m file -a 'path=/tmp/test-niu state=touch' |
解决办法: -s 替换成–become
1 | ansible test -m file -a 'path=/data/app/1.txt state=touch' --become |
格式错误
1 | fatal: [linux-node2]: FAILED! => {"changed": false, "checksum": "823af87241d8f906a4c23d6e0f90aebf9620ccc3", "msg": "Unsupported parameters for (copy) module: user Supported parameters include: attributes, backup, checksum, content, delimiter, dest, directory_mode, follow, force, group, local_follow, mode, original_basename, owner, regexp, remote_src, selevel, serole, setype, seuser, src, unsafe_writes, validate"} |
原始文件
1 | - name: config dns server |
解决办法
1 | - name: config dns server |
执行提示字符编码不对
1 | ERROR! Unexpected Exception, this is probably a bug: 'ascii' codec can't decode byte 0xe6 in position 8: ordinal not in range(128) |
因为inventory 里面编写了一个中文的md文档,导致的报错。
将中文文档移除,问题解决。