#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.