1. Ansible简介
ansible是一个用于自动化运维的配置管理和应用部署工具。基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric.SaltStack )的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署能力的是ansible所运行的模块。
ansible的基本架构:
- 连接插件(connectior plugins)用于连接管理端和被管理端。
- 核心模块(core modules)连接主机实现操作,它依赖于具体的模块来做具体的事情。
- 自定义模块(custom modules)根据自己的需求编写具体的模块。
- 插件(plugins)完成模块功能的补充。
- 剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
- 主机清单(host inventory)定义ansible需要操作主机的范围。
上述简介摘自ansible基础。
参考文档:
2. 实验环境准备
两台主机,都是ubuntu14.04.4 server版,用户都是voidking。一台作为管理机,IP为192.168.56.101,一台作为被管理机(以下称为客户机),IP为192.168.56.102。
在管理机上安装ansible,一条命令搞定:sudo apt install ansible
。
不过,安装的ansible版本很低,默认1.5.4。这里我们通过添加源来安装最新版ansible:
1 | sudo apt remove ansible |
或者,使用pip安装指定版本的ansible,本文选择安装 2.6.11
1 | sudo pip install ansible==2.6.11 -i https://pypi.tuna.tsinghua.edu.cn/simple |
想要知道都有哪些版本,可以查看ansible版本列表
PS:如果是centos系统,还可以下载ansible rpm包,通过rmp命令安装 rpm -ivh ansible-2.6.11-1.el7.ans.noarch.rpm
3. 连接准备
1、在管理机生成密钥
1 | ssh-keygen |
连续回车即可。
2、将公钥写入客户机
1 | ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.102 |
3、在管理机添加客户机到hosts
1 | sudo vim /etc/ansible/hosts |
在文档最后添加:
1 | [commonservers] |
4、在管理机执行第一条命令
1 | ansible all -m ping |
5、在客户机把voidking用户添加进sudo免密,方便以后的操作
1 | sudo vim /etc/sudoers |
添加
1 | voidking ALL = NOPASSWD: ALL |
4. Ansible程序说明
4.1. 程序/命令列表
- ansible:主程序,临时命令执行工具
- ansible-doc:查看配置文档,模块功能查看工具
- ansible-galaxy:下载/上传优秀代码或Roles模块的官网平台
- ansible-lint:对playbook的语法进行检查的一个工具
- ansible-playbook:定制自动化任务,编排剧本工具
- ansible-pull:远程执行命令的工具
- ansible-vault:文件加密工具
- ansible-console:基于console界面与用户交互的执行工具
其中,最重要和最常用的是ansible。
4.2. ansible命令详解
ansible命令是ansible套装的核心部分,其主要用于执行ad-hoc命令,即单条命令。默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块。command模块不是调用的shell的指令,所以没有bash的环境变量,也不能使用shell的一些操作方式,其他和shell模块没有区别。
格式:ansible <host-pattern> [-m module_name] [options]
参数列表:
1 | ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD] |
常用参数:
- -m:指定模块
- -a:指定参数
- -i:指定主机列表
例子:
1 | # 查看主机清单中的所有主机 |
4.3. 配置文件
- /etc/ansible/ansible.cfg,主配置文件,配置ansible工作特性
- /etc/ansible/hosts,主机清单
- /etc/ansible/roles/,存放角色的目录
1、ansible.cfg的配置参考Configuring Ansible,主要关注inventory、forks、poll_interval、remote_port、log_path等参数。
2、hosts文件有一个特性很棒,可以指定变量,例如:
1 | [commonservers] |
如果在hosts文件中指定了用户名和密码,使用时报错 to use the ‘ssh’ connection type with passwords, you must install the sshpass program
那么需要先安装sshpass,安装命令为:
1 | # ubuntu |
sshpass可以实现免交互指定密码登录机器,使用方法为:
1 | sshpass -p xxx ssh ubuntu@192.168.56.102 |
4.4. ansible内置变量小结
1 | # 主机名 |
4.5. ansible-doc
格式:ansible-doc [options] [module...]
例子:
1 | ansible-doc ping |
4.6. 主机通配符
1 | # 匹配所有主机,相当于all |
4.7. 常用模块
- command:在客户机运行命令
- shell:在客户机shell进程下运行命令,支持shell特性,如管道等
- copy:从管理机拷贝文件到客户机
- fetch:从客户机获取文件
- file:设置文件属性
- yum:centos软件包管理
- service:服务管理
- script:执行脚本
- user:用户管理
- cron:crontab管理
shell比command更强大,command比shell更安全。因为command不支持重定向、管道等,避免了shell注入的风险。
5. 指定ansible.cfg
如果ansible没有指定ansible.cfg,或者想要临时使用自己定义的ansible.cfg,该怎么处理?
1、参考ansible.cfg,创建ansible.cfg文件,假设路径为 /home/voidking/ansible.cfg
2、设置环境变量
1 | export ANSIBLE_CONFIG=/home/voidking/ansible.cfg |
3、查看配置
1 | ansible --version |
6. 批量推送公钥
在本文的一开始,我们通过ssh-copy-id
命令把管理机的公钥推送给了客户机。
如果客户机有几百个,肯定不能再手动搞了,这时可以使用ansible的authorized_key
模块来实现推送。
1、创建hosts文件,把所有客户机都添加进去
1 | [common] |
2、配置忽略host_key_checking
1 | vim /etc/ansible/ansible.cfg |
去掉 host_key_checking = False
的注释
3、测试连通性
1 | ansible all -i hosts -m ping |
4、编写剧本 ssh-copy.yaml
1 |
|
5、推送公钥
1 | ansible-playbook -i hosts ssh-copy.yaml |
6、验证
1 | ssh voidking@192.168.56.102 |
7. ssh-agent
ansible可能使用到ssh-agent,那就顺便学习一下,参考了解ssh代理:ssh-agent。
ssh-agent是ssh代理程序,ssh-agent可以帮助我们管理私钥。
那么什么时候需要ssh代理帮助我们管理私钥呢?当遇到如下情况时,我们会需要ssh代理。
- 使用不同的密钥连接到不同的主机时,需要手动指定对应的密钥,ssh代理可以帮助我们选择对应的密钥进行认证,不用手动指定密钥即可进行连接。
- 当私钥设置了密码,我们又需要频繁的使用私钥进行认证时,ssh代理可以帮助我们免去重复的输入密码的操作。
- 管理机可以通过密钥连接到客户机A和客户机B,但是客户机A无法通过密钥连接到客户机B,ssh代理可以帮助我们在客户机A也能通过密钥连接到客户机B。
我们以添加.ssh/id_rsa私钥给ssh代理为例,查看一下使用流程。
1、启用ssh-agentssh-agent bash
2、把.ssh/id_rsa添加到ssh代理ssh-add ~/.ssh/id_rsa
3、测试登录ssh voidking@192.168.56.102
登录成功。
切换到root用户,ssh-agent失效。重新使用voidking登录,ssh-agent失效。想要重新登录依然生效,那就创建个脚本登录时自动执行。
常用命令:
ssh-agent $SHELL
,启动ssh-agent -k
,关闭ssh-add ~/.ssh/key_name
,添加指定私钥ssh-add -l
,查看私钥ssh-add -L
,查看公钥ssh-add -d /path/of/key/key_name
,删除指定私钥ssh-add -D
,删除所有私钥ssh-add -x
,设置密码,锁定ssh代理ssh-add -X
,输入密码,解锁ssh代理