Ansible関連のメモ
Posted:
ansibleユーザを作成する
一旦、ansible-playbook実行サーバからssh鍵をコピーするためパスワードを設定するが、ssh-copy-id後、パスワードを削除する手順。
※ 下記のようにアカウントを作成するとデフォルトシェルとして/bin/bashが設定されるが、できれば消したい。 ただAnsibleの一部のモジュールやプラグインは、ターゲットシステム上でフルシェル環境を想定している可能性があるためデフォルトシェルの設定をしている。 既存のプレイブックを調整しつつ最終的にはデフォルトシェルをなくしたい。
useradd --system -m -G users,wheel ansible
passwd ansible
Gentooでsudoが入ってない場合、sudoインストール
emerge -a app-admin/sudo
/etc/sudoers.d/ansible に書き込む(mkdir /etc/sudoers.d/がなければ作る)
編集時は visudo -f を使い、権限は 0440 にする。
mkdir -p /etc/sudoers.d
echo "ansible ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/ansible
chmod 0440 /etc/sudoers.d/ansible
ansible-playbook実行サーバから
ssh-copy-id ansible@<対象ホストのIPアドレス>
パスワードログインを禁止していく(ansibleのcopyで確実に存在するようにした方が良い)
/etc/ssh/sshd_config.d/ansible_no_password.conf を追加
Match User ansible
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
上記のファイルはインデントしているが、可読性のためでsshdの挙動には関係がない。
sshdを再起動
sudo systemctl restart sshd
sshdの制限については下記が参考になった。
- sshdのmatchでユーザ単位・アドレス単位でchrootをさせるなど、matchに応じて処理方法を変える | 俺的備忘録 〜なんかいろいろ〜
- ssh で ユーザー名 と ネットワークの複数条件のANDで設定を書く - それマグで!
INIファイルとYAMLファイルの比較
- インベントリーの構築方法 — Ansible Documentation
- 私は最初はINIファイルで書き始め、途中で記述をシンプルに短くできるためYAMLに移行した。その際に役に立った。
ディレクトリを作成する
- name: Create a new directory
file:
path: /path/to/new/directory
state: directory
ファイルが存在するかwhenで確認する
findで検索
- name: Check if file exists
find:
paths: /path/to/directory
patterns: myfile.txt
register: result
- name: Perform task if file exists
debug:
msg: "File exists"
when: result.matched > 0
パス決め打ち
- name: ファイルの存在確認
stat:
path: /path/to/your/file.txt
register: file_stat
- name: ファイルが存在する場合に実行されるタスク
command: echo "ファイルが存在します"
when: file_stat.stat.exists
- name: ファイルが存在しない場合に実行されるタスク
command: echo "ファイルは存在しません"
when: not file_stat.stat.exists
loopの説明
- 変数の定義から利用まで様々な利用方法がある。
- サンプルが豊富でloopはここが一番わかりやすかった。
ファクト(対象サーバの情報)をリモートから取得したい
ポイントは
- inventory.ini インベントリファイルを使用する
- 操作対象のホストを特定した方が良い。
- -mオプションでsetupを指定するとファクトの収集ができる
- filterでフィルタリングできる
下記のようにIPアドレスを直接している方法ではエラーが出てしまっていた。inventoryファイルも必要な模様。
ansible 192.0.2.10, -m setup
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: 192.0.2.10
inventoryファイルも指定するとうまく行く。
ansible -i inventory.ini example-host -m setup -a 'filter=ansible_interfaces'
[WARNING]: Platform linux on host example-host is using the discovered Python interpreter at /usr/bin/python3.11, but future installation of
another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-
core/2.14/reference_appendices/interpreter_discovery.html for more information.
example-host | SUCCESS => {
"ansible_facts": {
"ansible_interfaces": [
"enu1u1u1",
"wlan0",
"lo"
],
"discovered_interpreter_python": "/usr/bin/python3.11"
},
"changed": false
}
今回、templateで使用するイーサネットワークデバイス名が取得できないかな、と試してみた。 ただ、ansibleで ansible_interfaces配列の中をフィルタリングしたい。
下記のような形でフィルタリングできるようだ。
- name: イーサネットデバイス名の取得
hosts: example-hosts
gather_facts: false
tasks:
- name: ファクト収集
setup:
filter: "ansible_interfaces"
- name: 'enで始まるインターフェース名の抽出'
set_fact:
ethernet_interfaces: "{{ ansible_interfaces | select('match', '^en.*') | join(' ') }}"
- name: 結果の表示
debug:
var: ethernet_interfaces
systemctl daemon-reload を実行したい
systemdを使っている時に起動スクリプトを更新した場合、systemctl daemon-reload を行う必要がある。 これをシンプルに書く方法。
- name: systemctl daemon-reload を実行
systemd:
daemon_reload: true
raspi64で以前、使っていたが今は使っていない書き方
自分向けのメモ
デフォルトでzramが有効になったので使わなくなった
- name: zram 設定
block:
- name: zram インストール
portage: >
package=sys-block/zram-init
state=present
- name: zram 自動起動
service: >
name=zram-init
state=started
enabled=yes
zram を切る
- name: zramを切る
block:
- name: zram tmp off
service: >
name=zram_tmp
state=stopped
enabled=no
- name: zram var tmp off
service: >
name=zram_var_tmp
state=stopped
enabled=no
register: zram
- name: 再起動
when: zram.changed == true
reboot:
swap領域の作成
注意: dd, mkswap, /etc/fstab の更新を含むため破壊的操作になる可能性がある。
- name: swap領域があるか確認
stat:
path: /var/cache/swap/swapfile
register: swap_check
check_mode: no
changed_when: false
- name: 5GBのswap領域を作成
shell: |
mkdir /var/cache/swap/
cd /var/cache/swap/
truncate -s 0 ./swapfile
chattr +C ./swapfile
btrfs property set ./swapfile compression none
dd if=/dev/zero of=swapfile bs=128M count=40
chmod 0600 ./swapfile
mkswap ./swapfile
swapon ./swapfile
echo '/var/cache/swap/swapfile swap swap defaults 0 0' >> /etc/fstab
when: not swap_check.stat.exists
ファイルシステムのリサイズ
単純にリサイズできなくなった(この症状は解消したい)
- name: ファイルシステムをリサイズ
shell: |
btrfs filesystem resize max "/"
docker は containerd に変更できないか確認する
- name: Dockerをインストール
portage: >
package=app-containers/docker
state=present
- name: Dockerを自動起動
service: >
name=docker
state=started
enabled=yes
- name: docker-composeをインストール
portage: >
package=app-containers/docker-compose
state=present
deep=yes
noreplace=no
changed_use=yes
GUI環境は別の設定に分ける
- name: フォントのインストール
block:
- name: media-fonts/aquapfont の開発版を許可する
shell: |
echo 'media-fonts/aquapfont **' >> /etc/portage/package.accept_keywords/font
when: "'aquafont' not in accept_keywords_result.stdout"
- name: package.license の確認
command: cat /etc/portage/package.license
register: license_result
check_mode: no
changed_when: false
sudo flaggie www-client/chromium +component-build
sudo flaggie www-client/chromium +pulseaudio
- name: chromium のインストール (ハードマスクされていて推奨はされない)
block:
- name: www-client/chromium の開発版を許可する
shell: |
echo -e 'www-client/chromium ~arm64\nwww-plugins/chrome-binary-plugins **' >> /etc/portage/package.accept_keywords/chromium
when: "'chromium' not in accept_keywords_result.stdout"
- name: package.license の確認
command: cat /etc/portage/package.license
register: license_result
check_mode: no
changed_when: false
failed_when: false
- name: www-plugins/chrome-binary-plugins のライセンスを許可する
shell: |
echo '>=www-plugins/chrome-binary-plugins-100.0.4896.60 google-chrome' >> /etc/portage/package.license
when: "'chrome' not in license_result.stdout"
- name: ハードマスクの状況を確認する
command: cat /etc/portage/package.unmask
register: unmask_result
check_mode: no
changed_when: false
failed_when: false
- name: ハードマスクを外す
shell: |
echo 'www-client/chromium' >> /etc/portage/package.unmask
when: "'chromium' not in unmask_result.stdout"
- name: www-client/chromium をインストール
portage: >
package=www-client/chromium
state=present
firefoxがffmpegを利用し、 ffmpegにopenalオプションが付いていると media-libs/libsdl2 をリコンパイルしようとし、libsdl2のコンパイルに失敗する libsdl2がリコンパイルできる事が望ましいができないので、 一旦、ffmpegのopenalオプションを外して、libsdl2がコンパイルされないようにし、 firefoxのコンパイルを成功させる。
- name: firefoxインストール
block:
- name: ffmpegのオプションを確認
command: flaggie ffmpeg ?openal
register: ffmpeg_result
check_mode: no
changed_when: false
failed_when: false
- name: ffmpeg -openal する
shell: |
sudo flaggie media-video/ffmpeg -openal
when: "'-openal' not in ffmpeg_result.stdout"
- name: firefoxのコンパイル
portage: >
package=www-client/firefox
state=present
update=yes
アップデート関連、これもセットアップとは別に切り出したい
- name: "@systemでアップデート"
portage: >
package=@system
update=yes
deep=no
- name: "@worldでアップデート"
portage: >
package=@world
update=yes
deep=no
- name: "@worldで--deepつけてアップデートを--oneshotで行う"
portage: >
package=@world
oneshot=yes
update=yes
deep=yes
- name: "@worldでdepcleanする"
portage: >
package=@world
deep=yes
depclean=yes
state=removed
- name: "@worldで依存関係のチェックも行う"
shell: |
emerge --update --newuse --deep --with-bdeps=y --binpkg-changed-deps=y --changed-slot --reinstall=changed-use --binpkg-respect-use=y @world
emerge --depclean
- name: "@worldで依存関係のチェックも行う"
shell: |
emerge -1vUD @world
emerge --update --newuse --deep --with-bdeps=y @world
emerge --depclean