B-2-5.lineinfileモジュールの動作確認

↓下記URLをなぞってみた

B-2-5-1.最下行に一行追記する

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_1.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/sudoers
        line: 'puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow'

...

[puni@centos7_2 ~]$ whoami
puni

[puni@centos7_2 ~]$ sudo /usr/sbin/fdisk -l | head
あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:
    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。
[sudo] puni のパスワード:

[puni@centos7_2 ~]$ sudo /bin/cat /etc/shadow | head
あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:
    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。
[sudo] puni のパスワード:

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_1.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
changed: [192.168.100.72]

PLAY RECAP **************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# diff /etc/sudoers{.org,}
121a122
> puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow

→/etc/sudoersに追記できた。

[root@centos7_2 etc]# su - puni

最終ログイン: 2022/06/15 (水) 03:15:29 JST日時 pts/1
[puni@centos7_2 ~]$ whoami
puni

[puni@centos7_2 ~]$ sudo /usr/sbin/fdisk -l | head
Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000bcb8c

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     2099199     1048576   83  Linux

[puni@centos7_2 ~]$ sudo /bin/cat /etc/shadow | head
root:$6$Ge8f21M1$223SXP0qZWygG3RsMNtTMR99dNSGCEbYZ8.yw8sfjLEzTfEBnMzxipCY.RdkqBB6KJFxCubw1w4iyG5XvZOlL/:19157:0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
shutdown:*:18353:0:99999:7:::
halt:*:18353:0:99999:7:::
mail:*:18353:0:99999:7:::
operator:*:18353:0:99999:7:::

→puniユーザからパスワードなしでroot権限のコマンドを実行できた

 

そもそも/etc/sudoersの編集はvisudo使わないとあかんかったwww

※sudoersファイルはviではなくvisudoで編集することが推奨されている。visudo は複数同時の編集に対して sudoers ファイルをロックし、基本的な文法エラーやパースエラーをチェックしてくれる。sudoers ファイルが現在すでに編集中であった場合、 ``try again later'' というメッセージが出されるなどのメリットがある。

→上記のメリットの享受を放棄すればsudoersをviで編集してもいいみたい。

 

B-2-5-2.単純に行置換する

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_2.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/hosts

        regexp: '^127.0.0.1'
        line: '127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 centos7_1'

...

[root@centos7_2 etc]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
 ←この行を置換する
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.72  centos7_2
192.168.100.71  centos7_1

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_2.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
changed: [192.168.100.72]

PLAY RECAP **************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 etc]# egrep '^127.0.0.1' /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 centos7_1

→正規表現にマッチした行が置換された。

 

B-2-5-2-1.正規表現で複数行がマッチした場合の置換

※regexpオプションはマッチする行が複数ある場合、最後にマッチした行が対象になる。

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_2_1.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /tmp/ansible_test/test.txt
        regexp: '^aaaa'
        line: 'AAAA'

...

[root@centos7_2 ansible_test]# cat /tmp/ansible_test/test.txt
aaaa   ←この行を置換する
bbbb
cccc
aaaa   ←この行を置換する
dddd

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_2_1.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
changed: [192.168.100.72]

PLAY RECAP **************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# cat /tmp/ansible_test/test.txt
aaaa   ←この行は置換されなかった!
bbbb
cccc
AAAA   ←この行は置換された
dddd

→regexpオプションではマッチする行が複数あった場合、最後にマッチした行が対象になった。

 

B-2-5-3.行を削除する

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_3.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /tmp/ansible_test/test.txt
        state: absent
        regexp: '^AAAA'
...

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_3.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
changed: [192.168.100.72]

PLAY RECAP **************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# cat /tmp/ansible_test/test.txt
aaaa
bbbb
cccc
dddd

→「AAAA」の行が削除された。

 

B-2-5-4.マッチしなかった場合に挿入したい箇所を指定して挿入する
 

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_4.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/sudoers
        regexp: '^puni'
        insertafter: '^root'
        line: 'puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow'
...

※「regexp」にマッチする行が存在しなかった場合、「insertafter」にマッチした次の行に「line」で指定した行を挿入する。

 

[root@centos7_2 ansible_test]# egrep '^puni' /etc/sudoers;echo $?
1

→/etc/sudoersには「puni」で始まる行が存在しない。

[root@centos7_2 ansible_test]# egrep '^root' -A 2 /etc/sudoers
root    ALL=(ALL)       ALL
server_user     ALL=NOPASSWD: ALL

