ุญู„ ุญู„ู‚ุงุช ุฃู†ุณุจู„

ูŠุบุทูŠ ู‡ุฐุง ุงู„ู…ู†ุดูˆุฑ ูˆุญุฏุงุช ุญู„ู‚ุฉ Ansible ุงู„ุชุงู„ูŠุฉ: with_items ุŒ with_nested ุŒ with_subelements ุŒ with_dict.



ูƒู„ ู‡ุฐู‡ ุงู„ุฃุดูŠุงุก ุงู„ุชูŠ ุชุญุชูˆูŠ ุนู„ู‰ * ุชู… ุฅู‡ู…ุงู„ู‡ุง ุจุงู„ูุนู„ ูˆูŠูˆุตู‰ ุจุงุณุชุฎุฏุงู… ุงู„ุชูƒุฑุงุฑ ุงู„ุญู„ู‚ูŠ.



ู…ุตุฏุฑ



ุฃุญุฏ ุฏูˆุฑูŠุงุชูŠ ููŠ Chromatic ู‡ูˆ ูƒุนุถูˆ ููŠ ูุฑูŠู‚ DevOps. ู…ู† ุจูŠู† ุฃู…ูˆุฑ ุฃุฎุฑู‰ ุŒ ู‡ุฐุง ูŠุดู…ู„ ุงู„ุนู…ู„ ู…ุน ุฎูˆุงุฏู…ู†ุง ูˆุฎูˆุงุฏู… ุนู…ู„ุงุฆู†ุง. ู‡ุฐุง ุŒ ุจุฏูˆุฑู‡ ุŒ ูŠุนู†ูŠ ุฃู†ู†ูŠ ุฃู‚ุถูŠ ุงู„ูƒุซูŠุฑ ู…ู† ุงู„ูˆู‚ุช ููŠ ุงู„ุนู…ู„ ู…ุน Ansible ุŒ ูˆู‡ูŠ ุฃุฏุงุฉ ุดุงุฆุนุฉ ู„ุชูˆููŠุฑ ูˆุชูƒูˆูŠู† ูˆู†ุดุฑ ุงู„ุฎูˆุงุฏู… ูˆุงู„ุชุทุจูŠู‚ุงุช.



ุจุจุณุงุทุฉ ุŒ ูŠู‚ูˆู… ุงู„ุฌู‡ุงุฒ ุงู„ุฐูŠ ูŠู‚ูˆู… ุจุชุดุบูŠู„ Ansible ุจุชุดุบูŠู„ ุงู„ุฃูˆุงู…ุฑ ุนู„ู‰ ุฌู‡ุงุฒ ุขุฎุฑ ุนุจุฑ SSH. ูŠุชู… ุชุญุฏูŠุฏ ู‡ุฐู‡ ุงู„ุฃูˆุงู…ุฑ ุจุดูƒู„ ุฅุนู„ุงู†ูŠ (ุงุฎุชูŠุงุฑูŠ) ุจุงุณุชุฎุฏุงู… ุฃู‚ุณุงู… ุตุบูŠุฑุฉ ู…ู† YAML ุชุณู…ู‰ ุงู„ู…ู‡ุงู…. ุชุณุชุฏุนูŠ TASKS ูˆุญุฏุงุช Ansible ุงู„ู†ู…ุทูŠุฉ ุงู„ุชูŠ ุชุชุฎุตุต ููŠ ุชู†ููŠุฐ ุงู„ุฎูŠุงุฑุงุช ุนู„ู‰ ู…ูƒูˆู†ุงุช ู…ุนูŠู†ุฉ ู…ุซู„ ุงู„ู…ู„ูุงุช ูˆู‚ูˆุงุนุฏ ุงู„ุจูŠุงู†ุงุช ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒ.



ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ุชุณุชุฎุฏู… ุงู„ู…ู‡ู…ุฉ ุงู„ุชุงู„ูŠุฉ ูˆุญุฏุฉ ู…ู„ู ( ูˆุซุงุฆู‚ ุŒ ุฑู…ุฒ ) ู„ุฅู†ุดุงุก ุฏู„ูŠู„ ู…ุนูŠู† ุฅุฐุง ู„ู… ูŠูƒู† ู…ูˆุฌูˆุฏู‹ุง ุจุงู„ูุนู„ ุŒ ูˆุชุนุฏูŠู„ ุณู…ุงุชู‡ ุฅุฐุง ู„ู… ูŠุชู… ุชุนูŠูŠู†ู‡ุง ุจุดูƒู„ ุตุญูŠุญ ุจุงู„ูุนู„:



