Tag: Ansible

DHCP Option 224でPXE boot後のrole情報を渡す

DHCP Option 224でPXE boot後のrole情報を渡す

目的

PXE boot では、firmware、initramfs、rootfs 上の network manager がそれぞれ DHCP を使うことがある。

このうち、OS 起動後の automation に必要な metadata を DHCP Option 224 で渡すと、同じ rootfs から起動する client でも role や stage を切り替えやすい。

ここでは Option 224 を overlay_id / role / roles / stage のような runtime config 伝播に使う設計をまとめる。

使い方

Option 224 の値は、単純な key-value 文字列にする。

overlay_id=pi-node-1,role=base,roles=base,worker,stage=staging

client 側では DHCP hook がこの値を受け取り、runtime env file を作る。

/run/dhcp/role.env

systemd unit や wrapper はこの env file を読み、対象 role でなければ skip する。

Read more...

Raspberry Pi PXEのTFTP artifactとNFS rootfsを同じrelease境界で扱う

Raspberry Pi PXEのTFTP artifactとNFS rootfsを同じrelease境界で扱う

目的

Raspberry Pi を PXE / network boot で運用すると、boot firmware が読む TFTP artifact と、Linux が mount する NFS rootfs が別々の場所に置かれる。

この 2 つの対応がずれると、kernel / DTB / initramfs / module set / rootfs のどこで壊れたかを追いにくい。

ここでは、TFTP artifact と NFS rootfs を同じ release 境界で promote する設計をまとめる。

前提

構成は次のように分ける。

DHCP / TFTP server
  -> TFTP root
       dates/<release>/
       <board-or-host-prefix>/

NFS server
  -> rootfs/<release>/

Raspberry Pi firmware は board 固有の prefix directory を読める。host directory には config.txtcmdline.txt、symlink などを置き、cmdline.txt で NFS rootfs release を切り替える。

Read more...

UbuntuでAndroid + Rust/Slint開発環境をAnsible管理する

UbuntuでAndroid + Rust/Slint開発環境をAnsible管理する

Ubuntu workstation に Android Studio、Android SDK、Emulator、Rust Android build 環境を入れる場合、GUI installer 任せにすると再構築時の差分が見えにくい。

Ansible では、OS 側の依存、SDK directory、Rust toolchain、Emulator 用 group、確認用 AVD を分けて管理すると扱いやすい。

管理するもの

  • Android Studio
  • Android SDK command-line tools
  • platform-tools
  • emulator
  • Android platform / build-tools
  • NDK
  • x86_64 emulator image
  • Rust toolchain
  • x86_64-linux-android target
  • cargo-apk
  • KVM / libvirt / plugdev group

Android Studio 本体は公式 tarball を固定 path に展開し、SDK は /opt/android-sdk のような system-wide path に置くと、複数 shell や editor から参照しやすい。

directory方針

例:

Read more...

Ansible関連のメモ

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の制限については下記が参考になった。

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の説明