Запуск ansible c конфигом из папки со слишком широкими правами на запись

Дано: ansible запускается с виртуалки VirtualBox, файлы при этом лежат на windows хосте и примонтированы в виртуалку. При попытке запуска ansible-playbook получаем:

[WARNING]: Ansible is in a world writable directory (/media/D_DRIVE/work/ansible), ignoring it as an ansible.cfg source.

Обсуждение проблемы и workaround есть тут: https://github.com/ansible/ansible/issues/42388

Надо добавить путь к конфигу в переменные окружения. Я в виртуалке работаю один, ansible у меня там тоже один — поэтому добавил ее сразу в /etc/environment:

Идем в /etc/environment и дописываем туда путь к конфигу:

ANSIBLE_CONFIG=» /media/D_DRIVE/work/ansible/ansible.cfg»

Применяем оттуда переменные до перезагрузки:

for env in $( cat /etc/environment ); do export $(echo $env | sed -e ‘s/»//g’); done

Готово, ansible продолжает ругаться, но при этом работает

Фернан Бродель. Структуры повседневности: возможное и невозможное

Прочитал первый том труда Фернана Броделя «Материальная цивилизация, экономика и капитализм, XV–XVIII вв.» Очень много информации, очень цельную картина мира в итоге вырисовывается.

Основное понимание, полученное после прочтения — до чего же постоянен и очень медленно изменчив был мир до недавних пор.

Какими были индейские женщины Новой Испании во времена Кортеса в своих длинных, иногда вышитых хитонах из хлопка, а позднее — из шерсти, такими были они и в XVIII в. Мужской костюм, конечно, переменился, но лишь в той мере, в какой победители и их миссионеры требовали пристойного одеяния, скрывающего прежнюю наготу. Как были одеты туземцы в Перу в XVIII в., так же одеты они еще и сегодня: в пончо, квадратный кусок домотканого сукна из шерсти ламы с отверстием в центре, куда человек просовывает голову. Неподвижность царила и в Индии, притом всегда: сегодня, так же как вчера, как давным-давно, индиец одевается в дхоти. В Китае «деревенский люд и простонародье» всегда «изготовляли свою одежду из хлопчатой ткани… самых разнообразных цветов»; в реальности это была длинная рубаха, суженная в талии. 

Цитата про одежду, но в книге множество подобных примеров и про еду, и про строительство и дома и про крайне постепенное и очень медленное развитие технологии, часто встречающее сопростивление.

Далее отдельные запомнившиеся мысли или факты, которые я до этого не знал или что-то слышал, но не очень подробно и не осознавал их полностью.

==Равенство Китая и Европы==

Последние 5-6 веков население Китая и Европы примерно равны, таким образом географически Китай равен Европе в целом. Их суммарная доля в населении всего мира при этом составляла примерно 1/2 или 2/5 мирового.

==XIV век — лучший по уровню жизни==

После Черной смерти середины XIV в. и последовавших за нею и усугубивших ее ударов эпидемий наследства концентрируются в немногих руках. Возделанными остаются только хорошие земли (меньше хлопот и больше продуктивность), уровень жизни и реальная заработная плата выживших повышаются. Именно таким образом начинается в Лангедоке столетие 1350–1450 гг., когда крестьянин со своей патриархальной семьей будет хозяином пустой земли; лес и дикие звери заняли место некогда процветавших здесь деревень

==Ловля трески==

Крупномасштабный лов трески на ньюфаундлендских отмелях с конца XV в. стал настоящей революцией.

Это происходило и в Ла-Рошели на протяжении XVI и XVII вв. — веков процветания. Каждую весну туда заходили многочисленные парусные суда, часто в сотню тонн водоизмещением, потому что требовались довольно просторные трюмы: «Треска не так много весит, как требует много места». На борту находилось 20–25 человек, что указывает на важность рабочей силы при этой неблагодарной работе. Горожанин — судовой агент («bourgeois avitailleur») в кредит снабжал капитана мукой, инвентарем, напитками, солью в соответствии с условиями фрахтовых договоров («chartes-parties»), заверенных у нотариуса. Около Ла-Рошели один только небольшой порт Олонн снаряжал до сотни парусных судов и отправлял к противоположным берегам океана по нескольку тысяч человек ежегодно.
Рыболовные угодья были неистощимы: на большой ньюфаундлендской отмели, бескрайнем подводном плато, едва покрытом водой, у трески было «главное место сбора… Именно здесь она, так сказать, проводит свои праздники, и количество ее там таково, что рыбакам, что собираются там из разных стран, остается лишь с утра до вечера забрасывать лесы, вытаскивать, потрошить выловленную треску и насаживать ее внутренности на крючок, дабы поймать на них другую. Один-единственный человек иной раз берет их за день 300–400 штук.»

==Китайский средневековый флот==

Располагая с XIV в. «большими четырехпалубными джонками, разделенными на водонепроницаемые отсеки, оснащенными четырьмя–шестью мачтами, могущими нести 12 больших парусов, и с командой в тысячу человек», китайцы кажутся при ретроспективном взгляде не имевшими себе равных. При южных Сунах (1127–1279 гг.) они изгнали арабские суда с морских путей в Южно-Китайском море. В XV в. китайские эскадры совершают поразительные плавания под командованием великого евнуха Чжэн Хэ, мусульманина родом из Юньнани. Во время первой экспедиции (1405–1407 гг.) он с 62 крупными джонками дошел до Индонезии. Вторая (1408–1411 гг., 27 тыс. человек, 48 кораблей) завершилась покорением Цейлона, третья (1413–1417 гг.) — завоеванием Суматры, четвертая (1417–1419 гг.) и пятая (1421–1422 гг.) были мирными и закончились обменом дарами и послами. Четвертая достигла Индии, пятая — Аравии и Эфиопского побережья. В ходе быстро закончившегося шестого плавания было доставлено императорское послание правителю и господину Палембанга на Суматре. Последнее, седьмое и, может быть, самое сенсационное плавание началось из гавани Лунван в Нанкине 19 января 1431 г. Остаток этого года флот простоял в расположенных южнее портах Чжэцзяна и Фуцзяни; в 1432 г. путешествие было продолжено через Яву, Палембанг, Малаккский полуостров, остров Ланка и Каликут до Ормуза, который был целью экспедиции и где 17 января 1433 г. флот высадил китайского посла

==Удобство денег из трех металлов для экономики==

Запад сохранил три из них — золото, серебро и медь со всеми неудобствами и преимуществами такого разнообразия. Преимущества: оно отвечало различным потребностям размена; всякий металл с соответствовавшими ему монетами использовался для определенного круга операций. При системе, состоящей из одних золотых монет, было бы трудно оплачивать ничтожные повседневные покупки, а если бы речь шла о системе, ограниченной медью, возникали бы немалые неудобства при крупных платежах. Действительно, каждый металл играл свою собственную роль: золото предназначалось для государей, крупных купцов (даже церкви); серебро — для обычных операций; медь, как и полагается, — для самых низов: это были «черные» деньги простонародья и бедняков.

==Размеры городов==

Ришар Гаскон, имея в виду XVI в., считает, что «шестьсот дворов (т. е. в целом от 2 тыс. до 2500 жителей) были бы, несомненно, довольно удачной нижней границей». Я же думаю, что по крайней мере для XVI в. такая граница чересчур высока; возможно, на Р. Гаскона произвело чрезмерное впечатление сравнительное обилие городов, тяготевших к Лиону. Во всяком случае, в конце средних веков на всю Германию насчитывалось лишь 3 тыс. населенных мест, получивших права города. А ведь их население составляло в среднем 400 человек. То есть обычный порог городской жизни был для Франции, и вне сомнения для всего Запада (исключения лишь подтверждали правило), намного меньше населения Варзи. Так, например, в Шампани в Арси-сюр-Об, которому Франциск I в 1546 г. разрешил окружить себя стенами, — месте расположения соляных складов и центре архидиаконата, — в начале XVIII в. все еще насчитывалось только 228 дворов, т. е. 900 жителей. Шаурс, где были госпиталь и коллеж, в 1720 г. имел 227 дворов, Эруа — 265, Вандёвр-сюр-Барс — 316, Пон-сюр-Сен — 188.

Opendkim, query timed out и _внезапно_ DNSSEC

Столкнулся с тем, что встряла входящая почта. Приходить приходит, но вся застревает в maildrop. В postqueue -p — тысячи писем. Беглый анализ логов показал, что предположительный виновник opendkim:

Oct 15 09:55:01 postnew opendkim[31282]: 221D962914: key retrieval failed (s=20161025, d=youtube.com): ‘20161025._domainkey.youtube.com’ query timed out

А вот дальше начались долгие и тяжелые поиски причины, собственно завязка такая — opendkim выдает query timed out

~# opendkim-testkey -d youtube.com -s 20161025 -v -v -v
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key ‘20161025._domainkey.youtube.com’
opendkim-testkey: ‘20161025._domainkey.youtube.com’ query timed out

а dig — нет )

