エラーの内容と原因
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]#
というわけで何とか最新バージョンになった。
以上。それでは。