→/etc/sudoersには「root」で始まる行が存在し、その次の行は「server_user」で始まる行。

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_4.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
changed: [192.168.100.72]

PLAY RECAP **************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# egrep '^root' -A 2 /etc/sudoers
root    ALL=(ALL)       ALL
puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow
server_user     ALL=NOPASSWD: ALL

「root」で始まる行と「server_user」で始まる行の間に「puni」で始まる行が挿入された。

 

B-2-5-5.正しく編集が行われるかを事前に検証する

visudo -cf コマンドで/etc/sudoersファイルの構文チェックを行える。

[root@centos7_2 ansible_test]# /usr/sbin/visudo -cf /etc/sudoers
/etc/sudoers: 正しく構文解析されました

下記のようにlineinfileモジュールの「validate」オプションで編集後のファイルの検証を行える。

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_5.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/sudoers
        regexp: '^puni'
        insertafter: '^root'
        line: 'puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow'
        validate: '/usr/sbin/visudo -cf %s'
...

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_5.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
ok: [192.168.100.72]

PLAY RECAP **************************************************************
192.168.100.72             : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

・あえて間違った構文でlineinfileモジュールを実行してみる。

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_E5.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/sudoers
        regexp: '^puni'
        insertafter: '^root'
        line: 'puni ALL=(root) NOPASSWORD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow'
        validate: '/usr/sbin/visudo -cf %s'
...

→「NOPASSWD」を間違ったオプションである「NOPASSWORD」に変更する。

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_E5.yml

PLAY [centos72] **************************************************************

TASK [Gathering Facts] **************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **************************************************************
fatal: [192.168.100.72]: FAILED! => {"changed": false, "msg": "failed to validate: rc:1 error:>>> /tmp/tmpHbZ2Ql: 構文エラー near line 101 <<<\n"}

PLAY RECAP **************************************************************
192.168.100.72             : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# egrep '^puni' /etc/sudoers
puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow

→変更されなかった

 

B-2-5-6.チェックモードであらかじめ編集前後の diff を確認する

ansible-playbook コマンドの --check--diff オプションを一緒に利用すると、実際はファイルの内容を編集せずに、あらかじめ編集前後の diff を確認できる。

--checkオプション

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_E5.yml --check

PLAY [centos72] **********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] **********************************************************************************************************
changed: [192.168.100.72]

PLAY RECAP **********************************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# egrep '^puni' /etc/sudoers
puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow

→実際は変更されなてない

・--diff オプション

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_E5x.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/sudoers
        regexp: '^puni'
        insertafter: '^root'
        line: 'puni ALL=(root) NOPASSWORD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow'
#        validate: '/usr/sbin/visudo -cf %s'          ←注釈化する
...

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_E5x.yml --diff

PLAY [centos72] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] *****************************************************************************************
--- before: /etc/sudoers (content)
+++ after: /etc/sudoers (content)

@@ -98,7 +98,7 @@
 ##
 ## Allow root to run any commands anywhere
 root   ALL=(ALL)       ALL
-puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow
+puni ALL=(root) NOPASSWORD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow 
          ←変更された。
 server_user    ALL=NOPASSWD: ALL

 ## Allows members of the 'sys' group to run networking, software,

changed: [192.168.100.72]

PLAY RECAP *****************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# egrep '^puni' /etc/sudoers
puni ALL=(root) NOPASSWORD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow               ←変更された。

・validate、--check オプション、--diff オプションをすべてつけて実行

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_5_S5.yml
---
 - hosts: centos72
   tasks:
   - name: lineinfile module
     lineinfile:
        path: /etc/sudoers
        regexp: '^puni'
        insertafter: '^root'
        line: 'puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow'
        validate: '/usr/sbin/visudo -cf %s'
...

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_5_S5.yml --diff --check

PLAY [centos72] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.100.72]

TASK [lineinfile module] *****************************************************************************************
--- before: /etc/sudoers (content)
+++ after: /etc/sudoers (content)

@@ -98,7 +98,7 @@
 ##
 ## Allow root to run any commands anywhere
 root   ALL=(ALL)       ALL
-puni ALL=(root) NOPASSWORD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow
+puni ALL=(root) NOPASSWD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow  
 ←変更されたことになっている
 server_user    ALL=NOPASSWD: ALL

 ## Allows members of the 'sys' group to run networking, software,

