2017-12-15 29 views
1

두 가지 가능한 역할, 하나는 시스템 부트 스트랩, 다른 하나는 OS 업데이트 및 재부팅입니다.사용자가 게임 북의 일부로 액세스 권한을 잃을 때 Idempotency가 정상적으로 유지되지 않을 수 있습니다.

이러한 역할은 master.yml 파일에 의해 시작되고있다 :

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

- hosts: all 
    remote_user: devops 
    become: true 
    roles: 
    - os_update 
... 

부트 스트랩 역할은 SELinux를 위해 필요한 패키지를 설치하는 개발 운영, 사용자, 복사 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 사용자는 anicial.cfg 기본값으로 정의 된 키를 가지고 있습니다.

master.yml을 다시 실행하려고하면 루트 로그인을 완전히 비활성화하여 더 이상 호스트에 연결할 수 없으므로 오류가 발생합니다. 로그인에 실패한 사용자를 처리하는 데 유익한 방법이 있습니까? 한마디로

답변

1
--- 
- 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 

:

당신이 연극에서 다른 처리하기 전에 happenes (그리고 root이 차단 된 경우 첫 번째는 실패 할 것이다) 사실 수집을 방지 할 필요가
  • ;
  • pre_tasks 섹션에서 연결을 확인하십시오 (작은 시간 초과로 실패하지 않습니다. 여기서 시간은 중요하지 않습니다. 예상되는 상황은 바이너리입니다. 연결될 수도 있고 연결되지 않을 수도 있습니다).
  • 위의 작업을 블록 복구 섹션에서 실행하고 연결 오류가 발생하면 재생 처리를 중지합니다.
  • 첫 번째 플레이를 계속하고 그렇지 않은 경우 rh_bootstrap 역할을 적용하십시오.

Sidenotes :

  • lineinfile 사용 template를 사용하지 마십시오.
  • 나중에 롤을 rh_bootstrap 역할을 "다시 실행하지 않는"디자인 결함이라고 생각합니다.
+0

도움을 주셔서 감사합니다. 오늘 밤 직장에서 집에 돌아와서이 접근 방식을 사용하겠습니다. 나는 lineinfile보다는 템플릿 사용을 고려하지 않았지만 확실히 이해가된다. rh_bootstrap을 "다시 실행 가능"하게 만드는 방법에 대한 아이디어가 있으십니까? 새로운 greenfield 호스트를 사용하고 루트로 로그인하고 루트가 아닌 CM 사용자를 설정 한 다음 루트 로그인을 허용하는 것이 좋지 않은 것으로 간주되기 때문에 루트를 잠그려고합니다. 수행 된 작업의 성격 상, 두 번 실행할 수있는 방법을 어떻게 만들 수 있는지 확신 할 수 없습니다. – Matthew

+0

'rh_bootstrap'에서 나중의 실행에서 사용할 수없는 작업을 볼 수 없습니다. 그냥 해. – techraf

+0

재생이 루트 연결을 사용하지 않으면 나중에 실행시 루트 사용자로 연결할 수 없습니다. 따라서 다시 실행하려고하면 SSH 연결 실패가 발생합니다 (오해가 아닌 한). – Matthew