説明
演習問題
Q1. コントロールノードからユーザーアカウントを記録した「 accounts.csv 」ファイルを読み込み、管理対象ノードにユーザーアカウントを作成してください。
-
community.general.read_csv
モジュールを使用します。 - 管理対象ノードにユーザーアカウントを作成する方法は「 変数 」や「 ループ : loop 」を参照してください。
- 「 accounts.csv 」ファイルの内容accounts.csv
name,password taro,password@taro jiro,password@jiro hanako,password@hanako
- インベントリーファイルの内容hosts.yml
--- all: hosts: nijyo:
group_vars/all.yml--- ansible_user: vagrant ansible_password: vagrant
host_vars/nijyo.yml--- ansible_host: 192.168.111.104
community.general.read_csv モジュール
community.general.read_csv
モジュールは CSV ファイルから値を読み込み、変数に設定します。 path
パラメーターで読み込む CSV ファイルを指定し、 register
ディレクティブで読み込んだ値を設定する変数を指定します。
管理対象ノード上の「 sample.csv 」ファイルを読み込み、内容を表示するプレイブックです。
sample.csv
y_mrok@ctrl:~/code/exam7$ ansible nijyo -i hosts.yml -a 'cat ~/sample.csv'
nijyo | CHANGED | rc=0 >>
value,type
abc,str
123,int
3.14,float
true, bool
"1",str
y_mrok@ctrl:~/code/exam7$
hosts.yml
---
all:
hosts:
nijyo:
sample.yml
---
- name: How to use the community.general.read_csv module.
hosts: all
gather_facts: no
tasks:
- name: Import the CSV file.
community.general.read_csv:
path: sample.csv
register: csv_values
- name: Display the loaded content.
ansible.builtin.debug:
var: csv_values
- name: Display the loaded contents individually.
ansible.builtin.debug:
msg: "{{ item['value'] }} -> {{ item['type'] }}"
loop:
"{{ csv_values['list'] }}"
実行ログです。読み込んだ値は変数にマッピングのネストやシーケンスのネストの構造で設定されます。
y_mrok@ctrl:~/code/exam7$ ansible-playbook -i hosts.yml sample.yml
PLAY [How to use the community.general.read_csv module.] *********************************************************************************************
TASK [Import the CSV file.] **************************************************************************************************************************
ok: [nijyo]
TASK [Display the loaded content.] *******************************************************************************************************************
ok: [nijyo] => {
"csv_values": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"dict": {},
"failed": false,
"list": [
{
"type": "str",
"value": "abc"
},
{
"type": "int",
"value": "123"
},
{
"type": "float",
"value": "3.14"
},
{
"type": " bool",
"value": "true"
},
{
"type": "str",
"value": "1"
}
]
}
}
TASK [Display the loaded contents individually.] *****************************************************************************************************
ok: [nijyo] => (item={'value': 'abc', 'type': 'str'}) => {
"msg": "abc -> str"
}
ok: [nijyo] => (item={'value': '123', 'type': 'int'}) => {
"msg": "123 -> int"
}
ok: [nijyo] => (item={'value': '3.14', 'type': 'float'}) => {
"msg": "3.14 -> float"
}
ok: [nijyo] => (item={'value': 'true', 'type': ' bool'}) => {
"msg": "true -> bool"
}
ok: [nijyo] => (item={'value': '1', 'type': 'str'}) => {
"msg": "1 -> str"
}
PLAY RECAP *******************************************************************************************************************************************
nijyo : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
y_mrok@ctrl:~/code/exam7$
解答
create_useraccount.yml
---
- name: User account.
hosts: all
gather_facts: no
tasks:
- name: Load the user account.
community.general.read_csv:
path: accounts.csv
register: accounts
delegate_to: localhost
- name: Create a user account.
ansible.builtin.user:
user: "{{ item['name'] }}"
password: "{{ item['password'] | password_hash('sha512') }}"
loop:
"{{ accounts['list'] }}"
become: yes
y_mrok@ctrl:~/code/chap14$ ansible-playbook -i hosts.yml create_useraccount.yml
PLAY [User account.] *********************************************************************************************************************************
TASK [Load the user account.] ************************************************************************************************************************
ok: [nijyo -> localhost]
TASK [Create a user account.] ************************************************************************************************************************
changed: [nijyo] => (item={'name': 'taro', 'password': 'password@taro'})
changed: [nijyo] => (item={'name': 'jiro', 'password': 'password@jiro'})
changed: [nijyo] => (item={'name': 'hanako', 'password': 'password@hanako'})
PLAY RECAP *******************************************************************************************************************************************
nijyo : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
y_mrok@ctrl:~/code/chap14$
Q2. 実行後、アドホックコマンドで管理対象ノードの「 /etc/passwd 」ファイルと「 /etc/shadow 」ファイルでアカウントが作成されていることを確認してください。
解答
y_mrok@ctrl:~/code/chap14$ ansible nijyo -i hosts.yml -a 'cat /etc/passwd'
nijyo | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin
syslog:x:102:106::/home/syslog:/usr/sbin/nologin
messagebus:x:103:107::/nonexistent:/usr/sbin/nologin
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
lxd:x:105:65534::/var/lib/lxd/:/bin/false
uuidd:x:106:110::/run/uuidd:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
landscape:x:108:112::/var/lib/landscape:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
vagrant:x:1000:1000:,,,:/home/vagrant:/bin/bash
ubuntu:x:1001:1001:Ubuntu:/home/ubuntu:/bin/bash
taro:x:1002:1002::/home/taro:/bin/sh
jiro:x:1003:1003::/home/jiro:/bin/sh
hanako:x:1004:1004::/home/hanako:/bin/sh
y_mrok@ctrl:~/code/chap14$
y_mrok@ctrl:~/code/chap14$ ansible nijyo -i hosts.yml -a 'cat /etc/shadow' -b
nijyo | CHANGED | rc=0 >>
root:*:18866:0:99999:7:::
daemon:*:18866:0:99999:7:::
bin:*:18866:0:99999:7:::
sys:*:18866:0:99999:7:::
sync:*:18866:0:99999:7:::
games:*:18866:0:99999:7:::
man:*:18866:0:99999:7:::
lp:*:18866:0:99999:7:::
mail:*:18866:0:99999:7:::
news:*:18866:0:99999:7:::
uucp:*:18866:0:99999:7:::
proxy:*:18866:0:99999:7:::
www-data:*:18866:0:99999:7:::
backup:*:18866:0:99999:7:::
list:*:18866:0:99999:7:::
irc:*:18866:0:99999:7:::
gnats:*:18866:0:99999:7:::
nobody:*:18866:0:99999:7:::
systemd-network:*:18866:0:99999:7:::
systemd-resolve:*:18866:0:99999:7:::
syslog:*:18866:0:99999:7:::
messagebus:*:18866:0:99999:7:::
_apt:*:18866:0:99999:7:::
lxd:*:18866:0:99999:7:::
uuidd:*:18866:0:99999:7:::
dnsmasq:*:18866:0:99999:7:::
landscape:*:18866:0:99999:7:::
sshd:*:18866:0:99999:7:::
pollinate:*:18866:0:99999:7:::
vagrant:$6$pmXXHnaM$wFVwZzbg/Fv0ZrPpnryK.u3GtF9O9MjGPEdIHLw6TMds2rO30Hllc3EfZkWzPViYxDt4XIkFrflhA/CiCNu8o1:18866:0:99999:7:::
ubuntu:!:18916:0:99999:7:::
taro:$6$6PXNXJ.h80b.KKa7$ZzwAzIBcWeuAlKL794zxCE2DEbmVmrvK0bOxVCxAHCpe1nIBNC8arPcVXwq1uxQtEpVcgU1Vrz/gjYl0oLSZf0:18923:0:99999:7:::
jiro:$6$PC7ew63Y8eOSFHDA$pjvw5c9MqvZyuSWXAty3lHNETxLfbqh5cYT3jxpJRdm5m5Su6DqzVpgLM/G0285TKa.gsMeMOU76HXlAh9Ac2.:18923:0:99999:7:::
hanako:$6$wSyANprJAaMqHYdv$Q34kvV127TgjZxVVpjWpeees1hROvaERIGXmdZOSEKPsWHOapPZK0hvYEKpJqiZCbwu5ZWpO4khx2RXU0Y1F4/:18923:0:99999:7:::
y_mrok@ctrl:~/code/chap14$