Ansible — установите 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, установленный для всех пользователей рыбы. Но я действительно изо всех сил пытаюсь создать пригодный для использования список, чтобы установить omf только для пользователей, у которых его нет.
Очевидно, условие не работает.
omf_user_status
переменная - это словарь, здесь пример содержимого.
"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 ответ
Я, наконец, заставить его работать с этим кодом.
- name: Register users who need omf
set_fact:
list_of_user: "{{ omf_user_status.results | rejectattr('stat.exists') | map(attribute='item') | list }}"
Здесь полный plabook
# 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