[LINUX] Ich habe versucht, mehrere Benutzer (Gewähren von Zugriffsrechten) mit ansible zu verwalten

Annahme

Was du machen willst

user01 hat Zugriffsberechtigung unter user02, user02 möchte einen Zustand realisieren, in dem es unter user01 keine Zugriffsberechtigung gibt.

Fügen Sie user01 zur Gruppe sample2 hinzu.

[root@websvr ~]# usermod -aG sample2 user01

Bestätigung

[root@websvr ~]# groups user01
user01 : sample1 sample2
[root@websvr ~]# groups user02
user02 : sample2

Da ich die Zugriffsberechtigung für "user01" unter "user02" nur auf die Leseberechtigung für Dateien und Verzeichnisse setzen möchte, Gehen Sie für das Verzeichnis "user02" wie folgt vor:

[root@websvr ~]# chmod 750 /home/user02
[root@websvr ~]# ll /home/
total 4
drwx------.  3 user01  sample1   78 Jan  1 14:56 user01
drwxr-x---.  3 user02  sample2   78 Jan  1 14:56 user02
drwx------. 17 vagrant vagrant 4096 Dec 31 19:31 vagrant

Wenn Sie der Gruppe kein "x" geben, kann "user01" nicht nach "/ home / user02" verschoben werden.

Ich konnte bestätigen, dass user01 die von user02 erstellte Datei nicht löschen kann.

[user01@websvr user02]$ whoami
user01
[user01@websvr user02]$ pwd
/home/user02
[user01@websvr user02]$ ll
total 0
-rw-r--r--. 1 user02 sample2 0 Jan  1 15:03 test.txt
[user01@websvr user02]$ rm test.txt
rm: remove write-protected regular empty file ‘test.txt’? y
rm: cannot remove ‘test.txt’: Permission denied

Ich möchte so etwas mit "ansible" realisieren.

Registrierung des öffentlichen Schlüssels

Stellen Sie vom Steuerknoten (Hostumgebung) aus ein, dass Sie sich mit ssh ohne Kennwort beim Zielknoten (Gastumgebung) anmelden. Registrieren Sie den im Steuerknoten erstellten öffentlichen Schlüssel im Zielknoten.

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key ($HOME/.ssh/id_rsa):
$HOME/.ssh/id_rsa already exists.
Overwrite (y/n)? n

Ich habe es bereits erstellt, daher werde ich es unterbrechen. Registrieren Sie den öffentlichen Schlüssel beim Zielknoten.

ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "$HOME/.ssh/id_rsa.pub"
The authenticity of host '192.168.33.10 (192.168.33.10)' can't be established.
ECDSA key fingerprint is SHA256:mjGym7gkqWjPvW2JXhKjqWl4XC6wuhgNIukldSVtkFk.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

Stellen Sie sicher, dass Sie sich ohne Passwort anmelden können.

ssh [email protected]
Last login: Tue Dec 31 18:41:18 2019 from 10.0.2.2
[vagrant@websvr ~]$ exit
Ausloggen
Connection to 192.168.33.10 closed.

Einstellung von ansible.cfg

Bereiten Sie ansible.cfg auf der Seite des Steuerknotens vor. Da ansible.cfg individuell eingestellt werden kann, erstellen Sie es unten.

pwd
$HOME/Desktop/workspace/ansible/ansible-study
touch ansible.cfg

Stellen Sie wie folgt in .ansible.cfg ein.

[defaults]
forks = 10
log_path = $HOME/.ansible/ansible.log
host_key_checking = False
gathering = smart
inventory = ./inventory.ini
remote_user = vagrant
private_key_file = /path/vagrant_private_key

[ssh_connection]

Die obige "private_key_file" wird aus der folgenden "Identity File" abgerufen.

cd $HOME/Desktop/workspace/vagrant
vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /path/vagrant_private_key
  IdentitiesOnly yes
  LogLevel FATAL

Bestandsaufbereitung

Beschreiben Sie die Informationen zum Zielknoten in "inventar.ini".

touch inventory.ini
cat inventory.ini
[test_servers]
192.168.33.10

Ausführen des Befehls "ansible"

Führen Sie den Befehl ping auf dem Zielknoten aus.