changed: [192.168.100.72]

PLAY RECAP *****************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# egrep '^puni' /etc/sudoers
puni ALL=(root) NOPASSWORD: /usr/sbin/fdisk -l,/bin/cat /etc/shadow  ←実際には変更されてない

 

→現状は構文エラー(NOPASSWORD)でも「--check」オプションで変更がかかった見なし状態でvalidateされるので構文エラーは出力されない。一方、--diffオプションでは変更がかかった見なし状態とbefore状態との差分が出力される。

 

 

B-2-6.authorized_keyモジュールの動作確認

[やること]

・centos7_2上の「puni」ユーザのauthorized_keysにcentos7_1上の「client_user」ユーザの公開鍵を追記する。

[root@cetnos7_1 ansible_test]# cat playbook_B_2_6.yml
---
- hosts: centos72
  tasks:
    - name: 公開鍵を登録する
      authorized_key:
        user: puni
        state: present
        key: "{{ lookup('file', '/home/client_user/.ssh/RSA_2048_centos7.dagyah.com_dagyah2.pub') }}"

...

[root@cetnos7_1 ansible_test]# ll /home/client_user/.ssh/
合計 12
-rw-------. 1 client_user client_user 1675  6月  7 17:57 RSA_2048_centos7.dagyah.com_dagyah2
-rw-r--r--. 1 client_user client_user  408  6月  7 17:57 RSA_2048_centos7.dagyah.com_dagyah2.pub
-rw-r--r--. 1 client_user client_user  347  6月  8 14:07 known_hosts

→上記の公開鍵を配布する。

[root@centos7_2 ansible_test]# ls -lA /home/puni
合計 16
-rw-------. 1 puni puni 607  6月 15 03:59 .bash_history
-rw-r--r--. 1 puni puni  18 11月 25  2021 .bash_logout
-rw-r--r--. 1 puni puni 193 11月 25  2021 .bash_profile
-rw-r--r--. 1 puni puni 231 11月 25  2021 .bashrc

→.sshディレクトリ無し。

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_6.yml

PLAY [centos72] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.100.72]

TASK [公開鍵を登録する] *****************************************************************************************
changed: [192.168.100.72]

PLAY RECAP *****************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# ls -ld /home/puni/.ssh
drwx------. 2 puni puni 29  6月 15 07:48 /home/puni/.ssh

[root@centos7_2 ansible_test]# ls -lA /home/puni/.ssh
合計 4
-rw-------. 1 puni puni 408  6月 15 07:48 authorized_keys

・配布した公開鍵のフィンガープリントの確認

[client_user@cetnos7_1 ansible_test]$ ssh-keygen -l -f /home/client_user/.ssh/RSA_2048_centos7.dagyah.com_dagyah2.pub
2048 SHA256:KQHRNV5grVyz7uzMnJTLKHYIReclxVMHT0M328v1cFo dagyah2@centos7.dagyah.com (RSA)

[root@centos7_2 ansible_test]# ssh-keygen -l -f /home/puni/.ssh/authorized_keys
2048 SHA256:KQHRNV5grVyz7uzMnJTLKHYIReclxVMHT0M328v1cFo dagyah2@centos7.dagyah.com (RSA)

 

 

B-2-7.shellモジュールの動作確認

・shellモジュールとcommandモジュールの問題点とエラーハンドリング

 

 

・shellモジュールとcommandモジュールの違い

 

 

B-2-7-1.いろいろなコマンドを実行する

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_7_1.yml
---
- hosts: centos72
  vars:
      OUTPUT: "/tmp/ansible_test/somelog.txt"
  tasks:
    - name:  いろいろなコマンドを実行する
      shell: |
        date >> "{{ OUTPUT }}"
        { hostname;whoami;pwd; } >> "{{ OUTPUT }}"
        systemctl is-enabled NetworkManager >> "{{ OUTPUT }}"
        getenforce >> "{{ OUTPUT }}"
        S=0;for X in `seq 1 10`;do S=$((X))+$((S));done;echo $((S)) >> "{{ OUTPUT }}"

        echo ---ENV--- >> "{{ OUTPUT }}"
        env >> "{{ OUTPUT }}"

        su puni -c "{ echo >> /tmp/puni.txt; }"
...

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_7_1.yml

PLAY [centos72] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.100.72]

