質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Q&A

解決済

1回答

13601閲覧

Ansibleで'dict object' has no attribute でgroup_varsの変数が利用できない

tkkk

総合スコア7

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

0グッド

0クリップ

投稿2016/08/20 09:30

編集2016/08/20 09:32

Ansible: ver2.1.0.0
ローカルからリモートサーバー上(さくらVPS)に対してAnsibleを使って環境構築の自動化をしようとしています。
すでに同じサーバー上にAnsibleを使ってNginxの構築は成功していますが、今回のpostgresqlのインストールを目的とした構築がうまくいきません。Nginxのときとの違いは、今回はgroup_varsの変数を利用して構築しようとしています。
現在、以下の構成で試していますが、うまくいきません。

###ディレクトリ構成

├── group_vars │ ├── all.yml │ └── production │ ├── all.yml │ ├── secret.yml │ ├── dbservers.yml │ └── webserves.yml ├── hosts │ └── production │ └── production ├── roles │ └── postgresql │ └── tasks │ └── main.yml │ ├── ruby │ └── nginx │ ├── dbserves.yml ├── webservers.yml └── site.yml

###主なソースコード
site.yml

yaml

1--- 2- include: webservers.yml 3- include: dbservers.yml

dbservers.yml

yaml

1--- 2- hosts: dbservers 3 roles: 4 - postgresql

roles/postgresql/tasks/main.yml

yaml

1--- 2- name: rpm install postgresql repos 3 become: true 4 yum: 5 name: "{{ pg.rpm_url }}" 6 7- name: install postgresql 8 become: true 9 yum: 10 name: "{{ item }}" 11 state: latest 12 with_items: 13 - "{{ pg.package_name }}-server" 14 - "{{ pg.package_name }}-devel" 15 - "{{ pg.package_name }}-contrib" 16 - "{{ pg.package_name }}-libs" 17 - python-psycopg2 18 19- name: postgresql initdb 20 become: true 21 shell: "service postgresql-{{ pg.version }} initdb" 22 23- name: start postgresql 24 become: true 25 service: 26 name: "postgresql-{{ pg.version }}" 27 state: started 28 enabled: true 29 30- name : create database 31 postgresql_db: 32 name: "{{ pg.dbname }}" 33 login_user: postgres 34 sudo_user: postgres 35 sudo: true 36 37- name: create user 38 postgresql_user: 39 db: "{{ pg.dbname }}" 40 name: "{{ pg.dbuser }}" 41 password: "{{ pg.dbpassword }}" 42 priv: ALL 43 state: present 44 login_user: postgres 45 sudo_user: postgres 46 sudo: true

hosts/production/production

ini

1[ishikari-webservers] 2target-host ansible_host=(IPを記入) ansible_port=21122 ansible_user=system_user ansible_ssh_private_key_file=/Users/admin/.ssh/sakura_git 3 4[ishikari-dbservers] 5target-host ansible_host=(IPを記入) ansible_port=21122 ansible_user=system_user ansible_ssh_private_key_file=/Users/admin/.ssh/sakura_git 6 7[webservers:children] 8ishikari-webservers 9 10[dbservers:children] 11ishikari-dbservers 12 13[production:children] 14webservers 15dbservers

group_vars/production/dbservers.yml

yml

1--- 2pg: 3 rpm_url: "http://yum.postgresql.org/9.5/redhat/rhel-7.1-x86_64/pgdg-centos95-9.5-1.noarch.rpm" 4 version: 9.5 5 package_name: postgresql95 6 dbname: app_production 7 dbuser: db_user 8 # dbpasswordはgroup_vars/production/secret.yml ここには書かない

group_vars/production/secret.yml

yml

1--- 2pg: 3 dbpassword: password

###実行コマンド

cmd

1ansible-playbook -i ansible/hosts/production ansible/dbservers.yml --vault-password-file ~/.vault_password

###エラーメッセージ

cmd

1TASK [postgresql : rpm install postgresql repos] ******************************* 2fatal: [target-host]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'rpm_url'"}

rpm_urlなどのgroup_varsから読み込みたい変数がうまく読み込めません。
試しに、group_vars/production/dbservers.ymlの内容をまるまる roles/postgresql/vars/main.ymlとして実行するとdbpasswordの部分は直書きになってしまいますが、構築に成功します。

group_varsの変数の利用でなんとか解決できないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

シンプルな環境で試してみたのですが、単純にgroup_varsのグループフォルダに
複数の変数入りYAMLを置くだと変数ごと上書きされるみたいです。

自環境で試した感じではdbserver.ymlのインクルード後にsecret.ymlのインクルードが走り、
結果としてpg変数はsecret.ymlの中身のみになっていました。

Playbookと同じフォルダか、実行時のディレクリにansible.cfgを用意して、

[defaults] hash_behaviour = merge

と書くとdict型の変数を複数のvars系ファイルをインクルードする際に、全体を上書きするのではなく
dictのキー単位でマージしてくれるみたいです。

投稿2016/08/20 13:56

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkkk

2016/08/21 00:29

分かりやすい回答ありがとうございます。回答の内容で解決することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問