$ ansible -i inventory.ini test_servers -m ping -u vagrant
192.168.33.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Da die erforderlichen Informationen in "ansible.cfg" beschrieben sind, kann der folgende Befehl verwendet werden.

$ ansible test_servers -m ping
192.168.33.10 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Vorbereiten des Rollbacks des Zielknotens

Gehen Sie wie folgt vor, um den Zielknoten zurücksetzen zu können: Selbst wenn Sie beim Ausführen des Playbooks einen Fehler machen, können Sie erneut beginnen.

$ vagrant sandbox status
[default] Sandbox mode is off

Einstellungen aktivieren

$ vagrant sandbox on
[default] Starting sandbox mode...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

Überprüfen Sie die Einstellungen

$ vagrant sandbox status
[default] Sandbox mode is on

Playbook-Ausführung

Das Spielbuch, das erkennt, was Sie oben tun möchten, lautet wie folgt.

create_user.yml


---
- hosts: test_servers
  become: yes
  vars_files:
    - user_list.yml
  tasks:
    - name: Create group
      group:
        name: "{{ item.name }}"
      with_items:
        - "{{ group_list }}"
      when: group_list

    - name: Create user
      user:
        name: "{{ item.name }}"
        group: "{{ item.group }}"
        groups: "{{ item.groups }}"
        password: "{{ item.password }}"
        shell: /bin/bash
        state: present
      with_items:
        - "{{ users_list }}"
      when: users_list

    - name: Permission of directory /home/user02 is '0750'
      file:
        dest: /home/{{ item.name }}
        mode: "0750"
      with_items:
        - "{{ subordinate_authority }}"

user_list.yml


group_list:
  - { name: sample1 }
  - { name: sample2 }

users_list:
  - {
      name: "user01",
      group: "sample1",
      groups: "sample1, sample2",
      password: "{{ 'password'|password_hash('sha512') }}",
      comment: "user01",
    }
  - {
      name: "user02",
      group: "sample2",
      groups: "sample2",
      password: "{{ 'password'|password_hash('sha512') }}",
      comment: "user02",
    }

superior_authority:
  - { name: user01 }

subordinate_authority:
  - { name: user02 }

Lauf.

ansible-playbook create_user.yml

PLAY [test_servers] *************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************
ok: [192.168.33.10]

TASK [Create group] *************************************************************************************************************************************************************************************************************************
[DEPRECATION WARNING]: evaluating [{'name': 'sample1'}, {'name': 'sample2'}] as a bare variable, this behaviour will go away and you might need to add |bool to the expression in the future. Also see CONDITIONAL_BARE_VARS configuration
toggle.. This feature will be removed in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
changed: [192.168.33.10] => (item={'name': 'sample1'})
changed: [192.168.33.10] => (item={'name': 'sample2'})

TASK [Create user] **************************************************************************************************************************************************************************************************************************
[DEPRECATION WARNING]: evaluating [{'name': 'user01', 'group': 'sample1', 'groups': 'sample1, sample2', 'password': '$6$cuuPF7HsudjoJ9/v$G1zztM4ZLPs6UJk/fxwgjbOAkXJ32pszjjw.J.M2t.KTlO99Bus2D1AzucT.872WBs7oqp.RfOIEjf187X6cR1', 'comment':
 'user01'}, {'name': 'user02', 'group': 'sample2', 'groups': 'sample2', 'password': '$6$cuuPF7HsudjoJ9/v$G1zztM4ZLPs6UJk/fxwgjbOAkXJ32pszjjw.J.M2t.KTlO99Bus2D1AzucT.872WBs7oqp.RfOIEjf187X6cR1', 'comment': 'user02'}] as a bare variable,
