Ansible普通用户批量推送及更换密钥的简单介绍

Ansible Playbook 是一种强大的配置管理和多主机部署工具,使用YAML格式定义任务、变量、模板和处理器。它允许有序执行任务,支持同步和异步操作,并通过roles进行组织。在Playbook中,可以指定执行的主机和用户,如使用`remote_user`和`become`进行权限管理。`authorized_key`模块用于管理远程服务器的SSH公钥,例如添加或删除authorized_keys文件中的key。执行Playbook时,可以使用命令行参数进行交互式密码输入、语法检查和任务列表等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

playbook- 介绍

playbooks是
一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。

核心元素
Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色

hosts和users介绍

在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。其中remote_user表示执行的用户账号。

  ---
  - hosts: abc               #指定主机组,可以是一个或多个组。
  	remote_user: root                #指定远程主机执行的用户名

指定远程主机sudo切换用

# vim ping.yml
  ---
  - hosts: abc
  	remote_user: root            
  	become: yes	               #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  	become_user: mysql          #指定sudo用户为mysql
  
  执行playbook
  # ansible-playbook ping.yml -K

常用命令
ansible-playbook [yaml文件名、也可以yml结尾]
例如:ansible-playbook a.yml

参数:
-k(–ask-pass) 用来交互输入ssh密码
-K(-ask-become-pass) 用来交互输入sudo密码
-u 指定用户

# ansible-playbook a.yml --syntax-check    #检查yaml文件的语法是否正确
# ansible-playbook a.yml --list-task       #检查tasks任务
# ansible-playbook a.yml --list-hosts      #检查生效的主机
# ansible-playbook a.yml --start-at-task='Copy Nginx.conf'     #指定从某个task开始运行

authorized_key 模块的简单介绍
需要使用到的模块:authorized_key,为特定的用户账号添加或删除 SSH authorized keys
帮助文件查看

ansible-doc authorized_key

常用选项:
Options: (= is mandatory)(= 后面的参数是强制要有的)
– exclusive [default: no]: 是否移除 authorized_keys 文件中其它非指定 key
= key: SSH public key(s) 可以是字符串或 url,如:https://github.com/username.keys
– key_options [Default: None]: 附加到 key 中的字符串,该字符串会加到 key 的开头
– path [Default: (homedir)+/.ssh/authorized_keys]: 指定 authorized_keys文件存放的位置
– state (Choices: present, absent) [Default: present]: present 添加指定
key 到 authorized_keys 文件中;absent 从 authorized_keys 文件中移除指定 key
= user: 指定修改远端服务器上哪个用户的 authorized_keys
– manage_dir (Choices: yes, no) [Default: yes]: 指定模块是否应该管理 authorized
key 文件所在的目录。如果设置为 yes,模块会创建目录,以及设置一个已存在目录的拥有者和权限。如果通过 path 选项,重新指定了一个
authorized key 文件所在目录,那么应该将该选项设置为 no

示例

---
- hosts: web		  # 要替换密钥的主机
  remote_user: user   #普通用户,登陆的用户
  become: yes		  # 2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_method: sudo # 以什么方式提权su或者sudo

  tasks:
    - name: deliver authorized_keys  # 事物名字
      authorized_key: 				 # authorized_key模块
        user: xxxx					 # 要替换密钥的用户		 
        key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" #本地存放目录的路径
        state: present	           #没有则创建authorized_keys文件 state: (1) present 添加 (2) absent 删除
        exclusive: yes			 #是否移除 authorized_keys 文件中其它非指定 key
### 使用 Ansible 批量下载文件并配置免密登录 #### 安装 Ansible 和准备环境 为了实现批量操作,首先需要确保目标机器上已经安装了 Ansible。可以通过包管理器来完成这一工作: ```bash sudo apt-get update && sudo apt-get install -y ansible ``` 对于 RedHat/CentOS 类系统,则应使用 `yum`: ```bash sudo yum install epel-release sudo yum install ansible ``` #### 编写 Playbook 进行批量下载文件 Ansible 的强大之处在于其 playbook 文件,这些 YAML 格式的剧本定义了一系列的任务去执行特定的操作。 创建一个新的 playbook 来描述要执行的动作,比如名为 `batch_download.yml` : ```yaml --- - hosts: all become: yes tasks: - name: Download file from URL get_url: url: http://example.com/path/to/file.zip dest: /tmp/file.zip mode: '0755' ``` 上述脚本会指示每台主机从指定URL地址下载压缩包到临时目录下,并设置权限为可读可执行[^1]。 #### 设置 SSH 密钥认证以支持无密码登录 为了让后续任务能够顺利运行而不需要人工干预输入密码,在此之前还需要先建立SSH公私钥对以及分发给各节点。 编写另一个playbook用于生成密钥对并将公钥复制至远程服务器,命名为 `setup_ssh_key.yml` : ```yaml --- - hosts: localhost gather_facts: no tasks: - name: Generate ssh key pair on local machine if not exist user: name: "{{ansible_user}}" generate_ssh_key: yes ssh_key_bits: 2048 ssh_key_file: ~/.ssh/id_rsa when: lookup('file', '~/.ssh/id_rsa.pub') is failed - hosts: all become: true tasks: - name: Ensure .ssh directory exists with proper permissions file: path: /root/.ssh state: directory owner: root group: root mode: '0700' - name: Copy public key to remote host's authorized_keys authorized_key: user: root state: present key: "{{lookup('file', '/home/{{ansible_user}}/.ssh/id_rsa.pub')}}" ``` 这段代码首先会在本地计算机检查是否存在SSH密钥对,如果不存在则自动生成一对新的RSA密钥;接着向所有被管设备推送当前用户的公钥,使得之后可以无需密码验证即可通过SSH连接它们[^2]。 #### 合并两个Playbooks简化流程 考虑到实际应用场景可能更倾向于一次性完成全部准备工作,因此可以把上面提到的功能整合成单一的playbook以便于管理和调用。 以下是综合版本的 `prepare_environment.yml` : ```yaml --- - hosts: localhost connection: local gather_facts: false vars_prompt: - name: target_hosts prompt: Please enter the IP addresses or hostname of targets separated by commas. private: no tasks: - name: Install required packages locally package: name: python3-pip,git state: latest - block: - include_tasks: setup_ssh_key.yml - add_host: name: "{{ item }}" loop: "{{target_hosts.split(',')}}" - meta: flush_handlers delegate_to: localhost - hosts: all any_errors_fatal: true roles: - role: common_role # 假设有一个通用的角色负责处理一些基础性的事务 post_tasks: - import_playbook: batch_download.yml ``` 这个完整的 playbooks 不仅实现了前面介绍过的功能,还加入了动态添加新主机的能力,允许用户交互式地提供待部署的目标列表。此外,它也引入了一个假设存在的角色 (`common_role`) ,这通常用来封装那些几乎每次都会涉及到的基础设定项,如更新软件源、关闭防火墙等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值