- file:
    path: /home/jenkins/.ssh
    state: directory
    owner: jenkins
    group: jenkins
    mode: 700


ูŠุชู… ุชุฌู…ูŠุน ุงู„ู…ู‡ุงู… ุงู„ู…ุชุนุฏุฏุฉ ุงู„ู…ุชุนู„ู‚ุฉ ุจู…ู‡ู…ุฉ ูˆุงุญุฏุฉ ููŠ ุฃุฏูˆุงุฑ ุŒ ูˆูŠู…ูƒู† ุชุฌู…ูŠุน ุฃุฏูˆุงุฑ ู…ุชุนุฏุฏุฉ ููŠ ูƒุชูŠุจุงุช ุงู„ู„ุนุจุฉ. ูŠู…ูƒู†ูƒ ุจุนุฏ ุฐู„ูƒ ุงุณุชุฎุฏุงู… ุฏู„ูŠู„ ุงู„ุชุดุบูŠู„ ู„ุฅุฌุฑุงุก ู†ูุณ ุฎุทูˆุงุช ุงู„ุชูƒูˆูŠู† ุจุงู„ุถุจุท ุนู„ู‰ ุฃูŠ ุนุฏุฏ ู…ู† ุงู„ุฎูˆุงุฏู… ููŠ ู†ูุณ ุงู„ูˆู‚ุช.



ู‡ู„ ุฃู†ุณุจู„ ุชุตุฑูŠุญูŠุŸ



TASKS Ansible , , TASKS. , , , . , Ansible Copy, . Ansible , :



- name: Copy SSH config file into Aliceโ€™s .ssh directory.
  copy:
    src: files/config
    dest: /home/alice/.ssh/config
    owner: alice
    group: alice
    mode: 0600


, , bash, scp, chown chmod. Ansible , .



, , โ€” , , .



, Ansible, โ€” TASKS . , Ansible , , โ€” PHP, .



, Ansible. Loops , ยซloops _ + lookup(), ยป. (Lookups) โ€” Ansible, ยซ Ansible ยป, Loops Ansible Github, .



Ansible ยซ ยป, , . Ansible, , , .



Ansible



TASKS, , , , , ( : , , , , !)



:



  1. , : alice, bob, carol dan.



  2. , : .ssh/ loops.



  3. , . , alice :





/home/alice/
โ”œโ”€โ”€ .ssh/
โ”œโ”€โ”€ bob/
โ”œโ”€โ”€ carol/
โ”œโ”€โ”€ dan/
โ””โ”€โ”€ loops/


1. WITH_ITEMS



Ansible , chuck , :



- name: Remove user โ€˜Chuckโ€™ from the system.
  user:
    name: chuck
    state: absent
    remove: yes


โ€” , Chuck Craig โ€” with_items. with_items ( ), ( ):



- name: Remove users โ€˜Chuckโ€™ and โ€˜Craigโ€™ from the system.
  user:
    name: "{{ item }}"
    state: absent
    remove: yes
  with_items:
    - chuck
    - craig


, with_items , alice bob:





users_with_items:
  - name: "alice"
    personal_directories:
      - "bob"
      - "carol"
      - "dan"
  - name: "bob"
    personal_directories:
      - "alice"
      - "carol"
      - "dan"


TASKS


- name: "Loop 1: create users using 'with_items'."
  user:
    name: "{{ item.name }}"
  with_items: "{{ users_with_items }}"


Ansible User users_with_items. , , , , personal_directories ( , personal_directories โ€” ).



Ansible ( Ansible ): TASKS , . , , personal_directories TASKS (. . User, File).



with_items , PHP:



<?php

foreach ($users_with_items as $user) {
  // Do something with $user...
}


, , :



โ€ข item.name .



โ€ข with_items, .



, Ansible item, item.property.





/home/
โ”œโ”€โ”€ alice/
โ””โ”€โ”€ bob/


2: , WITH_NESTED



: 2 , 1. chown failed: failed to look up user



, users_with_items 1, , common_directories, , . , ( PHP), -, :



<?php

foreach ($users_with_items as $user) {
  foreach ($common_directories as $directory) {
    // Create $directory for $user...
  }
}


Ansible with_nested. with_nested , :





users_with_items:
  - name: "alice"
    personal_directories:
      - "bob"
      - "carol"
      - "dan"
  - name: "bob"
    personal_directories:
      - "alice"
      - "carol"
      - "dan"

common_directories:
  - ".ssh"
  - "loops