TASK [いろいろなコマンドを実行する] *****************************************************************************************
changed: [192.168.100.72]

PLAY RECAP *****************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# cat /tmp/ansible_test/somelog.txt
2022年  6月 15日 水曜日 09:48:29 JST
centos7_2
root
/root
enabled
Enforcing
55
---ENV---
XDG_SESSION_ID=73
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=192.168.100.71 56932 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
PWD=/root
LANG=ja_JP.UTF-8
SELINUX_LEVEL_REQUESTED=
SHLVL=3
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.100.71 56932 192.168.100.72 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

[root@centos7_2 ansible_test]# ll /tmp/puni.txt
-rw-r--r--. 1 puni puni 1  6月 15 10:13 /tmp/puni.txt

 

B-2-7-2.cmdオプション

コマンドからスペース、改行を維持したまま実行したい場合はcmdオプションを使用する。

 

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_7_2.yml
---
- hosts: centos72
  tasks:
    - name: shell module + cmd args
      shell: |
        cmd: |
          cat <<EOF > /tmp/ansible_test/cmd.txt
          aaa
            bbb
          ccc
          EOF
...

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_7_2.yml

PLAY [centos72] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.100.72]

TASK [shell module + cmd args] *****************************************************************************************
changed: [192.168.100.72]

PLAY RECAP *****************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# cat /tmp/ansible_test/cmd.txt
  aaa
    bbb
  ccc
  EOF

 

B-2-8.commandモジュールの動作確認

[client_user@cetnos7_1 ansible_test]$ cat playbook_B_2_8_1.yml
---
- hosts: centos72
  tasks:
    - name: commandモジュール
      command:
         cmd: 'chage -M 99997 puni'

...

[root@centos7_2 ansible_test]# chage -l puni
最終パスワード変更日                            : 6月 14, 2022
パスワード期限:                                 : なし
パスワード無効化中                                      : なし
アカウント期限切れ                                              : なし
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 99999     ←ここを「99997」に変更する
パスワード期限が切れる前に警告される日数                : 7

[client_user@cetnos7_1 ansible_test]$ ansible-playbook -u root -i inventory.ini playbook_B_2_8_1.yml

PLAY [centos72] *****************************************************************************************

TASK [Gathering Facts] *****************************************************************************************
ok: [192.168.100.72]

TASK [commandモジュール] *****************************************************************************************
changed: [192.168.100.72]

PLAY RECAP *****************************************************************************************
192.168.100.72             : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@centos7_2 ansible_test]# chage -l puni
----(略)----
パスワードを変更しなくてよい最長日数            : 99997
----(略)----

→変更された

 

 

参考にしたサイト

 

手順1】 rubyのインストール

 

[root@cetnos7_1 ansible_test]# yum install ruby
----(略)----
インストール:
  ruby.x86_64 0:2.0.0.648-39.el7_9                    ←Ver.2.0(後で判明するように古すぎた)

依存性関連をインストールしました:
  ruby-irb.noarch 0:2.0.0.648-39.el7_9       ruby-libs.x86_64 0:2.0.0.648-39.el7_9      

 rubygem-bigdecimal.x86_64 0:1.2.0-39.el7_9       rubygem-io-console.x86_64 0:0.4.2-39.el7_9
  rubygem-json.x86_64 0:1.7.7-39.el7_9       rubygem-psych.x86_64 0:2.0.0-39.el7_9    

   rubygem-rdoc.noarch 0:4.0.0-39.el7_9             rubygems.noarch 0:2.0.14.1-39.el7_9

完了しました!

 

【手順2】 serverspecのインストール

[root@cetnos7_1 ansible_test]# gem install serverspec rake highline -V
GET https://rubygems.org/latest_specs.4.8.gz
200 OK
GET https://rubygems.org/quick/Marshal.4.8/serverspec-2.42.0.gemspec.rz
200 OK
----(略)----
/usr/local/share/gems/gems/multi_json-1.15.0/lib/multi_json/parse_error.rb
/usr/local/share/gems/gems/multi_json-1.15.0/lib/multi_json/vendor/okjson.rb
/usr/local/share/gems/gems/multi_json-1.15.0/lib/multi_json/version.rb
Successfully installed multi_json-1.15.0
Installing gem net-ssh-6.1.0
Downloading gem net-ssh-6.1.0.gem
GET https://rubygems.org/gems/net-ssh-6.1.0.gem
Fetching: net-ssh-6.1.0.gem (100%)
200 OK
ERROR:  Error installing serverspec:
        net-ssh requires Ruby version >= 2.3.