this behaviour will go away and you might need to add |bool to the expression in the future. Also see CONDITIONAL_BARE_VARS configuration toggle.. This feature will be removed in version 2.12. Deprecation warnings can be disabled by
setting deprecation_warnings=False in ansible.cfg.
changed: [192.168.33.10] => (item={'name': 'user01', 'group': 'sample1', 'groups': 'sample1, sample2', 'password': '$6$VpS/Wgs9fy5KDTI8$ZXwfSsnz4jeQ6rAOX4X8HP4xu3ndeVtasHiY0SOaeZoYUvPU3CQQQ4ww3y6VfEJAlS4jJPpXn7rRxUljY.Sc60', 'comment': 'user01'})
[DEPRECATION WARNING]: evaluating [{'name': 'user01', 'group': 'sample1', 'groups': 'sample1, sample2', 'password': '$6$wjPKJca0K2oKgwFY$5JzcugEn1.kc1KXN9XYBJVub9e.AzUT28S4ZOGy.vwKhRVkSB9dqUjUcs/sqRPf8kDG94nqAT3.S8YaA3cime1', 'comment':
 'user01'}, {'name': 'user02', 'group': 'sample2', 'groups': 'sample2', 'password': '$6$wjPKJca0K2oKgwFY$5JzcugEn1.kc1KXN9XYBJVub9e.AzUT28S4ZOGy.vwKhRVkSB9dqUjUcs/sqRPf8kDG94nqAT3.S8YaA3cime1', 'comment': 'user02'}] as a bare variable,
this behaviour will go away and you might need to add |bool to the expression in the future. Also see CONDITIONAL_BARE_VARS configuration toggle.. This feature will be removed in version 2.12. Deprecation warnings can be disabled by
setting deprecation_warnings=False in ansible.cfg.
changed: [192.168.33.10] => (item={'name': 'user02', 'group': 'sample2', 'groups': 'sample2', 'password': '$6$VpS/Wgs9fy5KDTI8$ZXwfSsnz4jeQ6rAOX4X8HP4xu3ndeVtasHiY0SOaeZoYUvPU3CQQQ4ww3y6VfEJAlS4jJPpXn7rRxUljY.Sc60', 'comment': 'user02'})

TASK [Permission of directory /home/user02 is '0750'] ***************************************************************************************************************************************************************************************
changed: [192.168.33.10] => (item={'name': 'user02'})

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
192.168.33.10              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Das Ausführungsergebnis des Zielknotens ist wie folgt.

[root@websvr ~]# ll /home/
total 4
drwx------.  3 user01  sample1   78 Jan  1 15:11 user01
drwxr-x---.  3 user02  sample2   78 Jan  1 15:11 user02
drwx------. 17 vagrant vagrant 4096 Dec 31 19:31 vagrant
[root@websvr ~]# cat /etc/group | grep user01
sample1:x:1002:user01
sample2:x:1003:user01,user02

Erstellen Sie eine Datei mit user02. Danach wird es zu "user01" und bestätigt das Zugriffsrecht.

[root@websvr ~]# su - user02
[user02@websvr ~]$ touch test.txt
[user02@websvr ~]$ ll
total 0
-rw-r--r--. 1 user02 sample2 0 Jan  1 15:32 test.txt
[user02@websvr ~]$ su - user01
Password: 
Last login: Wed Jan  1 15:32:11 UTC 2020 on pts/0
[user01@websvr ~]$ cd /home/user02/
[user01@websvr user02]$ ll
total 0
-rw-r--r--. 1 user02 sample2 0 Jan  1 15:32 test.txt

Ich kann die Datei auch nicht löschen.

[user01@websvr user02]$ rm test.txt 
rm: remove write-protected regular empty file ‘test.txt’? y
rm: cannot remove ‘test.txt’: Permission denied

Referenz

Recommended Posts

Ich habe versucht, mehrere Benutzer (Gewähren von Zugriffsrechten) mit ansible zu verwalten
Ich habe eine multiple Regressionsanalyse mit Polypoly-Regression versucht
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
Ich habe versucht, mit PyCaret zu clustern
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, Sätze mit summpy zusammenzufassen
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Essen mit SinGAN zu bewegen
Ich habe versucht, DeepPose mit PyTorch zu implementieren
Ich habe versucht, das Gesicht mit MTCNN zu erkennen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, Sätze mit GPT-2 zu generieren
Ich habe versucht, LightGBM mit Yellowbrick zu lernen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, Faktoren mit Titanic-Daten zu analysieren!
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe versucht, DeepPose mit PyTorch PartⅡ zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht, CNN mit Resnet fein abzustimmen
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Zeichnen Sie die letzte Zugriffszeit des Benutzers mit Redis auf
Ich habe versucht, Ansibles Module-Linux-Edition zusammenzufassen
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert