ansible使用playbook批量添加用户

本文介绍如何使用Ansible Playbook进行用户及用户组的创建,并设置用户密码及权限,包括生成加密密码的方法及Playbook配置示例。

使用playbook添加用户,并添加到组,可以使用sudo

首先先生成密码

pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"

输入密码后,把生成的字符串替换即可

cat useradd.yml    
---
- hosts: all
  vars:
    user: id10086
    group: sa
    password: "$6$rounds=656000$8co.J2OcJlhs3dtX$3UgoddDYZ.z4V.UB6tAbcsIYSquWUKCjt7nM6dc8iPBPLvOeqQezhd0aJj8S3dG4jFUmgbhx/coFfzE70No0."
  remote_user: root
  tasks:
  - name: Add group {{ group }}
    group: name={{ group }}
  - name: Add user {{ user }}
    user: name={{user}} password={{ password }} groups={{ group }}
  - name: you can use sudo 
    lineinfile: dest=/etc/sudoers state=present  line='{{item}}' validate='visudo -cf %s'
    with_items:
           - "%{{ group }}     ALL=(ALL)       NOPASSWD:ALL"


检查
ansible-playbook useradd.yml   -C
执行
ansible-playbook useradd.yml 

 

转载于:https://my.oschina.net/longquan/blog/1621633

