2016-04-16 11 views
1

私はループ内の変数の変数にアクセスすることができますか?たとえば、MySQLの/ MariaDBサーバがそうのような2つの命令必要がインストールするのdebconfの設定:ループ内の可能変数とネストされた変数

- name: Define maria root password 
    shell: echo mysql-server mysql-server/root_password password {{ mysqlRootPass }} | debconf-set-selections 

- name: Define maria root password again 
    shell: echo mysql-server mysql-server/root_password_again password {{ mysqlRootPass }} | debconf-set-selections 

をしかし、私はそれを行うことができればそれが道よりコンパクトになります:

明らか
- name: Define maria root password 
    shell: {{ item }} 
    with_items: 
    - "{ echo mysql-server mysql-server/root_password password {{ mysqlRootPass }} | debconf-set-selections }" 
    - "{ echo mysql-server mysql-server/root_password_again password {{ mysqlRootPass }} | debconf-set-selections }" 

、それは」doesnの仕事。

これは動作させる方法がありますか?それを行う良い方法はありますか?何か不足していますか?

+1

なぜ、中括弧がある '{}' 'あなたのwith_items'で? – Wtower

+1

実際、それは中かっこなしで動作するようです!私は正規表現を使って以前の 'with_items'の中にいくつか持っていて、内部でヴァルスを置き換えたので、それらを持っていました。しかし、それは私の愚かだった... – Buzut

答えて

1

{{ }} Anasyの表記は、Jinja2のテンプレートに由来していますが、これは実質的に、この変数の内容で置き換えることができます。

with_itemsは、現在のループの特定の項目である特別な変数itemを導入しています。

したがって、コマンドモジュールに{ echo...を実行するように指示します。すなわち、with_itemsにあるものを実行します。あなたはコマンド自体が必要です:echo...

参考:Ansible docs: using variables and Jinja2

+0

啓発の説明をありがとう! – Buzut

+0

あなたは大歓迎です。 – Wtower

1

ここに私の完全な働きをするMySQLの役割があります。

VARS/main.yml

mysql_root_pass: mypassword #MySQL Root Password 

タスク/ main.yml

--- 
- name: Install the MySQL packages 
    apt: 
    name: "{{ item }}" 
    state: installed 
    update_cache: yes 
    with_items: 
    - mysql-server-5.6 
    - mysql-client-5.6 
    - python-mysqldb 
    - libmysqlclient-dev 

- name: Update MySQL root password for all root accounts 
    mysql_user: 
    name: root 
    host: "{{ item }}" 
    password: "{{ mysql_root_pass }}" 
    state: present 
    with_items: 
    - "{{ ansible_hostname }}" 
    - 127.0.0.1 
    - ::1 
    - localhost 

- name: Copy the root credentials as .my.cnf file 
    template: 
    src: root.cnf.j2 
    dest: "~/.my.cnf" 
    mode: 0600 

- name: Ensure Anonymous user(s) are not in the database 
    mysql_user: 
    name='' 
    host: "{{ item }}" 
    state: absent 
    with_items: 
    - localhost 
    - "{{ ansible_hostname }}" 

- name: Remove the test database 
    mysql_db: 
    name: "test" 
    state: absent 
    notify: 
    - Restart MySQL 

テンプレート/ root.cnf.j2

[client] 
user=root 
password={{ mysql_root_pass }} 

ハンドラ/ main.yml

--- 
- name: Restart MySQL 
    service: 
    name: mysql 
    state: restarted 

マイsite.ymlは次のようになります。あなたがちょうどすでに設定のMySQLのパスワードを更新するために探している場合

--- 
- hosts: all 
    become: yes 
    gather_facts: yes 
    roles: 
    - mysql 

vars/main.yml

mysql_old_root_pass: olmysqldpassword 
mysql_root_pass: newmysqlpassword 

希望

- name: Set root user password 
    mysql_user: 
    name: root 
    host: "{{ item }}" 
    password: "{{ mysql_root_pass }}" 
    check_implicit_admin=yes 
    login_user: root 
    login_password: "{{ mysql_old_root_password }}" 
    state: present 
    with_items: 
    - "{{ ansible_hostname }}" 
    - 127.0.0.1 
    - ::1 
    - localhost 

tasks/main.ymlでは、これはあなたを助けるでしょう。助けが必要な場合は、このgithub linkをご確認ください。

+0

実際には、mysql mysql_dbとmysql_userはサーバ上に追加のモジュールを必要とします(少なくともUbuntu 14.04では)。だから私はそれらを使わないのです。 – Buzut

+1

"python-mysqldb"モジュールだけが必要です。 –

関連する問題