首先,我为可怕的标题道歉。 我不完全确定如何简洁地描述这个问题。
所以这是我的挑战 我正在调配数据库用户,并希望定义用户的灵活方法。 我遇到了使用Jinja进行条件和循环的问题,因为我正在做的事情,我认为anja不一定是为了做。 我们从variables开始:
mysql_users: - user: biggles password: boggles group: app database: some_db - user: boogers password: boogers hosts: - "12.34.56.78" - "12.34.56.79" - "12.34.56.80" database: another_db
我想在第一个项目中的group密钥,并将其展开到一个IP地址列表(如在第二项中)。 group指的是一个绝对的主人群。 要做到这一点,我有这个:
- name: Expand Mysql users hosts from their group name set_fact: args: mysql_users_dirty: user: "{{ item }}" hosts: "{{ groups[item.group | default('')] | default(item.hosts) }}" with_items: mysql_users register: mysql_users_results # when: item.group is defined | default(false) - name: Map fact result list to correct ansible fact set_fact: mysql_users_expanded: "{{ mysql_users_results.results | map(attribute='ansible_facts.mysql_users_dirty') | list }}"
这将mysql_users转换为mysql_users_expanded :
mysql_users_expanded: - hosts: - "23.34.56.78" - "23.34.56.79" - "23.34.56.80" user: user: biggles password: boggles group: app database: some_db - hosts: - "12.34.56.78" - "12.34.56.79" - "12.34.56.80" user: user: boogers password: boogers database: another_db hosts: - "12.34.56.78" - "12.34.56.79" - "12.34.56.80"
然后我们添加用户:
- name: Create/assign additional database users to db and grant permissions (group hosts) mysql_user: name="{{ item.0.user.user }}" password="{{ item.0.user.password }}" host="{{ hostvars[ item.1 ]['ansible_' + private_iface ]['ipv4']['address'] | default(item.1) }}" priv="{{ item.0.user.database }}.*:{{ item.0.user.priv | default('ALL')}}" state=present login_host="localhost" login_user=root login_password="{{ mysql_root_password }}" with_subelements: - mysql_users_expanded - hosts when: item.1 is defined | default(false)
我已经有了这个,但是对我说,它找不到“12.34.56.78”,因为它试图使用该IP地址作为查找hostvars的主机的关键。 我很难find一个更好的方式来处理IP地址查找和拯救失败的查找。
首先,有没有更简单的方法呢? 我做这个太复杂了吗? 其次,我想知道是否有办法更好地将主机映射到事实。
我发现这个有用的线程 ,最终在本地构build一个var文件模板,然后将其加载到剧本中。 它使我能够在构buildvar文件时使用更多的逻辑。
这可能会使用映射和列表filter来解决,如第二个示例中所述:
http://docs.ansible.com/ansible/set_fact_module.html
# Example setting host facts using complex arguments - set_fact: one_fact: something other_fact: "{{ local_var * 2 }}" another_fact: "{{ some_registered_var.results | map(attribute='ansible_facts.some_fact') | list }}"
我在这里进一步深入: http : //smileytechadventures.blogspot.com/2015/07/ansible-filter-results.html