Ansible/逆引きリファレンス

ansibleを使ってやりたいことがあるけどやり方が微妙によく分からない場合にご覧下さい。
というか、本当のところは自分で使ってみてなんとなく役に立ったことを書いているだけです。


template内でif文を使う

こんな感じ
#!/bin/sh

echo "AAA"
{% if var is defined %}
echo "{{ var }}"
{% endif %}
echo "BBB"

exit 0

AnsibleからDockerfileを使ったコンテナの作成

ただ単にDockerのコンテナ作るだけならdocker_containerでいいんですが、Dockerfileを使ったビルドからのコンテナ作成をする場合は一手間かける必要があります。
とりあえずここではhttpdを起動させるコンテナの作成方法を記載します。

まずAnsible側にDockerfileを作成します。
roles/docker/files/services/httpd/Dockerfile を作成します。
FROM centos:centos6
RUN yum install -y httpd
CMD /usr/sbin/httpd -DFOREGROUND

roles/docker/tasks/main.ymlに先程のDockerfileをディレクトリごとコピーするタスクを作ります。
YAMLファイルを分けてincludeするなどはお好きなようにして下さい。
- name: Create Services Directory
  file:
    path=/tmp/services
    state=directory
    mode=0755
- name: Create Files
  copy:
    src=services/httpd
    dest=/tmp/services
    force=yes

更にイメージをpullしてビルドするタスクです。main.ymlに追記します。
docker_imageにpathを指定すると、そのフォルダ内のDockerfileを自動的にビルドします。
- name: Pull CentOS6 Image
  docker_image: name=centos:centos6
- name: Build Image
  docker_image: name=httpd path=/tmp/services/httpd

ビルド完了したらコンテナを作成して起動するタスクです。main.ymlに追記します。
- name: Run Container
  docker_container:
    name: httpd
    image: httpd
    exposed_ports:
      - 80
    ports:
      - "80:80"
exposed_portsを指定しないとportsを設定しても意味が無いのでご注意下さい。
もしくはDockerfileでEXPOSEを指定する形でも良いようです。

配列を改行区切りで展開する

これを
hosts:
  - "127.0.0.1 localhost"
  - "192.168.0.1 gateway"
joinが使えるのでこうすると展開される
{{ hosts | join("\n") }}

=> 127.0.0.1 localhost
   192.168.0.1 gateway

これを応用して、copyモジュールを使うと配列を改行区切りで展開した内容のファイルを直接作れる
- copy:
    dest=/etc/hosts
    content='{{ hosts | join("\n") }}\n'
127.0.0.1 localhost
192.168.0.1 gateway
なお、contentの末尾に改行を入れないと結果が常にchangedになってしまうので注意が必要。

変数が定義されている時のみファイルをincludeする

main.ymlとinclude.ymlがある状態でmain.ymlにこのように記述。
- include: include.yml
  when: var is defined
host_varsなどでvarという変数が定義されている場合のみinclude.ymlが読み込まれる。

例えばこういう風にvarsを定義しておく。
containers:
  - containerA
  - containerB

main.ymlではこうしておく。
- include: docker.yml
  when: containers is defined

docker.ymlをこうしておくと、containersが定義されている場合のみコンテナを起動させたりできる。
- docker_container: name={{ item }} image=centos
  with_items: "{{ containers }}"
ダブルクォーテーションは必要らしい。

  • 最終更新:2016-12-08 15:47:11

このWIKIを編集するにはパスワード入力が必要です

認証パスワード