Configuration 当用户作为剧本的一部分失去访问权限时,优雅地不能保持幂等性

Configuration 当用户作为剧本的一部分失去访问权限时,优雅地不能保持幂等性,configuration,ansible,devops,Configuration,Ansible,Devops,我正在处理两个Ansible角色:一个引导系统,另一个更新操作系统并重新启动 这些角色由master.yml文件启动: --- - hosts: all remote_user: root roles: - rh_bootstrap - hosts: all remote_user: devops become: true roles: - os_update ... 引导角色为selinux安装必要的包,添加devops用户,复制ssh密钥,并强化ssh ---

我正在处理两个Ansible角色:一个引导系统,另一个更新操作系统并重新启动

这些角色由
master.yml
文件启动:

---
- hosts: all
  remote_user: root
  roles:
  - rh_bootstrap

- hosts: all
  remote_user: devops
  become: true
  roles:
  - os_update
...
引导角色为selinux安装必要的包,添加devops用户,复制ssh密钥,并强化ssh

---
- name: Ensure that libselinux is installed
  yum:
    name: libselinux-python
    state: installed

- name: Create devops user
  user:
    name: devops
    state: present
    comment: Create devops user

- name: Install SSH key for devops user
  authorized_key:
    user: devops
    key: "ssh-rsa MYKEYHERE"
    state: present

- name: Make sure devops user is sudoer with no pw requirements
  lineinfile:
    dest: /etc/sudoers
    state: present
    regexp: '^devops ALL\='
    line: 'devops ALL=(ALL) NOPASSWD:ALL'
    validate: 'visudo -cf %s'

- name: Ensure SELinux is Enforcing
  selinux:
    policy: targeted
    state: enforcing

- name: Disable empty password login
  lineinfile: dest={{ sshd_config }} regexp="^#?PermitEmptyPasswords" line="PermitEmptyPasswords no"
  notify: restart sshd

- name: Disable root SSH login
  lineinfile: dest={{ sshd_config }} regexp="^#?PermitRootLogin" line="PermitRootLogin no"
  notify: restart sshd

- name: Disable password login
  lineinfile: dest={{ sshd_config }} regexp="^#?PasswordAuthentication" line="PasswordAuthentication no"
  notify: restart sshd
...
此时,master.yml切换到devops用户。devops用户在myansible.cfg默认值中定义了一个密钥

问题是,如果我尝试重新运行
master.yml
,root用户将无法再连接到主机,因为我已完全禁用root登录,因此会出错。是否有任何优雅的方式来处理无法登录的用户

---
- hosts: all
  remote_user: root
  gather_facts: false
  pre_tasks:
    - block:
        - wait_for_connection:
            timeout: 5
      rescue:
        - meta: clear_host_errors
        - meta: end_play
  roles:
    - rh_bootstrap

- hosts: all
  remote_user: devops
  become: true
  roles:
    - os_update
简言之:

  • 您需要防止在播放中的任何其他处理之前发生的事实收集(如果
    root
    被阻止,将导致第一个失败)
  • 在pre_tasks部分中,检查连接(失败时会有一个小的超时,因为时间在这里并不重要-预期的情况是二进制的-它可以连接也可以不连接)
  • 在区块救援区段执行上述任务,如果(预期)发生连接故障,则停止处理播放
  • 继续第一个游戏,否则应用
    rh_bootstrap
    角色

旁注:

  • 不要使用
    lineinfle
    使用
    模板
  • <> Li >我认为这是一个设计缺陷而不是“重新运行”<代码> RHYBooStuts角色稍后。
非常感谢您的帮助-今晚下班回家后,我会尝试一下这种方法。我没有想到使用模板而不是lineinfle,但这绝对是有道理的。关于如何使rh_引导程序“可重新运行”有什么想法吗?其目的是使用一个新的greenfield主机,以root身份登录,设置一个非root CM用户,然后锁定root,因为允许root登录被认为是一种不好的做法。根据所做工作的性质,我不确定如何使其成为可以运行两次的任务。我在
rh_引导程序中看不到任何不能在以后运行中使用的任务。就这么做吧。如果游戏禁用根连接,你就不能在以后的运行中以根用户身份连接。因此,再次尝试运行它会导致SSH连接失败(除非我误解了你)。谁说只有在与
root
帐户连接时才需要运行
rh_bootstrap