# dig 20161025._domainkey.youtube.com TXT

; <<>> DiG 9.10.3-P4-Ubuntu <<>> 20161025._domainkey.youtube.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44900
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;20161025._domainkey.youtube.com. IN TXT

;; ANSWER SECTION:
20161025._domainkey.youtube.com. 3599 IN TXT «k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0UfgFQF/Ms63E9cKpj+WdM5RepAYbfAT+h4iAzOb93Q7eVjNd0WabrALPs3qcUEKkrhpI1nlZtOofutG8l4VgslGn7+9ggc489LWyU+u674c3eRoErGOFRq0xV8xnG+Rf» «WKF+im0t4n/QGA2ZcdOIcIfevxyPHudcJipW0G8C6vMtBmQulAfN/SgE1/cugl6VBedZIYuynEF2ttqO9vDLy90/BctMBRJGyyj/CJR7gdLl655Y2+73BFvjhCIWroDrGa2io005Hh1nkReAY9Q2BPQ2K6O7TlIq3SGFVRuPIp0cszwwIjPTy3BP92X2NfiM4CZSPr9R02UfNyPYLQv4wIDAQAB»

;; Query time: 15 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Oct 15 11:01:48 GMT 2018
;; MSG SIZE rcvd: 475

Гугл говорит — ну так это дело ясное, opendkim ломится не на тот сервер — надо явно прописать Nameservers, прописываем:

