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