ansible-vaultでパスワード聞かれるのを1回にする
毎回ansible-vault decrypt ~~~とコマンドを打ち込んでいたが、以下のようにすればansible実行時にパスワードを聞いてくれる
$ cat ansible.cfg [defaults] ask_vault_pass = True
これができるんだったら
echo "your great password" | ansible-playbook xxxx
みたいな感じでパイプで渡したりできたら楽なのに
Ansibleでデフォルト値を使わせたい場合はdefault(omit)を使う
表題通りだけの話、このサイトに書いてありました。
公式ドキュメントにも探せば…
あったけどこんなんわからんね、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"]
それぞれの理由
- ENV container docker, VOLUME [ "/sys/fs/cgroup" ]
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つは参考になったので見ておくといいかもしれない