ูุบุทู ูุฐุง ุงูู ูุดูุฑ ูุญุฏุงุช ุญููุฉ 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, , , , , ( : , , , , !)
:
, :
alice,bob,caroldan.
, :
.ssh/loops.
, . , 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 , :
-
with_nested:
- "{{ home_directories.stdout_lines | union(common_directories) }}"
,
whenTASKS:
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!