なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

ansible-vaultでパスワード聞かれるのを1回にする

qiita.com

毎回ansible-vault decrypt ~~~とコマンドを打ち込んでいたが、以下のようにすればansible実行時にパスワードを聞いてくれる

$ cat ansible.cfg 
[defaults]
ask_vault_pass = True

これができるんだったら

echo "your great password" | ansible-playbook xxxx

みたいな感じでパイプで渡したりできたら楽なのに

Ansibleでデフォルト値を使わせたい場合はdefault(omit)を使う

表題通りだけの話、このサイトに書いてありました。

www.netassist.ne.jp

公式ドキュメントにも探せば…

https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_filters.html#omitting-undefined-variables

あったけどこんなんわからんね、RedHatが悪い。私は何も悪くない。

これを使えばこんなことができる。

  • shellを指定した場合だけデフォルトシェルを設定し、そうでない場合はAnsibleのデフォルト値を作らせる
  user:
    name: "{{ item.name }}"
    home: "{{ item.home | default(omit) }}"
    shell: "{{ item.shell | default(omit) }}"

systemdベースのOSでdockerするときはsystemdのunitファイルを消さないと変なことになるかも

systemdベースのOSでdockerするときはsystemdのunitファイルを消さないと変なことになるかも

問題

Centos7でdockerイメージを作成し、mysqlを起動させようとしたところ、変なエラーが出て起動できない

# Dockerfile
...(いろいろ処理)
RUN systemctl start mysqld

# docker-compose up -d --build
...(いろいろログ)
error: Failed to get D-Bus connection: No connection to service manager ←????

解決策

FROM centos:7

# 後述の理由で環境変数定義
ENV container docker

# /lib/systemd/system/sysinit.target.wants/ 以下にあるunitファイルを削除して回る
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# 後述の理由で volumeとして /sys/fs/cgroup を定義する
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

それぞれの理由

For some undocumented reason the variable container=docker is apparently required. /sys/fs/cgroup is also required, as SystemD needs cgroups to work properly according to RedHat Bug 1033604.

  • /sys/fs/cgroup はともかく、ENV container dockerを指定しなければいけないのはバグっぽく見えるが…
  • docker-compose.yml に書いたほうがいい気がする

参考

以下2つは参考になったので見ておくといいかもしれない

追記

qiita.com