Nameservers 8.8.8.8

Ноль эффекта. Пробуем 1.1.1.1 — так же ноль эффекта.

Подключаем тяжелую артиллерию:

tcpdump -i eth1 udp port 53 -n

Вау — запросы есть, и ответы приходят

11:05:45.772081 IP 144.76.68.186.30286 > 216.239.34.10.53: 37169% [1au] TXT? 20161025._domainkey.youtube.com. (60)
11:05:45.795999 IP 216.239.34.10.53 > 144.76.68.186.30286: 37169*- 1/0/0 TXT «k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0UfgFQF/Ms63E9cKpj+WdM5RepAYbfAT+h4iAzOb93Q7eVjNd0WabrALPs3qcUEKkrhpI1nlZtOofutG8l4VgslGn7+9ggc489LWyU+u674c3eRoErGOFRq0xV8xnG+Rf» «WKF+im0t4n/QGA2ZcdOIcIfevxyPHudcJipW0G8C6vMtBmQulAfN/SgE1/cugl6VBedZIYuynEF2ttqO9vDLy90/BctMBRJGyyj/CJR7gdLl655Y2+73BFvjhCIWroDrGa2io005Hh1nkReAY9Q2BPQ2K6O7TlIq3SGFVRuPIp0cszwwIjPTy3BP92X2NfiM4CZSPr9R02UfNyPYLQv4wIDAQAB» (464)
11:05:45.796262 IP 144.76.68.186.23689 > 192.112.36.4.53: 62833% [1au] DNSKEY? . (28)
11:05:45.821559 IP 192.112.36.4.53 > 144.76.68.186.23689: 62833*- 4/0/1 DNSKEY, DNSKEY, DNSKEY, RRSIG (1139)
11:05:45.821755 IP 144.76.68.186.63995 > 199.7.91.13.53: 33914% [1au] DNSKEY? . (28)
11:05:45.833611 IP 199.7.91.13.53 > 144.76.68.186.63995: 33914*- 4/0/1 DNSKEY, DNSKEY, DNSKEY, RRSIG (1139)
11:05:45.833814 IP 144.76.68.186.42019 > 202.12.27.33.53: 53753% [1au] DNSKEY? . (28)
11:05:45.848947 IP 202.12.27.33.53 > 144.76.68.186.42019: 53753*- 4/0/1 DNSKEY, DNSKEY, DNSKEY, RRSIG (1139)
11:05:45.849195 IP 144.76.68.186.9289 > 198.41.0.4.53: 19115% [1au] DNSKEY? . (28)
11:05:45.855702 IP 198.41.0.4.53 > 144.76.68.186.9289: 19115*- 4/0/1 DNSKEY, DNSKEY, DNSKEY, RRSIG (1139)
11:05:45.856003 IP 144.76.68.186.33889 > 193.0.14.129.53: 31594% [1au] DNSKEY? . (28)
11:05:45.861259 IP 193.0.14.129.53 > 144.76.68.186.33889: 31594*- 4/0/1 DNSKEY, DNSKEY, DNSKEY, RRSIG (1139)
11:05:45.861547 IP 144.76.68.186.36263 > 199.9.14.201.53: 50292% [1au] DNSKEY? . (28)
11:05:46.017319 IP 199.9.14.201.53 > 144.76.68.186.36263: 50292*- 4/0/1 DNSKEY, DNSKEY, DNSKEY, RRSIG (1139)

