Ansible — установите oh my fish для каждого пользователя fish

#ansible #fish #oh-my-fish

#ansible #рыба #oh-my-fish

Вопрос:

Я пишу руководство по установке «oh my fish» для всех локальных пользователей fish.

Я хочу запустить установку для локального пользователя fish (оболочка по умолчанию установлена в /usr/bin/fish)

И ТОЛЬКО если ‘omf’ не установлен у них дома (проверьте наличие каталога ~/.local/share/omf)

Вот что я создал

 - name: Read local user database
  getent:
    database: passwd

- name: List local user of fish
  set_fact:
    fish_users: "{{ getent_passwd | dict2items | json_query('[? contains(value, `/usr/bin/fish`)].key') }}"

- name: Check if omf install for fish users
  stat:
    path: "/home/{{ item }}/.local/share/omf"
  loop: "{{ fish_users }}"
  register: omf_user_status

- name: Install omf when absent of fish user home
  block:
  - name: Get last omf repos
    git:
      repo: 'https://github.com/oh-my-fish/oh-my-fish'
      dest: '/tmp/omf'
      clone: yes

  - name: Installing omf for fish user
    become: yes
    become_user: "{{ item }}"
    command: /tmp/omf/bin/install -y --offline --noninteractive
    loop: "{{ fish_users }}"

  when: omf_user_status.item.stat.exists == 'False'
 

Так что, возможно, мой подход не очень хорош…

В настоящее время я могу получить ‘omf’, установленный для всех пользователей fish. Но я действительно изо всех сил пытаюсь создать полезный список, чтобы устанавливать omf только для пользователей, у которых его нет

Очевидно, что условие не работает.

omf_user_status переменная — это dict, вот пример содержимого.

 "omf_user_status": {
        "changed": false, 
        "msg": "All items completed", 
        "results": [
            {
                "ansible_loop_var": "item", 
                "changed": false, 
                "failed": false, 
                "invocation": {
                    "module_args": {
                        "checksum_algorithm": "sha1", 
                        "follow": false, 
                        "get_attributes": true, 
                        "get_checksum": true, 
                        "get_md5": false, 
                        "get_mime": true, 
                        "path": "/home/test_ansible/.local/share/omf"
                    }
                }, 
                "item": "test_ansible", 
                "stat": {
                    "atime": 1608164175.7067902, 
                    "attr_flags": "e", 
                    "attributes": [
                        "extents"
                    ], 
                    "block_size": 4096, 
                    "blocks": 8, 
                    "charset": "binary", 
                    "ctime": 1608164176.1907954, 
                    "dev": 1800, 
                    "device_type": 0, 
                    "executable": true, 
                    "exists": true, 
                    "gid": 1343, 
                    "gr_name": "test_ansible", 
                    "inode": 397192, 
                    "isblk": false, 
                    "ischr": false, 
                    "isdir": true, 
                    "isfifo": false, 
                    "isgid": false, 
                    "islnk": false, 
                    "isreg": false, 
                    "issock": false, 
                    "isuid": false, 
                    "mimetype": "inode/directory", 
                    "mode": "0755", 
                    "mtime": 1608164176.1907954, 
                    "nlink": 12, 
                    "path": "/home/test_ansible/.local/share/omf", 
                    "pw_name": "test_ansible", 
                    "readable": true, 
                    "rgrp": true, 
                    "roth": true, 
                    "rusr": true, 
                    "size": 4096, 
                    "uid": 1343, 
                    "version": "3120069218", 
                    "wgrp": false, 
                    "woth": false, 
                    "writeable": true, 
                    "wusr": true, 
                    "xgrp": true, 
                    "xoth": true, 
                    "xusr": true
                }
            }
        ]
    }
 

Приветствия

Комментарии:

1.Непонимание того, как .results это работает, похоже, является часто задаваемым вопросом на этой неделе; (a) не сравнивайте логические поля со строкой 'False' (b) вы можете легко получить список соответствующих имен пользователей через with_items: '{{ omf_user_status.results | selectattr("exists") | map(attribute="item") }}'

2. Спасибо за ваш комментарий, Даниэль. Но я не могу заставить его работать с вашей строкой: попытался отобразить список сгенерированных пользователей, но я получил: FAILED! => {"msg": "Invalid data passed to 'loop', it requires a list, got this instead: <generator object do_map at 0x7f3bb44eb5f0> я позвонил с : - name: Display list of users debug: msg: "users: {{ item }}" loop: '{{ omf_user_status.results | selectattr("exists") | map(attribute="item") }}'

3. Извините за это, добавьте | list в конец, чтобы материализовать генератор

4. Спасибо, Даниэль, действительно помог мне

Ответ №1:

Я, наконец, заставляю его работать с этим кодом.

 - name: Register users who need omf
  set_fact:
    list_of_user: "{{ omf_user_status.results | rejectattr('stat.exists') | map(attribute='item') | list }}"
 

Вот полный плейбук

 # OMF install
- name: Read local user database
  getent:
    database: passwd

- name: List local user of fish
  set_fact:
    fish_users: "{{ getent_passwd | dict2items | json_query('[? contains(value, `/usr/bin/fish`)].key') }}"

- name: Check if omf is installed for fish users
  stat:
    path: "/home/{{ item }}/.local/share/omf"
  loop: "{{ fish_users }}"
  register: omf_user_status

- name: Register users who need omf
  set_fact:
    user_need_omf: "{{ omf_user_status.results | rejectattr('stat.exists') | map(attribute='item') | list }}"

- name: Install omf when absent of fish user's home
  block:
  - name: Get lastest omf from git 
    git:
      repo: 'https://github.com/oh-my-fish/oh-my-fish'
      dest: '/tmp/omf'
      clone: yes

  - name: Installing omf for fish user
    become: yes
    become_user: "{{ item }}"
    command: /tmp/omf/bin/install -y --offline --noninteractive
    loop: "{{ user_need_omf }}"

  - name: Cleanup omf install files
    file:
      path: '/tmp/omf'
      state: absent
  # only run this block if the user_need_omf list is not empty
  when: user_need_omf | length > 0