<think>首先,用户的问题是关于Ansible Playbook使用shell模块的示例和用法。用户参考了几个引用,这些引用提供了关于Ansible shell模块的信息,包括它的用途、安全风险和Playbook示例。 关键点从引用中提取: - 引用[1]:shell模块用于在目标主机上执行通过shell解释的命令,允许使用shell特性如管道、重定向、通配符。与command模块不同,但需要谨慎处理输入以避免安全风险。 - 引用[2]:一个简单的Playbook示例,用于测试连通性,使用ping模块。但用户需要shell模块的示例。 - 引用[3]:Playbook在简化部署和配置管理方面的实践优势。 - 引用[4]:Playbook运行命令的补充参数,如检查语法、任务列表等。 用户的需求:了解ansible-playbook使用shell模块的方法或问题,具体是示例和用法。 我的回答需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 确保回答真实可靠,基于Ansible文档或标准实践。 - 在行内数学表达式中使用$...$,独立公式使用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要。 - 生成相关问题。 - 在引用段落末尾添加引用标识,如[^1]。引用来自用户提供的引用,所以我应该引用这些引用。 回答结构: 1. **介绍shell模块**:简要解释shell模块是什么,它的用途和区别。 2. **安全注意事项**:强调使用shell模块时的安全风险。 3. **示例Playbook**:提供一个或多个使用shell模块的Playbook示例。 4. **用法说明**:解释如何编写、运行和调试包含shell模块的Playbook。 5. **相关问题**:生成相关问题。 基于引用[4],有一个test1.yaml示例,但它是关于其他模块的。引用[2]有test.yml使用ping模块。我需要创建一个使用shell模块的示例。 创建一个简单示例: - 任务:使用shell模块执行一个命令,比如列出目录内容。 - Playbook结构:类似引用[2]和[4]。 示例Playbook: ```yaml --- - name: Execute shell command example hosts: all tasks: - name: List files in home directory shell: ls -l /home register: result changed_when: false # Since listing doesn't change state - name: Display result debug: var: result.stdout ``` 解释: - shell模块调用命令"ls -l /home"。 - register捕获输出。 - changed_when: false表示这个任务不会改变系统状态,所以不会报告为changed。 - debug显示输出。 用法说明: - 如何运行:ansible-playbook filename.yml - 参数:如引用[4]提到的,--syntax-check, --list-task等。 - 安全:避免使用未经验证的输入,使用args或quote过滤器。 生成相关问题: - 基于主题,生成2-3个相关问题。 引用: - 在回答中,当提到引用时,在段落末尾添加[^n]。例如,解释shell模块时引用[^1]。 完整回答大纲: 1. **介绍**:Ansible shell模块的作用和重要性。 2. **安全注意事项**:使用shell模块的风险。 3. **示例**:提供Playbook代码和解释。 4. **用法**:如何有效使用。 5. **相关问题**:列出相关问题。</think>### Ansible Playbook使用 shell 模块的示例和用法 Ansible 是一个强大的自动化工具,Playbook 是其核心配置语言,用于定义任务序列。其中,`shell` 模块允许在目标主机上执行通过 shell 解释的命令,支持管道、重定向、通配符等 shell 特性,比 `command` 模块更灵活,但需谨慎处理以避免安全风险(如命令注入)[^1]。下面我将逐步解释用法并提供示例,确保回答基于 Ansible 官方文档和最佳实践。 #### 1. **shell 模块的基本介绍** - **作用**:`shell` 模块在远程主机上运行 shell 命令,适用于需要 shell 特性的场景(如变量扩展或重定向)。与 `command` 模块不同,它不直接执行命令,而是通过 shell 解释器(如 `/bin/sh`)处理[^1]。 - **安全注意事项**:由于允许 shell 特性,需避免使用未经验证的变量输入,以防止安全漏洞。建议优先使用 `command` 或专用模块(如 `file` 或 `copy`),仅在必要时使用 `shell`[^1][^3]。 - **适用场景**:执行脚本、处理文件内容、使用管道过滤输出等。 #### 2. **Playbook使用 shell 模块的示例** 以下是一个完整的 Playbook 示例,展示如何用 `shell` 模块执行命令并处理输出。示例任务包括:列出目录内容、检查服务状态、并注册结果用于调试。 ```yaml --- - name: Example of using shell module hosts: all # 作用于所有目标主机 tasks: # 任务1: 使用 shell 模块列出 /var/log 目录的文件 - name: List files in /var/log directory shell: ls -l /var/log | grep .log # 使用管道过滤 .log 文件 register: log_files # 注册输出结果 changed_when: false # 标记为不改变系统状态,避免误报 args: executable: /bin/bash # 指定 shell 解释器(可选) # 任务2: 使用 shell 模块检查 Nginx 服务状态 - name: Check Nginx service status shell: systemctl status nginx register: nginx_status ignore_errors: true # 忽略错误(如服务未安装) # 任务3: 显示结果 - name: Display log files debug: var: log_files.stdout # 输出任务1的结果 - name: Display Nginx status debug: var: nginx_status.stdout_lines # 输出任务2的结果(按行显示) ``` **解释**: - **任务1**:执行 `ls -l /var/log | grep .log` 命令,使用管道过滤日志文件。`register` 捕获输出,`changed_when: false` 表示此任务不改变系统状态(适合只读操作)。 - **任务2**:检查 Nginx 服务状态,`ignore_errors: true` 确保 Playbook 继续运行即使服务不存在。 - **任务3**:使用 `debug` 模块显示结果,`stdout` 输出完整字符串,`stdout_lines` 输出按行分割的列表。 - **运行 Playbook**: - 保存文件为 `shell_example.yml`。 - 执行命令:`ansible-playbook shell_example.yml`。 - 添加参数:如 `-k`(交互输入 SSH 密码)或 `-K`(输入 sudo 密码)[^4]。 #### 3. **关键用法说明** - **参数详解**: - `shell: "command"`:指定要运行的 shell 命令。命令字符串需用引号包裹,尤其当包含空格或特殊字符时。 - `register: var_name`:捕获命令输出(包括 `stdout`、`stderr` 和 `rc` 返回码),用于后续任务。 - `changed_when: false`:对于只读命令(如 `ls`),防止 Ansible 报告 “changed” 状态。 - `args`:可选参数,如 `executable` 指定 shell 路径(例如 `/bin/bash`)。 - `ignore_errors: true`:忽略命令失败,避免 Playbook 中断。 - **安全最佳实践**: - 避免直接嵌入变量:使用 `{{ variable | quote }}` 过滤输入,防止命令注入。例如: ```yaml shell: "echo {{ user_input | quote }}" ``` - 优先使用 Ansible 模块:如文件操作用 `file`,服务管理用 `service`,减少对 `shell` 的依赖[^3]。 - **调试与验证**: - 检查语法:`ansible-playbook shell_example.yml --syntax-check`[^4]。 - 列出任务:`ansible-playbook shell_example.yml --list-tasks` 查看所有任务。 - 指定起始任务:`ansible-playbook shell_example.yml --start-at-task='List files'`[^4]。 #### 4. **常见问题与解决方案** - **问题:命令失败导致 Playbook 中断** - **解决**:添加 `ignore_errors: true` 或使用 `failed_when` 条件控制。 - **问题:输出处理复杂** - **解决**:结合 `register` 和 `set_fact` 模块处理输出,例如提取特定值。 - **问题:性能影响** - **解决**:限制 `shell` 使用频率,批量命令写入脚本并用 `script` 模块执行。 通过 Playbook 使用 `shell` 模块,可以高效管理复杂任务,但需平衡灵活性与安全性。参考 Ansible 官方文档能确保实践可靠性[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值