古いバージョンのAnsibleでloopを使ったらエラーが出た話

エラーの内容と原因

Ansible では繰り返し制御を使うときにloopキーワードを用いる。
Loops — Ansible Documentation
公式のドキュメントを参考に書いていたが、実行すると以下のエラーになった。

[root@localhost ansible_test]# ansible-playbook my_playbook.yml
ERROR! The field 'loop' is supposed to be a string type, however the incoming data structure is a <class 'ansible.parsing.yaml.objects.AnsibleSequence'>

The error appears to have been in '/root/***/***/my_playbook.yml': line 29, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

        state: directory
    - name: make directories.
      ^ here

検索するとStackOverflowが出てくる。Ansibleのバージョンが古いのが原因だと書いてある。 いや、まさかそんなはずは……

[root@localhost ansible_test]# ansible --version
ansible 2.3.1.0
(後略)

あっ! そのまさかであった。
loopというキーワードが導入されたのはAnsible 2.5以降である。それより古いバージョンだとloopが正しく認識されず、エラーになる。
したがって、Ansibleのバージョンを最新にすれば問題は解決する。

Ansibleバージョンアップ

ところが、最新にするのが予想に反して大変だった。(環境はCent OS 7.3)

yum update ansibleを打つと、以下のようになった。

依存性を解決しました

=======================================================================================================================================
 Package                                 アーキテクチャー          バージョン                          リポジトリー               容量
=======================================================================================================================================
更新します:
 ansible                                 noarch                    2.4.2.0-2.el7                       extras                    7.6 M
依存性関連でのインストールをします:
 python-cffi                             x86_64                    1.6.0-5.el7                         base                      218 k
 python-enum34                           noarch                    1.0.4-1.el7                         base                       52 k
 python-idna                             noarch                    2.4-1.el7                           base                       94 k
 python-ipaddress                        noarch                    1.0.16-2.el7                        base                       34 k
 python-passlib                          noarch                    1.6.5-2.el7                         extras                    488 k
 python-ply                              noarch                    3.4-11.el7                          base                      123 k
 python-pycparser                        noarch                    2.14-1.el7                          base                      104 k
 python2-cryptography                    x86_64                    1.7.2-2.el7                         base                      502 k
 python2-jmespath                        noarch                    0.9.0-3.el7                         extras                     39 k
依存性関連での更新をします:
 openssl                                 x86_64                    1:1.0.2k-16.el7                     base                      493 k
 openssl-devel                           x86_64                    1:1.0.2k-16.el7                     base                      1.5 M
 openssl-libs                            x86_64                    1:1.0.2k-16.el7                     base                      1.2 M
=======================================================================================================================================

Ansibleのバージョンが2.4.2.0となっている。これではloopが使えない。
最新バージョンは2.7のはずなのに、何でなの……?
繰り返しupdateをしても、「現在のバージョンは最新です」と言われてしまい、2.4.2.0で止まってしまった。

[Ansible]ノートPC Hyper-V 上のCentOS7.5にAnsibleインストール - こしぞーのひとり情シス を参考に

yum install epel-release
yum update ansible

を打ってみたけど、何も変わらない。最新のversionだよって言われる。

https://centos.pkgs.org/7/epel-x86_64/ansible-2.7.5-1.el7.noarch.rpm.html
がある以上、epelが有効ならばVersion 2.7.5.1が使えそうに見えるんだけど。

/etc/yum.repos.d/epel.repo より一部抜粋

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

うーん。enabled=1だからepelが有効になってる設定だよね。

"--enablerepo=epel"を付けて、有効にする指定を明示的に行っても、何も変わらず。

# yum --enablerepo=epel update ansible
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: epel.scopesky.iq
 * extras: centos.usonyx.net
 * updates: download.nus.edu.sg
No packages marked for update

埒が明かないので、直接rpmを指定してダウンロードし、バージョンアップした。

下記でなんで山形大学ドメインになっているのか、後から見返してよく分からない。
/etc/yum.repos.d/epel.repoの中に書いてある http://download.fedoraproject.org/pub/epel/7/ をブラウザに入力すると
日本国内のミラーに適宜リダイレクトされる。きっと、この時はyamagata-u.ac.jpにリダイレクトされたんだろう。
いま何回か試したらjaist.ac.jp や riken.jp に飛んでいった時もあった。
そこからパッケージを選択して、rpmファイルのあるURLを控えておき、rpmコマンドでそのURLを指定すればよい。

[root@localhost ansible_test]# rpm -Uvh http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel/7/x86_64/Packages/a/ansible-2.7.5-1.el7.noarch.rpm
http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel/7/x86_64/Packages/a/ansible-2.7.5-1.el7.noarch.rpm を取得中
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:ansible-2.7.5-1.el7              ################################# [ 50%]
整理中 / 削除中...
   2:ansible-2.4.2.0-2.el7            ################################# [100%]
[root@localhost ansible_test]# ansible --version
ansible 2.7.5
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
[root@localhost ansible_test]#

というわけで何とか最新バージョンになった。

以上。それでは。