使用 Ansible 来配置用户:修改事实/扩展主机变量?

使用 Ansible 来配置用户:修改事实/扩展主机变量?

首先,我很抱歉标题太差劲了。我不太清楚如何简洁地描述这个问题。

这就是我的挑战。我正在配置数据库用户,并希望有一种灵活的定义用户的方法。我在使用 Jinja 进行条件和 ansible 循环时遇到了问题,因为我正在做的事情我认为 ansible 不一定是设计用来做的。让我们从变量开始:

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指的是 ansible 主机组。为此,我得到了以下内容:

- 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_usersmysql_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)

我已经运行了,但ansible它却告诉我找不到“12.34.56.78”,因为它试图使用该 IP 地址作为查找主机的键hostvars。我很难找到更好的方法来处理 IP 地址查找和挽救失败的查找。

首先,有没有更简单的方法可以做到这一点?我是不是把事情搞得太复杂了?其次,我想知道是否有办法更好地将主机 IP 映射到事实。

答案1

我发现这个有用的线索最后在本地构建了一个 var 文件模板,然后将其加载到剧本中。这使我能够在构建 var 文件时利用更多逻辑。

答案2

这可能可以通过使用地图和列表过滤器来解决,如下面第二个示例所述:

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

相关内容