но opendkim упорно отвечает query timed out.
Единственное, что что за пачка DNSKEY в запросе?? Вспоминаем, что пару дней назад Эшер в телеграме писал про смену ключей DNSSEC https://t.me/usher2/444

Начинаем гуглить в эту сторону — ценнейшая статья от редхэта:
https://www.redhat.com/en/blog/what-you-need-know-about-first-ever-dnssec-root-key-rollover-october-11-2018

Ок, проверяем dnsmasq — нового ключа нет (но если виноват он — почему не работало при указании явно внешнего сервера в Nameservers). Обновляем — ключ приходит, эффекта нет.

Ищем, какой ключ таки использует opendkim, после некоторых поисков обнаруживаем, что этот:

# cat /usr/share/dns/root.key
. 172800 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0= ;{id = 19036 (ksk), size = 2048b} ;;state=2 [ VALID ] ;;count=0 ;;lastchange=1404118431 ;;Mon Jun 30 10:53:51 2014

Система обновлялась давно, нового ключа в списке нет.

Выясняем кто поставляет файл, и обновляем:

# dpkg -S /usr/share/dns/root.key
dns-root-data: /usr/share/dns/root.key

# apt-get install dns-root-data

И все тут же начинает работать:

# opendkim-testkey -d youtube.com -s 20161025 -v -v -v
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key ‘20161025._domainkey.youtube.com’
opendkim-testkey: key not secure
opendkim-testkey: key OK

Несколько фактов про Redis #painisinstructional

  1. Пустая строка — валидный ключ в редисе.
    redis.rpoplpush(list, processingList) когда processlingList — пустая строка успешно складывает данные в него.
  2. Имеем 3 сервера с автопереключением через Redis Sentinel. Из-за ошибки из пункта 1 на мастере переполняется память, но не слишком быстро — в итоге до падения по OOM не доходит, но памяти перестает хватать на bgsave. Мастер перестает обрабатывать запросы, т.к. отвалились слейвы и он не может сделать bgsave. Слейвы отваливаются, т.к. мастер не может сделать bgsave, но при этом считают его живым и не осуществляют переключение на себя.
    Единственный выход — вручную убить мастер, предварительно добавив памяти слейвам и исправив ошибку из п.1, чтобы все не началось заново.

Скорочтение и проговаривание про себя

Я одно время пытался заниматься скорочтением, но заметил, что понимание прочитанного очень сильно падает, а запоминание так и вовсе (при том, что у  меня в принципе весьма плохая память). Что я запомнил с того времени, как основную идею скорочтения — это идея избежать проговаривания слов про себя при чтении, как основной способ ускорения чтения.

 

Сегодня на Хабре в комментах к совсем нерелевантной статье наткнулся на интересную информацию о проговаривании при чтении:

https://habr.com/post/413819/#comment_18800343

 

Суть в том, что якобы нет исследований, подтверждающих, что полное подавление проговаривания при чтении в принципе возможно.

К сожалению дискуссия в комментах не отличается аргументированностью, пришлось искать самому и да, такое мнение присутствует как минимум в англоязычной википедии:

https://en.wikipedia.org/wiki/Subvocalization#Comparison_to_speed_reading

https://en.wikibooks.org/wiki/Speed_Reading/Subvocalization

(правда, насколько соответствует действительности или это просто чье-то мнение не очень понятно)

Given free will but within certain limitations…

В The New Yorker интересная (хотя и как обычно для ньюйоркера несколько затянутая) статья про философа Andy Clark и его рассуждениях о мышлении и работе мозга.

Статья содержит две интересные мысли, первая:

He believes that the mind extends into the world and is regularly entangled with a whole range of devices. But this isn’t really a factual claim; clearly, you can make a case either way. No, it’s more a way of thinking about what sort of creature a human is

…in fact, he thinks, we are all cyborgs, in the most natural way. Without the stimulus of the world, an infant could not learn to hear or see, and a brain develops and rewires itself in response to its environment throughout its life. Any human who uses language to think with has already incorporated an external device into his most intimate self, and the connections only proliferate from there.