GET https://rubygems.org/quick/Marshal.4.8/rake-13.0.6.gemspec.rz
200 OK
Installing gem rake-13.0.6
Downloading gem rake-13.0.6.gem
GET https://rubygems.org/gems/rake-13.0.6.gem
Fetching: rake-13.0.6.gem (100%)
200 OK
ERROR:  Error installing rake:
        rake requires Ruby version >= 2.2.

GET https://rubygems.org/quick/Marshal.4.8/highline-2.0.3.gemspec.rz
200 OK
Installing gem highline-2.0.3
Downloading gem highline-2.0.3.gem
GET https://rubygems.org/gems/highline-2.0.3.gem
Fetching: highline-2.0.3.gem (100%)
200 OK
----(略)----
/usr/local/share/gems/gems/highline-2.0.3/site/highline.css
/usr/local/share/gems/gems/highline-2.0.3/site/images/logo.png
/usr/local/share/gems/gems/highline-2.0.3/site/index.html
Successfully installed highline-2.0.3
Parsing documentation for highline-2.0.3
Parsing sources...
100% [31/31]  lib/highline/wrapper.rb
Installing ri documentation for highline-2.0.3
1 gem installed

 

→CentOS7版rubyのバージョンが古すぎてserverspecのインストール失敗w

 

↓こっちのブログでcentos7にruby2.5をインストールしている。

 

 

■gitインストール

[root@cetnos7_1 ~]# yum install git

----(略)----

[root@cetnos7_1 ~]# git --version
git version 1.8.3.1

 

■rbenvインストール

[root@cetnos7_1 ~]# git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/root/.rbenv'...
remote: Enumerating objects: 3013, done.
remote: Counting objects: 100% (117/117), done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 3013 (delta 62), reused 91 (delta 51), pack-reused 2896
Receiving objects: 100% (3013/3013), 606.48 KiB | 134.00 KiB/s, done.
Resolving deltas: 100% (1871/1871), done.

[root@cetnos7_1 ~]# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[root@cetnos7_1 ~]# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[root@cetnos7_1 ~]# source ~/.bash_profile
[root@cetnos7_1 ~]# rbenv -v

rbenv 1.2.0-14-gc6cc0a1

 

■ruby-buildのインストール

[root@cetnos7_1 ~]# git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/root/.rbenv/plugins/ruby-build'...
remote: Enumerating objects: 12227, done.
remote: Counting objects: 100% (920/920), done.
remote: Compressing objects: 100% (317/317), done.
remote: Total 12227 (delta 624), reused 801 (delta 543), pack-reused 11307
Receiving objects: 100% (12227/12227), 2.55 MiB | 114.00 KiB/s, done.
Resolving deltas: 100% (8091/8091), done.

[root@cetnos7_1 ~]# ~/.rbenv/plugins/ruby-build/install.sh;echo $?
0

[root@cetnos7_1 ~]# rbenv install -l
2.6.10
2.7.6
3.0.4
3.1.2
jruby-9.3.4.0
mruby-3.0.0
rbx-5.0
truffleruby-22.1.0
truffleruby+graalvm-22.1.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.

 

■rubyに必要な物のインストール

[root@cetnos7_1 ~]# yum install -y bzip2 gcc openssl-devel readline-devel zlib-devel

----(略)----

 

■ruby2.6.10インストール

[root@cetnos7_1 ~]# rbenv install 2.6.10
Downloading ruby-2.6.10.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.10.tar.bz2

Installing ruby-2.6.10...

Installed ruby-2.6.10 to /root/.rbenv/versions/2.6.10

[root@cetnos7_1 ~]# ruby --version
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

[root@cetnos7_1 ~]# rpm -ql ruby
/usr/bin/erb
/usr/bin/ruby
/usr/bin/testrb
/usr/share/doc/ruby-2.0.0.648
/usr/share/doc/ruby-2.0.0.648/COPYING
/usr/share/doc/ruby-2.0.0.648/COPYING.ja
/usr/share/doc/ruby-2.0.0.648/GPL
/usr/share/doc/ruby-2.0.0.648/LEGAL
/usr/share/man/man1/erb.1.gz
/usr/share/man/man1/ruby.1.gz

とりあえずCentOS7版rubyはアンインストールしとこう

