Ansible使用
我安装的是minconda3虚拟环境的pip3安装的ansible版本
Ansible命令参数介绍
ansible命令:
-a # 模块的参数,如果执行默认COMMAND的模块
-k # 密码认证,默认使用秘钥认证
-K # 提示密码使用sudo,sudo表示提权操作
-B # 后台运行超时时间
-f # 并行任务数。NUM被指定为一个整数,默认是5
-h # 打开帮助文档API
-i # 指定库存主机文件的路径,默认为/etc/ansible/hosts
-l # 进一步限制所选主机/组模式 --limit=192.168.91.135 只对这个ip执行
-m # 执行模块的名字,默认使用command模块
-M # 要执行的模块的路径,默认为/usr/share/ansible/
-T # 指定SSH默认超时时间, 默认是10S
-u # 远程用户,默认是root用户
--version # 输出ansible的版本
ansible-doc
-h # 示命令参数API文档
-M # 查询模块,--module-path=MODULE_PATH 指定模块的路径
-l # 显示已存在的所有模块列表
-s # 显示playbook制定模块的用法
使用前提条件
- 管控机可通过ssh连接受控机. 建议设置密钥认证.明文密码不安全;
- Ansible执行批量操作时默认使用秘钥验证,所以需要将服务器端的公钥拷贝到所有客户端;
- 如果使用密码验证需要保证所有客户端的密码一致,客户端用户默认为root。
- 生成ssh密钥的命令:
ssh-keygen -t rsa
- 私钥和公钥生成后默认在
~/.ssh
目录下,ansible管控端的公钥需要放在受控端的~/.ssh/authorized_keys
文件中。
生成密钥和管理多个密钥
1. Ansible主控端生成ssh密钥,执行命令,一路回车即可生成
ssh-keygen -t rsa
2. ssh代理: ssh-agent
-
ssh-agent
可以管理私钥; - 使用不同密钥连接不同主机,
ssh-agent
可自动选择对应的密钥进行认证; - 密钥设置密码时,也需要使用
ssh-agent
来管理。
# 启动ssh代理并添加密钥:
ssh-agent bash # 执行后会在当前shell中启动一个默认shell. ssh-agent在子shell中执行。
eval ssh-agent # 进入新创建的子shell,会启动一个ssh-agent进程。
ssh-agent -k # 关闭ssh-agent代理。
- ssh-agent管理密钥
# 将私钥添加到ssh代理:
ssh-add ~/.ssh/id_rsa_custom
# 查看ssh代理中已经添加了那些私钥:
ssh-add -l
# 列出代理中所有私钥对应的公钥内容:
ssh-add -L
# 从代理中移除某个已经添加的私钥:
ssh-add -d 要移除的私钥名称
# 清空代理中的所有私钥:
ssh-add -D
# 临时锁定ssh代理:
ssh-add -x
# 解锁ssh代理:
ssh-add -X
- 生成密钥指定输出文件名称的方式:
# 在Ansible主控端执行:
ssh-keygen -t rsa -f id_rsa-test
ssh-copy-id -i ~/.ssh/id_rsa-test.pub yuan@18.18.23.3 -p22
ssh -p22 yuan@18.18.23.3
yuan@18.18.23.3's password:
# 仍提示输入密码,说明没有找到对应的私钥。
ssh-agent bash
eval ssh-agent
ssh-add ~/.ssh/id_rsa-test
# 再次ssh -p22 yuan@18.18.23.3 登录,已经免密钥登录成功。
将公钥拷贝到客户端
将公钥拷贝到客户端
ssh-copy-id -i ~/.ssh/id_rsa.pub yuan@18.18.23.3 -p22
这条命令会将公钥存放到authorized_keys文件中。
-i 选项指定要传输的公钥文件
指定用户和IP,ssh端口等信息。
配置清单Inventory
配置主机清单(Inventory):
# ansible的配置清单为: /etc/ansible/hosts
$ sudo mkdir -p /etc/ansible/{modules,my_module_utils,roles}
$ sudo vim /etc/ansible/hosts
[test] # 组名称
18.18.23.3 ansible_ssh_user='yuan' ansible_ssh_port='22'
# 如果不使用公钥,必须配置客户端的密码: ansible_pass=""
配置文件ansible.cfg
# cat /etc/ansible/ansible.cfg
[defaults]
# 默认库文件位置,hosts中存放所有主机信息
inventory=/etc/ansible/hosts
#interpreter_python=/usr/local/bin/python3
deprecation_warnings=False
# Ansible 默认搜寻模块的位置
library=/etc/ansible/modules/
module_utils=/etc/ansible/my_module_utils/
#角色roles path
roles_path=/etc/ansible/roles
#Ansible 通过远程传输模块到远程主机,然后远程执行,执行后在清理现场.
remote_tmp = ~/.ansible/tmp
local_tmp = ~/.ansible/tmp
#主机通信时的默认并行进程数,默认值比较保守,可调大
forks = 5
#异步执行任务时,每15s 回查任务状态
poll_interval = 15
# 提权
sudo_user = root
# 用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no
#ask_sudo_pass = True
# Ansible 剧本playbook 是否会自动默认弹出弹出密码.默认为no
#ask_pass = True
#transport = smart
# 远程端口号
#remote_port = 22
# 取消注释此选项可禁用SSH密钥主机检查 uncomment this to disable SSH key host checking
host_key_checking = False
# SSH 连接超时时间
# SSH timeout
timeout = 1000
# playbook 默认远程用户
#remote_user = yuan
# Ansible 日志路径
log_path=/var/log/ansible/ansible-master.log
ANSIBLE_DEBUG=1
[privilege_escalation] # 如果是普通用户则需要配置提权.
become=True
become_method = sudo
become_user=root
become_ask_pass=False
查看版本和验证配置
查看ansible版本
$ ansible --version
ansible 2.10.7
config file = /etc/ansible/ansible.cfg
configured module search path = ['/etc/ansible/modules']
ansible python module location = /data/miniconda3/envs/abe_env/lib/python3.7/site-packages/ansible
executable location = /data/miniconda3/envs/abe_env/bin/ansible
python version = 3.7.6 (default, Jan 8 2020, 19:59:22) [GCC 7.3.0]
执行ping,判断客户端服务器是否可以通信
ansible test -m ping