Вторая идея судя по статье принадлежит не столько Энди Кларку, сколько Карлу Фристону (Karl Friston)

How does the brain cause an arm to move? It predicts that the arm is moving. Proprioceptive sensors issue frantic error signals to the muscle telling it that the arm is not moving; the muscle resolves this uncomfortable situation by causing the arm to move, thus rendering the brain’s prediction correct.

Мне как-то очень нравится эта идея, согласно которой мозг сначала «придумывает» мир, а потом тело старается сделать такие действия, чтобы устранить расхождения между придуманным миром и сигналами от органов чувств и реальном состоянии мира.

Единственная тонкость в этой красивой картине, что «brain» в этом предложении почти наверняка не «conscious brain», если вспомнить об исследованиях Бенджамина Либета, согласно которым электромагнитная активность в мозгу, соответствующая принятому решению, появляется и может быть зафиксирована до осознания этого решения.

Либет при этом считал, что за сознанием остается право вето. Но есть более крайняя точка зрения — Daniel Wegner (не знаю как его транлитерируют ) из его книги The Illusion of Conscious Will, что сознание может быть не только не источником принятого решения, но и более того не иметь никакого отношения к процессу его принятия и осуществления в жизнь, будучи просто фиксатором и интерпретатором происходящего вокруг него.

Веселая тогда получается картинка — «unconscious brain» придумывающий мир, который затем воплощается в реальность.

2 исследования о соцсетях и информационном пузыре

Мысль о том, что переход потребления информация в соцсети усиливает эффект информационного пузыря уже стала практически общим местом. Равно как и кажущийся очевидным из неё вывод, что с этим эффектом пузыря надо бороться.

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

Reducing controversy by connecting opposing views

Статья, повторюсь, интересная, но однако всё это исследование было основано на том, что верна сама идея, что если добавлять людям в ленту мнения с противоположной стороны политического спектра — это уменьшит поляризацию.

Тем интереснее оказалось сегодняшняя ссылка на другое исследование, опубликованная в N+1

https://nplus1.ru/news/2018/04/02/echo-chamber

Согласно ему, такое добавление ведет — та-дам — к прямо противоположному эффекту и такую поляризацию увеличивает 🙂

Performance monitoring metrics из XenServer в Zabbix

По работе оказалось необходимо передавать в заббикс для отслеживания метрики от XenServer, в частности среднюю загрузку процессора, чтобы можно было увидеть совпадают ли тормоза приложения с 100% загрузкой процессора всей машины. По метрикам собранным из виртуалок это однозначно никак не увидеть.

До этого эти метрики смотрели в XenCenter — но это неудобно, т.к. сложно соотносить с бизнес-метриками из заббикса (с средним временем обработки запросов к примеру).

Метрики доступны начиная с XenServer 6.1:
https://support.citrix.com/article/CTX135033

Для их использования существует тулза rrd2csv — но для целей передачи значения из неё в заббикс она обладает рядом недостатков:

  1. работает пока не прервут, выдавая метрики раз в заданное число секунд (по-умолчанию 5)
  2. выплевывает результат в формате csv
  3. работает только под root

Проблема 1 решается с помощью timeout.

Проблема 2 решается благодаря тому, что утилите можно передать в особом формате какие именно метрики хочется получить.
В итоге получается нечто такое:

# (timeout 1s rrd2csv AVERAGE:host::cpu_avg || true) | cut -f2 -d» » | tail -n 1

возвращает текущую среднюю загрузку процессора.

Для решения проблемы 3 — поставил получение этой метрики в крон с сохранением значения в файл:

 * * * * * (timeout 1s /opt/xensource/bin/rrd2csv AVERAGE:host::cpu_avg || true) | cut -f2 -d» » | tail -n 1 > /tmp/xencpu

а UserParameter в zabbix читает уж из него:

 UserParameter=xen.cpu,cat /tmp/xencpu

timeout и конвейеры в linux

При попытке использовать timeout вместе с конвейером в лоб получается не совсем то что хотелось:
# timeout 1s rrd2csv AVERAGE:host::cpu_avg | cut -f2 -d» » | tail -n 1
Terminated
Решение — поместить timeout в subshell и сделать результат выполнения успешным:
# (timeout 1s rrd2csv AVERAGE:host::cpu_avg || true) | cut -f2 -d» » | tail -n 1