ansibleで多重ループ(6日坊主)
- この記事はsolo_advent_calender 2016年12月6日のものです。
こんにちは ショート advent calender6日目です。
ansibleで多重ループについて書きます!
ansibleでのループの構文はwith_items
を使います。それはご存知ですか?
# task - name: install by yum yum: name={{ item }} with_items: - vim - unzip
というふうにwith_itemsでリストを与えてその中身(item)でタスクを実行することができます。
この場合だとvim
とunzip
をyumでinstallするということですね。
また、あらかじめgroup_varsなどにリストを用意しておいて
# group_vars/all yum_list: - vim - unzip
# task - name: install by yum yum: name={{ item }} with_items: "{{ yum_list }}"
というふうにすれば、上のものと同じことができます.
多重ループをするにはどうすれば良いでしょう?
どうやらloop-controlとういものがあるようです。 Loops — Ansible Documentation
通常with_itemsでリストから値を取り出したときリストの中身はitem
という変数に格納されて扱われます。
ですがこのloop-controlというものを使うとitem
の名前を変えることができるのです。
サンプルでは
- include: inner.yml with_items: - 1 - 2 - 3 loop_control: loop_var: outer_item # inner.yml - debug: msg="outer item={{ outer_item }} inner item={{ item }}" with_items: - a - b - c
というふうになっています。inner.ymlをインクルードするのをwith_items
でループさして、その中身はouter_item
という変数に入るというtaskになっています。公式の説明では
2.0では、with_loopsとtask includesを使用することができます(ただし、プレイブックは含まれません)。 これにより、一連のタスクをワンショットでループする機能が追加されます。 不可能なデフォルトでは、各ループのループ変数項目が設定され、これらのネストループは「外側」ループのitemの値を上書きします。 2.1の時点で、loop_controlオプションを使用して、ループに使用する変数の名前を指定できます。(google翻訳のコピペ)
includeするのはtaskのincludeだけのようです。
loop_control: loop_var: outer_item #outer_itemというループ用の変数を定義
で変数名を定義します。
上のyumの例でいくと(yumのときこんなことするはずないが)
# group_vars/all yum_list: - vim - unzip - nginx - mysql yum_state: - present - latest
# main.yml - name: install by yum include: inner.yml with_items: "{{ yum_state }}" loop_control: loop_var: outer_item
# inner.yml - name: install by yum yum: name={{ item }} state={{ outer_item }} with_items: "{{ yum_list }}"
stateがpresetとlatestで両方インストールするという わけのわからないtaskになってしまったが複数のループを使用するときはこういうふうな書き方になりそうです。
また
yum_list - statet: present package: - vim - unzip - statet: latest package: - vim - unzip
というvarsをつくったならwith_subelementsというloopを使えば子要素でloopできるそう。この記事は明日書く予定です
bashコマンド(5日坊主)
- この記事はsolo_advent_calender 2016年12月5日のものです。
こんにちは ショート advent calender5日目です。
bash使っている人多いと思います。
bashコマンドもあります。
man bash
bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換の コマンド言語インタプリタです。 bash には、Korn シェルや C シェ ル (ksh や csh) の便利な機能も採り入れられています。
正確にはコマンド言語インタプリタだそうです。
bash -c
で入力を文字列から読み込んでくれます。
# 同じ結果が返ってくる $bash -c "ls" $ls
ansibleでshellモジュールを利用するときに
--- shell: ls -la
とかしますが、shellモジュールでsed
やgrep
などで文字を検索するときにコロン(:)が入っているとansibleではエラーになります。
これを
shell: bash -c "grep :"
とするとコロンもコマンドの一部として扱うことができます。
bash -l
で環境変数読みこみなので、pyenv等のルート意外のホームディレクトリにインストールされるコマンドも実行できます。
become: False shell: bash -lc "pyenv versions"
bash周りのファイル群(4日坊主)
- この記事はsolo_advent_calender 2016年12月4のものです。
こんにちは ショート advent calender4日目です。
man bash
-- 略 -- ファイル /bin/bash bash の実行ファイル。 /etc/profile システム全体用の初期化ファイル。ログインシェルが実行します。 ~/.bash_profile 個人用の初期化ファイル。ログインシェルが実行します。 ~/.bashrc 対話シェルごとに実行される、個人用の起動ファイル。 ~/.bash_logout 個人用のログインシェル後処理ファイル。ログインシェルの終了時に実行されます。 ~/.inputrc 個人用の readline 初期化ファイル。 -- 略 --
.bash_profile
と.bashrc
に何かを追記することはありますが、.bash_logout
は使ったことがなかったので使ってみました。
vim ~/.bash_logout
# ~/.bash_logou d=`date` p=`pwd` echo ${d} ${p} >> logout.log echo "bye"
ログアウト時に最後にいたディレクトリを追記していくものです。これぐらいしか思いつきません。
cat logout.log
2016年 12月 4日 日曜日 23:48:27 JST /home/mokicks
ansibleでpyenvいれる(3日坊主)
- この記事はsolo_advent_calender 2016年12月3のものです。
こんにちは ショート advent calender3日目です。
ansibleでDjangoの開発環境を準備するために作りました。
pyenvで指定のバージョンのpythonをインストールするところまでです。
ディレクトリ構成はこんな感じです
pyenv/ ├── files │ └── bashrc ├── handlers │ └── main.yml └── tasks └── main.yml
bashrcをコピーする方式なので開発マシンに入ってbashrcを書き換えてもう一度実行すると初期状態にもどってしまうので、ファイルの存在を確認するようにしています。
tasks/main.yml
--- - name: clone pyenv become: False git: repo=git://github.com/yyuu/pyenv.git dest=~/.pyenv accept_hostkey=yes - name: check bashrc become: False stat: path=~/.bashrc register: is_bashrc ignore_errors: yes - name: copy bashrc become: False copy: src=bashrc dest=~/.bashrc notify: source bashrc when: not is_bashrc.stat.exists - name: check python version {{ python_version }} become: False shell: bash -lc "pyenv versions | grep {{ python_version }}" register: result ignore_errors: yes - name: install {{ python_version }} become: False shell: bash -lc "pyenv install {{ python_version }}" when: result|failed - name: set global {{ python_version }} become: False shell: bash -lc "pyenv global {{ python_version }}"
handlers/main.yml
--- - name: source bashrc shell: bash -lc "source bashrc"
files/bashrc
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi export PYENV_ROOT="${HOME}/.pyenv" if [ -d "${PYENV_ROOT}" ]; then export PATH=${PYENV_ROOT}/bin:$PATH eval "$(pyenv init -)" fi # User specific aliases and functions
group_varsのall等に
# バージョンを指定する python_version: 2.7.11
を用意すれば
pyenvが開発環境にインストールされます。 あとはpipをインストールしてDjangoをpipでインストールすればDjangoを扱えるようになります。
この部分も後ほどansibleで書こうとおもいます。
Ansibleで変数のデバッグ(2日坊主)
この記事はsolo_advent_calender 2016年12月2日のものです。
こんにちは ショート advent calender2日目です。
- debug: var=変数名
でできます。{{ }} は必要ありません。
2016年度solo advent calenderします
2016年12月1日から2016年12月25日まで毎日ブログ更新します。
継続力テスト。
12/1 mokicks.hatenablog.com 12/2 mokicks.hatenablog.com 12/3 mokicks.hatenablog.com 12/4 mokicks.hatenablog.com 12/5 mokicks.hatenablog.com 12/6 mokicks.hatenablog.com 12/7 mokicks.hatenablog.com
vimでESCキー以外でノーマルモードにする (1日坊主)
この記事はsolo_advent_calender 2016年12月1日のものです。
こんにちは ショート advent calender1日目です。
.vimrcにimap <キーバインド> <esc>
書けば完了
cd ~ vim .vimrc
#.vimrcの一番下に1行追加 imap <c-f> <esc>
これで、ctrl + f
を押せばノーマルモード(何もしてないモード)
に戻ります。
ctrl + j
の方が押しやすそうと思っていたが、どうやらインサートモード中に ctrl + j
で改行できるっぽい。
というかimap
の記述す前に試してたら改行された!