Ansbileを触ってみよう その2

By | 2022年8月1日

Ansible用ユーザを作成するPlaybookを作成(パスワードを平文格納、sudoパスワード不要)

次にAnsible用の実行ユーザを各サーバに用意するロールを作成してみます。
その1で作成したtest1ユーザを使用します。
想定はサーバ構築者にsudoできるユーザをパスワードログインで一時的に作ってもらい
そこからAnsbileのユーザを作成するシナリオになります。

$ ansible-galaxy init --offline op_user_add
$ tree op_user_add
op_user_add
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml

varsのmain.ymlがあるとmainディレクトリを読み込まないため削除します。

$ cd op_user_add
$ rm -rf op_user_add/vars/main.yml

複数の変数ファイルを読み込むようmainディレクトリを作成します。

$ mkdir vars/main

暗号化しない変数ファイルを作成します。

$ vi vars/main/main.yaml
user: ansible
group: automation

作成ユーザのパスワードが入った変数ファイルを作成します。

$ vi vars/main/op_pass.yml
pass: hogehoge

暗号化用のパスワードを記載します。

$ vi ~/.ssh/sudo_pass

ansible-vaultでop_pass.ymlで暗号化します。

$ ansible-vault encrypt --vault-id oppass@~/.ssh/op_pass vars/main/op_pass.yml

sudoが可能なユーザを作成します。
また、sudoができるようディストリビューションごとに異なる
グループに所属させます。
パスワードなしでログインできるように鍵も配布します。
また、ログが表示できるようhandlerで捕捉します。
特にエラー処理していないため実行ごとにパスワードハッシュが変わり常にchangedになります。

$ vi tasks/main.yml
---
# tasks file for test
- name: Create Group
  group:
    name: "{{group}}"

- name: RedHat Create User
  user:
    name: "{{user}}"
    password: "{{ pass | password_hash('sha512') }}"
    group: "{{group}}"
    groups:  wheel
    shell: /bin/bash
  when:
  - ansible_distribution != "Ubuntu"
  - ansible_distribution != "Debian"

- name: Debian Ubuntu Create User
  user:
    name: "{{user}}"
    password: "{{ pass | password_hash('sha512') }}"
    group: "{{group}}"
    groups:  adm
    shell: /bin/bash
  when:
  - ansible_distribution == "Ubuntu" or ansible_distribution == "Debian"

- name: .ssh Directory Create
  file:
    path: "/home/{{user}}/.ssh"
    state: directory
    owner: "{{user}}"
    group: "{{group}}"
    mode: "700"

- name: Add AuthKey
  ansible.posix.authorized_key:
    user: "{{ user }}"
    key: "{{ lookup('file', '/home/bringer/.ssh/id_rsa.pub') }}"

- name: User Check
  command: "id '{{user}}'"
  notify: handler
  register: result

ハンドラーを記載します。

$ vi handlers/main.yml
---
# handlers file for test
- name: handler
  debug: var="result"

インベントリを記載します。
本来はパスワードファイルも別途暗号化すべきですが
想定は一時的に作成されたユーザを使って
Ansbileで使うユーザを作成するため暗号化せずinventoryにログイン情報を記載します。

$ vi inventory
[RHEL]
localhost
192.168.1.55
192.168.1.56
192.168.1.57
192.168.1.58
192.168.1.59
[Ubuntu]
192.168.1.50
192.168.1.51
192.168.1.52
[Debian]
192.168.1.53
192.168.1.54
[all:vars]
ansible_ssh_pass=hogehoge
ansible_sudo_pass=hogehoge

ansible.posix.authorized_keyを使うためにAnsible Collectionを通じて導入します。

$ ansible-galaxy collection install ansible.posix

ロールを実行するプレイブックを記載します。

$ cd ../
$ vi useradd.yml
---
- name: test
  hosts: all
  user: test1
  become: true
  gather_facts: true

  roles:
  - op_user_add

varsのmain.ymlがあるとmainディレクトリを読み込まないため削除します。

$ rm -rf op_user_add/vars/main.yml

Ansible用ユーザを作成するPlaybookを実行(パスワードを平文格納、sudoパスワード不要)

実行します。これでAnsbile用の想定ユーザが作成されます。

$ ansible-playbook --vault-id sudo@~/.ssh/op_pass useradd.yml -i op_user_add/inventory

パスワードが記載されたinventoryを削除します。

$ rm -rf op_user_add/inventory

一時的に作成されたユーザの削除

その1で作成されたユーザなので同じ設定ファイルを使って削除します。
まず、プレイブックをバックアップします。

$ mv test/tasks/main.yml test/tasks/old.yml

test1を削除するプレイブックを作成します。

$ vi test/tasks/main.yml
---
# tasks file for test
- name: Delete User
  user:
    user: test1
    state: absent
    remove: yes
  notify: handler
  register: result

実行します。

$ ansible-playbook --vault-id sudo@~/.ssh/sudo_pass test.yml  -i test/inventory -k