2017-12-15 12 views
1

私は2つの不可欠な役割に取り組んでいます.1つはシステムをブートストラップし、もう1つはOSを更新してリブートします。ユーザーがプレイブックの一部としてアクセスできないときに、冪等を維持することができない

これらの役割は、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ユーザーには、anicial.cfgのデフォルトで定義されているキーがあります。

master.ymlを再実行しようとすると、rootログインを完全に無効にしてエラーが発生するため、rootユーザーがホストに接続できなくなるという問題があります。ユーザーがログインできないようにするための優雅な方法はありますか?要するに

答えて

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がブロックされた場合は、最初の1が失敗する原因となる)という事実収集を防ぐために必要
  • pre_tasksセクションで接続をチェックします(小さなタイムアウトで失敗します。ここで時間は問題ではありません - 予想される状況はバイナリです - 接続できるかどうか)。
  • ブロックレスキューセクションで上記のタスクを実行し、接続障害が発生した場合は再生処理を停止します。
  • 最初の再生を続け、そうでない場合はrh_bootstrapロールを適用します。

Sidenotes:

  • lineinfile使用templateを使用しないでください。
  • 私はそれを後でrh_bootstrapロールを「再実行しない」設計上の欠陥と考えます。
+0

ありがとうございました - 私は仕事から家に帰ると、このアプローチを今夜後に撮影します。 私はlineinfileではなくテンプレートの使用を考えていませんでしたが、それは間違いありません。 後でrh_bootstrapを "再実行可能"にする方法についてのアイデアはありますか?新しい緑色のホストを使用し、rootとしてログインし、非ルートのCMユーザを設定し、rootログインを許可することは悪い習慣と考えられるため、rootをロックアウトすることを意図しています。作業の本質上、私は2回実行できるものをどのように作ることができるかわかりません。 – Matthew

+0

'rh_bootstrap'には、後の実行では使用できないタスクはありません。早くやれよ。 – techraf

+0

ルート接続を無効にすると、後で実行するときにルートユーザーとして接続できません。だから、もう一度それを実行しようとすると、(私はあなたを誤解していない限り)SSH接続の障害が発生します。 – Matthew

関連する問題