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

ファクト(対象サーバの情報)をリモートから取得したい

ポイントは

  • 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