[root@cetnos7_1 ~]# yum erase ruby

----(略)----

[root@cetnos7_1 ~]# ruby -v
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
  2.6.10

→だめかw 強引に上書きインストールしてみるw

[root@cetnos7_1 ~]# rbenv install 2.6.10
rbenv: /root/.rbenv/versions/2.6.10 already exists
continue with installation? (y/N)
y
Downloading ruby-2.6.10.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.10.tar.bz2

Installing ruby-2.6.10...
Installed ruby-2.6.10 to /root/.rbenv/versions/2.6.10

[root@cetnos7_1 ~]# ruby -v
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
  2.6.10

[root@cetnos7_1 ~]# rbenv global 2.6.10;echo $?
0

[root@cetnos7_1 ~]# ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [x86_64-linux]

→なんかうまくいった臭いw

 

もう一回serverspecのインストールを試みる

 

[root@cetnos7_1 ~]# gem install serverspec rake highline

ERROR:  Could not find a valid gem 'serverspec' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - timed out (https://rubygems.org/specs.4.8.gz)
ERROR:  Could not find a valid gem 'rake' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - timed out (https://rubygems.org/specs.4.8.gz)
ERROR:  Could not find a valid gem 'highline' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - timed out (https://rubygems.org/specs.4.8.gz)

→なんでや?

CentOS7版rubyと一緒にインストールされたgemならダウンロードまではできてたのに・・・

[root@cetnos7_1 ~]# which gem
/root/.rbenv/shims/gem

→とりあえずgemをアップデートするといいらしいのでやってみた

[root@cetnos7_1 ~]# gem update --system
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    timed out (https://rubygems.org/specs.4.8.gz)

→なんやねん

↓こちらのブログが神だった。

 

https://api.rubygems.org/specs.4.8.gz のURLに接続しようとしたときにIPv6でつなぎに行ったりプロキシを介してるとつながらなくらしい。

wgetコマンドは接続に失敗した場合に、自動でリダイレクトをかけて接続できるホストを再帰的に探してくれるらしい。

[root@cetnos7_1 ~]# wget https://api.rubygems.org/specs.4.8.gz
--2022-06-14 20:34:30--  https://api.rubygems.org/specs.4.8.gz
api.rubygems.org (api.rubygems.org) をDNSに問いあわせています... 2a04:4e42:400::483, 2a04:4e42:600::483, 2a04:4e42::483, ...
api.rubygems.org (api.rubygems.org)|2a04:4e42:400::483|:443 に接続しています... 失敗しました: 接続がタイムアウトしました.
api.rubygems.org (api.rubygems.org)|2a04:4e42:600::483|:443 に接続しています... 失敗しました: 接続がタイムアウトしました.
api.rubygems.org (api.rubygems.org)|2a04:4e42::483|:443 に接続しています... 失敗しました: 接続がタイムアウトしました.
api.rubygems.org (api.rubygems.org)|2a04:4e42:200::483|:443 に接続しています... 失敗しました: 接続がタイムアウトしました.
api.rubygems.org (api.rubygems.org)|151.101.193.227|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 4703716 (4.5M) [binary/octet-stream]
`specs.4.8.gz' に保存中

100%[==========================================>] 4,703,716    112KB/s 時間 39s

2022-06-14 20:43:39 (118 KB/s) - `specs.4.8.gz' へ保存完了 [4703716/4703716]

すごい!

ていうか俺のgemがつなぎに移行としてるのは「api.rubygems.org」じゃなくて「rubygems.org」だったw

あとwgetしたんでダウンロードしたもんはとりあえず削除しとく。

 

[root@cetnos7_1 ~]# nslookup -type=AAA rubygems.org
unknown query type: AAA
Server:         192.168.100.1
Address:        192.168.100.1#53

Non-authoritative answer:
Name:   rubygems.org
Address: 151.101.193.227         ←ていうか結局同じIPアドレスが解決されたダニ
Name:   rubygems.org
Address: 151.101.129.227
Name:   rubygems.org
Address: 151.101.1.227
Name:   rubygems.org
Address: 151.101.65.227
Name:   rubygems.org
Address: 2a04:4e42:600::483
Name:   rubygems.org
Address: 2a04:4e42:200::483
Name:   rubygems.org
Address: 2a04:4e42::483
Name:   rubygems.org
Address: 2a04:4e42:400::483

早速小細工して

[root@cetnos7_1 ~]# tail -1 /etc/hosts
151.101.193.227  rubygems.org

再挑戦

[root@cetnos7_1 ~]# gem install serverspec rake highline -V
HEAD https://rubygems.org/api/v1/dependencies
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=serverspec
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=multi_json,rspec,rspec-its,specinfra
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=net-scp,net-ssh,net-telnet,sfl
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=rspec-core,rspec-expectations,rspec-mocks
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=rspec-support
200 OK
GET https://rubygems.org/api/v1/dependencies?gems=diff-lcs
200 OK
Downloading gem rspec-support-3.11.0.gem
GET https://rubygems.org/gems/rspec-support-3.11.0.gem
Downloading gem rspec-core-3.11.0.gem
Downloading gem diff-lcs-1.5.0.gem
Downloading gem rspec-expectations-3.11.0.gem
Downloading gem rspec-mocks-3.11.1.gem
Downloading gem rspec-3.11.0.gem
Downloading gem rspec-its-1.3.0.gem
Downloading gem multi_json-1.15.0.gem
Fetching rspec-support-3.11.0.gem
200 OK
GET https://rubygems.org/gems/rspec-core-3.11.0.gem
Downloading gem net-ssh-6.1.0.gem
Fetching rspec-core-3.11.0.gem
200 OK
GET https://rubygems.org/gems/diff-lcs-1.5.0.gem
Downloading gem net-scp-3.0.0.gem
Fetching diff-lcs-1.5.0.gem
200 OK
GET https://rubygems.org/gems/rspec-expectations-3.11.0.gem
Downloading gem net-telnet-0.1.1.gem
Fetching rspec-expectations-3.11.0.gem
200 OK
GET https://rubygems.org/gems/rspec-mocks-3.11.1.gem
Downloading gem sfl-2.3.gem
Fetching rspec-mocks-3.11.1.gem
200 OK
GET https://rubygems.org/gems/rspec-3.11.0.gem
Downloading gem specinfra-2.83.2.gem
Fetching rspec-3.11.0.gem
200 OK
Downloading gem serverspec-2.42.0.gem
GET https://rubygems.org/gems/serverspec-2.42.0.gem
Fetching serverspec-2.42.0.gem
200 OK
GET https://rubygems.org/gems/multi_json-1.15.0.gem
Fetching multi_json-1.15.0.gem
200 OK
GET https://rubygems.org/gems/net-ssh-6.1.0.gem
Fetching net-ssh-6.1.0.gem
200 OK
GET https://rubygems.org/gems/net-scp-3.0.0.gem
Fetching net-scp-3.0.0.gem
200 OK
GET https://rubygems.org/gems/net-telnet-0.1.1.gem
Fetching net-telnet-0.1.1.gem
200 OK
GET https://rubygems.org/gems/sfl-2.3.gem
Fetching sfl-2.3.gem
200 OK
GET https://rubygems.org/gems/specinfra-2.83.2.gem
Fetching specinfra-2.83.2.gem
200 OK
GET https://rubygems.org/gems/rspec-its-1.3.0.gem
Fetching rspec-its-1.3.0.gem
200 OK

----(略)----

Successfully installed rspec-support-3.11.0

----(略)----

Successfully installed rspec-core-3.11.0

----(略)----

Successfully installed diff-lcs-1.5.0

----(略)----

Successfully installed rspec-expectations-3.11.0

----(略)----

Successfully installed rspec-mocks-3.11.1

----(略)----

Successfully installed rspec-3.11.0

----(略)----

Successfully installed rspec-its-1.3.0

----(略)----

Successfully installed multi_json-1.15.0

----(略)----

Successfully installed net-ssh-6.1.0

----(略)----

Successfully installed net-scp-3.0.0

----(略)----

Successfully installed net-telnet-0.1.1
----(略)----
Successfully installed sfl-2.3
----(略)----

Successfully installed specinfra-2.83.2

----(略)----

Successfully installed serverspec-2.42.0

----(略)----

Successfully installed highline-2.0.3
Parsing documentation for highline-2.0.3
Parsing sources...
100% [31/31]  lib/highline/wrapper.rb
Installing ri documentation for highline-2.0.3
Done installing documentation for highline after 5 seconds
16 gems installed

→インストール成功した臭い

 

【インストール確認】

[root@cetnos7_1 ~]# gem list serverspec

*** LOCAL GEMS ***

serverspec (2.42.0)

 

【使い方】