TASKS


# Note that this does not set correct permissions on /home/{{ item.x.name }}/.ssh!
- name: "Loop 2: create common users' directories using 'with_nested'."
  file:
    dest: "/home/{{ item.0.name }}/{{ item.1 }}"
    owner: "{{ item.0.name }}"
    group: "{{ item.0.name }}"
    state: directory
  with_nested:
    - "{{ users_with_items }}"
    - "{{ common_directories }}"


, with_nested , item.0 ( users_with_items) item.1 ( common_directories) . , , /home/alice/.ssh .





/home/
โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ””โ”€โ”€ loops/
โ””โ”€โ”€ bob/
    โ”œโ”€โ”€ .ssh/
    โ””โ”€โ”€ loops/


3: , WITH_SUBELEMENTS



: 3 , 1. chown failed: failed to look up user



with_subelements , users_with_items 1. PHP :



<?php

foreach ($users_with_items as $user) {
  foreach ($user['personal_directories'] as $directory) {
    // Create $directory for $user...
  }
}


, $users_with_items $user['personal_directories'] .





users_with_items:
  - name: "alice"
    personal_directories:
      - "bob"
      - "carol"
      - "dan"
  - name: "bob"
    personal_directories:
      - "alice"
      - "carol"
      - "dan"


TASKS


- name: "Loop 3: create personal users' directories using 'with_subelements'."
  file:
    dest: "/home/{{ item.0.name }}/{{ item.1 }}"
    owner: "{{ item.0.name }}"
    group: "{{ item.0.name }}"
    state: directory
  with_subelements:
    - "{{ users_with_items }}"
    - personal_directories


with_subelements , with_nested, , , โ€” personal_directories. 2, ( ) /home/alice/bob.





/home/
โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ”œโ”€โ”€ bob/
โ”‚   โ”œโ”€โ”€ carol/
โ”‚   โ”œโ”€โ”€ dan/
โ”‚   โ””โ”€โ”€ loops/
โ””โ”€โ”€ bob/
    โ”œโ”€โ”€ .ssh/
    โ”œโ”€โ”€ alice/
    โ”œโ”€โ”€ carol/
    โ”œโ”€โ”€ dan/
    โ””โ”€โ”€ loops/


4: WITH_DICT



3 , alice bob, , , carol dan. users_with_dict Ansible with_dict.



, (dict dictionary โ€” Python ); with_dict , . , Ansible, PHP :



<?php

foreach ($users_with_dict as $user => $properties) {
  // Create a user named $user...
}




users_with_dict:
  carol:
    common_directories: "{{ common_directories }}"
  dan:
    common_directories: "{{ common_directories }}"


TASKS


- name: "Loop 4: create users using 'with_dict'."
  user:
    name: "{{ item.key }}"
  with_dict: "{{ users_with_dict }}"


with_dict . , , , dict with_dict (, , with_dict ).





/home/
โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ”œโ”€โ”€ bob/
โ”‚   โ”œโ”€โ”€ carol/
โ”‚   โ”œโ”€โ”€ dan/
โ”‚   โ””โ”€โ”€ loops/
โ”œโ”€โ”€ bob/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ carol/
โ”‚   โ”œโ”€โ”€ dan/
โ”‚   โ””โ”€โ”€ loops/
โ”œโ”€โ”€ carol/
โ””โ”€โ”€ dan/


5: ,



users_with_dict, Ansible, -. alice, bob, carol dan, with_nested /home/. , , , TASKS:



  • Ansible

    • Ansible
    • Jinja2 ()
    • Jinja2 ()




common_directories:
  - ".ssh"
  - "loops"


TASKS


- name: "Get list of extant users."
  shell: "find * -type d -prune | sort"
  args:
    chdir: "/home"
  register: "home_directories"
  changed_when: false

- name: "Loop 5: create personal user directories if they don't exist."
  file:
    dest: "/home/{{ item.0 }}/{{ item.1 }}"
    owner: "{{ item.0 }}"
    group: "{{ item.0 }}"
    state: directory
  with_nested:
    - "{{ home_directories.stdout_lines }}"
    - "{{ home_directories.stdout_lines | union(common_directories) }}"
  when: "'{{ item.0 }}' != '{{ item.1 }}'"


TASKS: shell find , file .



/home find \ -type d -prune | sort ( shell) , /home, , , .



home_directories register: "home_directories" . , , :



"stdout_lines": [
  "alice",
  "bob",
  "carol",
  "dan",
],


( ) with_nested , :



  1. with_nested :


