Ansible, когда условие зарегистрировано из csv

#ansible #ansible-2.x #ansible-template

Вопрос:

Я использую csv-файл в качестве данных для моих учебников, но у меня возникли проблемы с моим состоянием «когда». либо обе задачи будут пропущены, либо обе задачи будут в порядке, моя цель-если ansible увидит строку в состоянии «когда», она будет пропущена для конкретного экземпляра.

вот мой сборник пьес

 - name: "Read ingest file from CSV return a list"  community.general.read_csv:  path: sample.csv  register: ingest  - name: debug ingest  debug:  msg: "{{ item.AWS_ACCOUNT }}"  with_items:  - "{{ ingest.list }}"  register: account  - name: debug account  debug:  msg: "{{ account.results | map(attribute='msg') }}"  register: accountlist  - name:  become: yes  become_user: awx  delegate_to: localhost  environment: "{{ proxy_env }}"  block:  - name: "Assume role"  community.aws.sts_assume_role:  role_arn: "{{ item.ROLE_ARN }}"  role_session_name: "pm"  with_items:  - "{{ ingest.list }}"  register: assumed_role  when: "'aws-account-rnd' not in account.results | map(attribute='msg')"  

вот содержимое файла sample.csv

ИМЯ ХОСТА Окружающая среда AWS_АККАУНТ РОЛЕВАЯ ИГРА
тест1 разработка aws-учетная запись-rnd arn:aws:iam::XXXX1
тест2 uat aws-учетная запись-uat arn:aws:iam::XXXX2

моя цель состоит в том, чтобы пропустить все элементы в csv-файле с помощью aws-acount-rnd

Ответ №1:

Ваше условие не упоминается item , поэтому оно будет иметь одинаковый результат для всех элементов цикла.

Ничто из того, что вы показали, не требует странного злоупотребления debug register , которое вы делаете, и это на самом деле мешает вам.

 - name: Read CSV file  community.general.read_csv:  path: sample.csv  register: ingest  - name: Assume role  community.aws.sts_assume_role:  role_arn: "{{ item.ROLE_ARN }}"  role_session_name: pm  delegate_to: localhost  become: true  become_user: awx  environment: "{{ proxy_env }}"  loop: "{{ ingest.list }}"  when: item.AWS_ACCOUNT != 'aws-account-rnd'  register: assumed_role  

Если вы всегда будете заботиться только об одном совпадении, вы также можете сделать это без цикла или условия вообще:

 - name: Assume role  community.aws.sts_assume_role:  role_arn: "{{ ingest.list | rejectattr('AWS_ACCOUNT', '==', 'aws-account-rnd') | map(attribute='ROLE_ARN') | first }}"  role_session_name: pm  delegate_to: localhost  become: true  become_user: awx  environment: "{{ proxy_env }}"  register: assumed_role  

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

1. как я могу вытащить когда, когда: пункт. AWS_ACCOUNT ! = условие «aws-аккаунт-rnd» для блока

2. Вы не можете зацикливаться на блоке, поэтому нет смысла помещать это условие в блок.

3. отмечено по этому поводу. Спасибо!

Ответ №2:

моя цель состоит в том, чтобы пропустить все элементы в csv-файле с помощью aws-acount-rnd

Множественное число debug , с которым вы имеете дело register , кажется многословным подходом ИМХО.

Простая задача для debug роли ARN, только если учетная запись не соответствует aws-acount-rnd .

 - name: show ROLE_ARN when account not equals aws-account-rnd  debug:  var: item['ROLE_ARN']  loop: "{{ ingest.list }}"  when: item['AWS_ACCOUNT'] != 'aws-account-rnd'  

Это приводит к:

 TASK [show ROLE_ARN when account not equals aws-account-rnd] ********************************************************************************************************************** skipping: [localhost] =gt; (item={'HOSTNAME': 'test1', 'ENVIRONMENT': 'dev', 'AWS_ACCOUNT': 'aws-account-rnd', 'ROLE_ARN': 'arn:aws:iam:XXXX1'}) ok: [localhost] =gt; (item={'HOSTNAME': 'test2', 'ENVIRONMENT': 'uat', 'AWS_ACCOUNT': 'aws-account-uat', 'ROLE_ARN': 'arn:aws:iam:XXXX2'}) =gt; {  "ansible_loop_var": "item",  "item": {  "AWS_ACCOUNT": "aws-account-uat",  "ENVIRONMENT": "uat",  "HOSTNAME": "test2",  "ROLE_ARN": "arn:aws:iam:XXXX2"  },  "item['ROLE_ARN']": "arn:aws:iam:XXXX2" }  

Та же логика может быть использована для передачи item.ROLE_ARN community.aws.sts_assume_role задачи to.