Код рефакторинга Ansible, такой как повторно используемый параметризованный класс или функция

#ansible #devops

Вопрос:

 roles/mysql ├── handlers │ └── main.yml ├── tasks │ └── main.yml ├── templates └── vars  └── main  ├── mysql_user_privileges.yml  └── mysql_users.yml  

var/main/mysql_user_privileges.yml

 --- # MySQL Admin privileges mysql_admin_user_host: "%" mysql_admin_user_privileges: '*.*:ALL' mysql_admin_user_pwd: secret  # MySQL Read-only Privileges mysql_ro_user_host: "%" mysql_ro_user_privileges: '*.*:SELECT' mysql_ro_user_pwd: secret  

mysql/задачи/main.yml

 ---  - name: Creating MySQL READ-ONLY Users ...  community.mysql.mysql_user:  # login_host: "{{ mysql_login_host }}"  login_port: "{{ mysql_login_port }}"  login_user: "{{ mysql_login_user }}"  login_password: "{{ mysql_login_pwd }}"  host: "{{ mysql_ro_user_host }}"  name: "{{ item }}"  password: "{{ mysql_ro_user_pwd }}"  priv: "{{ mysql_ro_user_privileges }}"  state: present  loop: "{{ mysql_ro_users }}"  - name: Creating MySQL ADMIN Users ...  community.mysql.mysql_user:  login_port: "{{ mysql_login_port }}"  login_user: "{{ mysql_login_user }}"  login_password: "{{ mysql_login_pwd }}"  host: "{{ mysql_admin_user_host }}"  name: "{{ item }}"  password: "{{ mysql_admin_user_pwd }}"  priv: "{{ mysql_admin_user_privileges }}"  state: present  loop: "{{ mysql_admin_users }}"  

var/main/mysql_users.yml

 ---  # MySQL READ ONLY Users mysql_ro_users:  - user1   # MySQL ADMIN Users mysql_admin_users:  - user2  

Я впервые пробую Ansible. Это мой код для создания пользователей на сервере mysql с all правами только для чтения ( select ). На самом деле я повторяю свой код в mysql_user_privileges.yml и tasks/main.yml . У меня есть небольшой опыт работы с Puppet, где мы можем использовать параметризованные классы и определять функции, чтобы минимизировать строку кода и повторение, но я не могу найти аналогичную вещь в Ansible. Может ли кто-нибудь переработать это в Ansible или направить меня в правильном направлении, пожалуйста?

Заранее спасибо!

Комментарии:

1. вы хотите написать только одну задачу для создания всех типов пользователей?

2. @Frenchy — Да, точно, со всеми необходимыми параметрами в задаче, передавая требуемые значения параметров, если не со значениями по умолчанию.

Ответ №1:

вы создаете параметр, который связан с типом пользователя:

 - name: Creating All type of Users ...  community.mysql.mysql_user:  login_port: "{{ mysql_login_port }}"  login_user: "{{ mysql_login_user }}"  login_password: "{{ mysql_login_pwd }}"  host: "{{ vars[item[0]   '_host'] }}"  name: "{{ item[1] }}"  password: "{{ vars[item[0]   '_pwd'] }}"  priv: "{{ vars[item[0]   '_privileges'] }}"  state: present  loop: "{{ users | flatten(levels=1) }}"   vars:  users:  - "{{ ['mysql_ro_user'] | product(mysql_ro_users) }}"  - "{{ ['mysql_admin_user'] | product(mysql_admin_users) }}"   

еще один способ написания задач:

 - name: Creating All type of Users ...  community.mysql.mysql_user:  # login_host: "{{ mysql_login_host }}"  login_port: "{{ mysql_login_port }}"  login_user: "{{ mysql_login_user }}"  login_password: "{{ mysql_login_pwd }}"  host: "{{ _host }}"  name: "{{ _name }}"  password: "{{ _pass }}"  priv: "{{ _priv }}"  state: present  loop: "{{ users | flatten(levels=1) }}"   vars:  users:  - "{{ ['mysql_ro_user'] | product(mysql_ro_users) }}"  - "{{ ['mysql_admin_user'] | product(mysql_admin_users) }}"   _host: "{{ vars[item[0]   '_host'] }}"  _pass: "{{ vars[item[0]   '_pwd'] }}"  _priv: "{{ vars[item[0]   '_privileges'] }}"  _name: "{{ item[1] }}"  

 _host: "{{ vars[item[0]   '_host'] }}"  

можно было бы написать

 _host: "{{ lookup('vars', item[0]   '_host') }}"  

и так далее….

Комментарии:

1. Сэр, понял. Большое вам спасибо!. Пожалуйста, отредактируйте другой способ задания, _pass заменив _pwd и удалив лишние [ элементы рядом в последней строке.

2. рад помочь..да, я исправил некоторые ошибки вставки, которые вы заметили