- "{{ home_directories.stdout_lines | union(common_directories) }}"


  1. , when TASKS:



    when: "'{{ item.0 }}' != '{{ item.1 }}'"




. with_nested Jinja2 TASKS ( home_directories.stdout_lines). Jinja:



  • (home_directories.stdout_lines)
  • (|)
  • , (union (common_directories))


, home_directories.stdout_lines common_directories :



item:
  - .ssh
  - alice
  - bob
  - carol
  - dan
  - loops


, with_nested home_directories.stdout_lines ( with_nested) , .



, โ€” , , , ! (, /home/alice/alice, /home/bob/bob . .) Ansible โ€” when โ€” :



when: "'{{ item.0 }}' != '{{ item.1 }}'"


, home_directories.stdout_lines home_directories.stdout_lines ( Ansible Loops, ยซโ€ฆ when with_items ( ), when ยป). PHP , , :



<?php

$users = ['alice', 'bob', 'carol', 'dan'];
$common_directories = ['.ssh', 'loops'];
$directories = $user + $common_directories;

foreach ($users as $user) {
  foreach ($directories as $directory) {
    if ($directory != $user) {
      // Create the directoryโ€ฆ
    }
  }
}


, , .





/home/
โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ”œโ”€โ”€ bob/
โ”‚   โ”œโ”€โ”€ carol/
โ”‚   โ”œโ”€โ”€ dan/
โ”‚   โ””โ”€โ”€ loops/
โ”œโ”€โ”€ bob/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ carol/
โ”‚   โ”œโ”€โ”€ dan/
โ”‚   โ””โ”€โ”€ loops/
โ”œโ”€โ”€ carol/
โ”‚   โ”œโ”€โ”€ .ssh/
โ”‚   โ”œโ”€โ”€ alice/
โ”‚   โ”œโ”€โ”€ bob/
โ”‚   โ”œโ”€โ”€ dan/
โ”‚   โ””โ”€โ”€ loops/
โ””โ”€โ”€ dan/
    โ”œโ”€โ”€ .ssh/
    โ”œโ”€โ”€ alice/
    โ”œโ”€โ”€ bob/
    โ”œโ”€โ”€ carol/
    โ””โ”€โ”€ loops/




Ansible . ( Ansible), , (with_nested? with_subitems?) .



, , TASKS, ( , array_filter, array_reduce, array_map , ). , , โ€” โ€” .



ุขู…ู„ ุฃู† ูŠุณุงุนุฏูƒ ู‡ุฐุง ุงู„ู…ู†ุดูˆุฑ ููŠ ุงู„ุฎุฑูˆุฌ ู…ู† ุงู„ุตุนูˆุจุฉ ุงู„ุฃูˆู„ูŠุฉ. ุชุญู‚ูŠู‚ุง ู„ู‡ุฐู‡ ุงู„ุบุงูŠุฉ ุŒ ู‚ู…ุช ุจุจู†ุงุก ุฌู‡ุงุฒ Vagrant ุงู„ุธุงู‡ุฑูŠ (ูŠุฏุนู… Vagrant ููŠ ุงู„ุฃุตู„ ุงุณุชุฎุฏุงู… Ansible ู„ู„ุชุฒูˆูŠุฏ) ูˆูƒุชูŠุจ ู„ุนุจ Ansible ุงู„ุฐูŠ ุงุณุชุฎุฏู…ุชู‡ ู„ุฅู†ุดุงุก ูˆุงุฎุชุจุงุฑ ู‡ุฐู‡ ุงู„ุฃู…ุซู„ุฉ). ู…ุง ุนู„ูŠูƒ ุณูˆู‰ ุงุชุจุงุน ุงู„ุชุนู„ูŠู…ุงุช ุงู„ู…ูˆุฌูˆุฏุฉ ููŠ README ู„ุชุดุบูŠู„ ุงู„ุฃู…ุซู„ุฉ ู…ู† ู‡ุฐุง ุงู„ู…ู†ุดูˆุฑ ุฃูˆ ุชุฌุฑุจุฉ ุงู„ู†ู…ูˆุฐุฌ ุงู„ุฎุงุต ุจูƒ. ุฅุฐุง ูƒุงู† ู„ุฏูŠูƒ ุฃูŠ ุฃุณุฆู„ุฉ ุฃูˆ ุชุนู„ูŠู‚ุงุช ุŒ ูŠุฑุฌู‰ ุงู„ุชุบุฑูŠุฏ ุนู„ู‰chromaticHQ!




All Articles