ansible 是一个基于Python的用来进行分布式服务器批量管理的一个工具,其基于ssh协议,只需要在操作主机上安装ansible并配置目标主机的相关信息就可在操作主机上管理目标主机,而不需要目标主机安装任何第三方工具
一 ubuntu下安装并测试ansible
以下已经安装的就不用再安装了,可以选择性的更改
apt-get update && \
apt-get install python3.5 -y &&\
apt-get install libssl-dev -y &&\
apt-get install net-tools -y &&\
apt-get install python3-pip -y &&\
apt-get install ssh -y &&\
python3.5 -m pip install ansible -i https://pypi.tuna.tsinghua.edu.cn/simple
- 如果觉得apt-get下载慢,可以尝试更换下载源,请参考apt-get更改阿里云下载源
配置服务器秘钥(若使用密码登陆服务器或者已经有了各服务器的密钥则可以忽略此步骤)
- 在宿主主机下执行
ssh-keygen -t rsa # 所有数据都是选填的,可以一路回车
,最后会在~/.ssh/目录下有id_rsa id_rsa.pub
两个文件,然后将~/.ssh/id_rsa.pub中的文件拷贝到目标服务器的~/.ssh/authorized_keys
中(没有.ssh文件夹则创建一个), 拷贝完成后再执行chmod 600 ~/.ssh/authorized_keys
给文件权限
配置ansible
ansible.cfg文件
ansible.cfg文件是对ansible应用的配置,ansible在运行时会依次在以下四个地方下搜寻:
环境变量
ANSIBLE_CFG
指向的文件
当前目录下的./ansible.cfg
文件
用户目录下的文件~/.ansible.cfg
/etc/ansible/ansible.cfg
若这些地方都没有该文件,则可以自己创建出该文件,模板参考ansible.cfg模板,文件中的字段含义如下:
- defaults配置
配置项 | 说明 | 默认值 |
---|---|---|
inventory | ansible inventory文件路径 | /etc/ansible/hosts |
library | ansible模块文件路径 | /usr/share/my_modules/ |
remote_tmp | ansible远程主机脚本临时存放目录 | ~/.ansible/tmp |
local_tmp | ansible管理节点脚本临时存放目录 | ~/.ansible/tmp |
forks | ansible执行并发数 | 5 |
poll_interval | ansible异步任务查询间隔 | 15 |
sudo_user | ansible sudo用户 | root |
ask_sudo_pass | 运行ansible是否提示输入sudo密码 | True |
ask_pass | 运行ansible是否提示输入密码 | True |
transport | ansible远程传输模式 | smart |
remote_port | 远程主机SSH端口 | 22 |
module_lang | ansible模块运行默认语言环境 | C |
gathering | facts信息收集开关定义 | smart |
roles_path | ansible role存放路径 | /etc/ansible/roles |
timeout | ansible SSH连接超时时间 | 10 |
remote_user | ansible远程认证用户 | root |
log_path | ansible日志记录文件 | /var/log/ansible.log |
module_name | ansible默认执行模块 | command |
executable | ansible命令执行shell | /bin/sh |
hash_behaviour | ansible主机变量重复处理方式 | replace |
private_role_vars | 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 | yes |
vault_password_file | 指定vault密码文件路径 | 无 |
ansible_managed | 定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 | Ansible managed |
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 | 定义ansible facts缓存方式 | memory |
fact_caching_connection | 定义ansible facts缓存路径 | 无 |
- privilege_escalation配置
配置项 | 说明 | 默认值 |
---|---|---|
become | 是否开启become模式 | True |
become_method | 定义become方式 | sudo |
become_user | 定义become方式 | root |
become_ask_pass | 是否定义become提示密码 | False |
Inventory文件
ansible的主机配置文件,默认路径在
/etc/ansible/hosts
内,具体的可以通过查看ansible.cfg文件中的,在配置文件中inventory字段的参数.该文件可以以主机或者组为单位进行管理.
- 示例:
mail.example.com # 单台主机
[webservers] # 分组
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
- 除了上面的写法外,有时候需要指定更多的信息,对主机有以下可选参数
主机:端口 参数项=数据
其中参数项有如下:
ansible_ssh_host
将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user
默认的 ssh 用户名
ansible_ssh_pass
ssh 密码(这种方式并不安全,强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass
sudo 密码(这种方式并不安全,强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe (new in version 1.8)
sudo 命令路径(适用于1.8及以上版本)
ansible_connection
与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file
ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type
目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'.
ansible_python_interpreter
目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python
不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).
与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
更改配置文件
- 在当前用户用户目录下创建ansible文件夹(
mkdir ~/ansible
),将配置文件放在此文件夹内,并创建如下文件
# ~/ansible/ansible.cfg
[defaults]
inventory =~/ansible/hosts
forks = 2
sudo_user = root
ask_sudo_pass = False
ask_pass = Fasle
# ~/ansible/hosts
[test]
# 端口和IP为目标主机的端口和IP,还有就是这里的id_rsa.pub需要600权限,chmod 600 ~/.ssh/id_rsa.pub
ansible_ssh_host=172.17.0.6:22 ansible_ssh_user=root ansible_ssh_private_key_file='~/.ssh/id_rsa.pub'
测试
然后执行ansible all -m ping
查看是否连接成功,正确的返回
172.17.0.6 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}