gpt4 book ai didi

authentication - 在 Ansible 中,是否可以为每个剧本定义身份验证方法?

转载 作者:行者123 更新时间:2023-12-04 08:05:30 26 4
gpt4 key购买 nike

TL;DR:是否可以使用一个 ansible-playbook 命令链接两个剧本,其中一个剧本是密码认证,另一个剧本是 key 认证? (有关实际目的,请参阅最后一节)。

设置:

我有两本剧本,其中第二本 include第一个。

剧本A.yml

---
- name: PlaybookA # requires password authentication
hosts: sub.domain.ext
remote_user: root
roles:
- { role: role1, sudo: yes }
...

剧本B.yml
---
- name: Run PlaybookA
include: PlaybookA.yml

- name: PlaybookB # requires ssh-key authentication
hosts: sub.domain.ext
remote_user: ansible
roles:
- { role: role2, sudo: yes }
...

要求:
  • 只执行一个命令。
  • 对 PlaybookA 使用密码验证。
  • 对 PlaybookB 使用 ssh-key auth。

  • 问题 1:

    是否可以在 Ansible(1.9.4 或更低版本)中执行一个 ansible-playbook 命令,该命令将使用 ssh-key 身份验证成功运行 PlaybookB,但是当 PlaybookB 包含 PlaybookA 时,使用密码身份验证运行 PlaybookA?

    问题2:

    如果 Ansible 1.9.4 或更低版本无法做到这一点,那么 2.0.0+ 是否可以做到?

    值(value)注意事项:
  • Ansible 提供 --ask-pass (或 -k )作为启用密码身份验证的命令行开关。
  • Ansible 提供 ask_pass作为变量,但似乎只能在 ansible.cfg 内设置(我无法将其设置为达到预期效果的剧本变量)。
  • 正在尝试设置 ask_pass作为剧本中的指令会导致以下结果:ERROR: ask_pass is not a legal parameter of an Ansible Play .如果这个参数是合法的,它将提供一种在每个剧本级别上指示 ansible 使用什么身份验证方法的方法。

  • 目的/真实世界:

    我正在尝试使用 Ansible 创建一个配置管理工作流,它足够简单,工作中的其他人将能够学习/适应它(并希望 Ansible 一般用于 CM 和编排)。

    对于任何构建的新机器(VM 或物理),我打算让我们立即运行两个剧本。 PlaybookA(如上所示)负责使用正确的默认用户登录(通常取决于基础架构 [aws、vsphere、none 等])。一旦进入,它非常有限的工作是:
  • 为 ansible 创建标准化用户以作为运行(并安装其 ssh-key)。
  • 删除任何可能存在的非 root 用户(vm 基础架构的工件等)。
  • 禁用根访问。
  • 禁用密码验证(从现在开始仅使用 ssh-key)。

  • 根据 vm 基础架构(或缺少基础架构),默认用户或默认身份验证方法可能不同。为了采用 Ansible 的目标,我试图让同事们的事情变得非常简单,所以我想尽可能多地自动化这种流程控制。

    一旦 PlaybookA 锁定了 vm 并设置了标准化用户,PlaybookB 就会使用该标准化用户来执行所有其他必要的操作,以使我们的 vm 达到工具和实用程序等的必要基线。

    任何提示,提示,建议将不胜感激。

    最佳答案

    我今天一直面临同样的问题。这里有两个想法可能对您有所帮助:
    您可以在剧本中使用 vars_prompt 而不是 --ask-pass 询问密码
    使用 set_fact 设置密码:

    - name: "set password for the play"

    set_fact: ansible_ssh_pass="{{ my_pass }}"

    您可以将密码存储在文件中,或提示输入密码,如下例所示。在我的示例中,正在创建的 sshd 配置将禁止密码登录,但使用 ansible 默认值,您会惊讶于第二个剧本仍将被执行(!),即使我“忘记”创建一个authorized_key。那是因为 ansible 使用 ssh 的 ControlPersist 选项,并且只是保持单个任务之间的连接打开。您可以在 ansible.cfg 中关闭它

    示例剧本:
    - name: "MAKE BARE: Run preparatory steps on a newly acquired server"
    hosts: blankee

    tasks:
    - name: "set password for the play"
    set_fact: ansible_ssh_pass="{{ my_pass }}"

    - name: "Create directory {{ pathsts }}/registry/ansible-init"
    file: name="{{ pathsts }}/registry/ansible-init" state=directory owner=root group=www-data mode=770

    - name: "copy sshd config file"
    copy:
    src: 'roles/newhost/files/sshd_config'
    dest: '/etc/ssh/sshd_config'
    owner: 'root'
    group: 'root'
    mode: '0644'


    - name: "Check syntax of sshd configuration"
    shell: sshd -t
    register: result
    changed_when: false
    failed_when: "result.rc != 0"

    - name: "Restart SSHD and enable Service to start at boot"
    service: name=sshd state=restarted
    changed_when: false

    vars:
    my_pass2: foobar

    vars_prompt:
    - name: "my_pass"
    prompt: "########## Enter PWD:\n "



    - name: "Second run: This should authenticate w/out password:"
    hosts: blankee

    tasks:

    - name: "Create directory {{ pathsts }}/registry/ansible-init"
    file: name="{{ pathsts }}/registry/ansible-init22" state=directory owner=root group=www-data mode=770

    关于authentication - 在 Ansible 中,是否可以为每个剧本定义身份验证方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34243229/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com